回覆列表
  • 1 # 小紅的甜心

    一 基本資料型別

    資料型別在計算機語言裡面,是對記憶體位置的一個抽象表達方式,可以理解為針對記憶體的一種抽象的表達方式。基本型別:簡單資料型別是不能簡化的、內建的資料型別、由程式語言本身定義,它表示了真實的數字、字元和整數。在java中基本資料型別一共有8種,包括

    byte:Java中最小的資料型別,在記憶體中佔8位(bit),即1個位元組,取值範圍-128~127,預設值0;

    short:短整型,在記憶體中佔16位,即2個位元組,取值範圍-32768~32717,預設值0;

    int:整型,用於儲存整數,在內在中佔32位,即4個位元組,取值範圍-2147483648~2147483647,預設值0;

    long:長整型,在記憶體中佔64位,即8個位元組-2^63~2^63-1,預設值0L;

    float:浮點型,在記憶體中佔32位,即4個位元組,用於儲存帶小數點的數字(與double的區別在於float型別有效小數點只有6~7位),預設值0;

    double:雙精度浮點型,用於儲存帶有小數點的數字,在記憶體中佔64位,即8個位元組,預設值0;

    char:字元型,用於儲存單個字元,佔16位,即2個位元組,取值範圍0~65535,預設值為空;

    boolean:布林型別,佔1個位元組,用於判斷真或假(僅有兩個值,即true、false),預設值false;

    二 引用資料型別

    引用資料型別:Java語言本身不支援C++中的結構(struct)或聯合(union)資料型別,它的複合資料型別一般都是透過類或介面進行構造,類提供了捆綁資料和方法的方式,同時可以針對程式外部進行資訊隱藏。引用資料型別分3種:類,介面,陣列;

    三 資料型別與記憶體的關係

    java把記憶體分為兩種,一種是堆記憶體,一種是棧記憶體。

    基本型別型別以及物件的引用變數是儲存在棧記憶體中,當在一段程式碼塊中定義一個變數時,java就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,java會自動釋放掉為該變數分配的記憶體空間,該記憶體空間可以立刻被另作他用。

    而物件本身的值或者說new建立的物件和陣列是儲存在堆記憶體中。在堆中分配的記憶體,由java虛擬機器自動垃圾回收器來管理。在堆中產生了一個數組或者物件後,還可以在棧中定義一個特殊的變數(物件的引用變數),這個變數的取值等於陣列或者物件在堆記憶體中的首地址,在棧中的這個特殊的變數就變成了陣列或者物件的引用變數,以後就可以在程式中使用棧記憶體中的引用變數來訪問堆中的陣列或者物件,引用變數相當於為陣列或者物件起的一個別名,或者代號。

    陣列和物件在沒有引用變數指向它的時候,才變成垃圾,不能再被使用,但是仍然佔著記憶體,在隨後的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較佔記憶體的主要原因,實際上,棧中的變數指向堆記憶體中的變數,這就是 Java 中的指標!

    找了一個圖,可以更形象的描述它們之間的關係。

    四 java中記憶體分配策略

    按照編譯原理的觀點,程式執行時的記憶體分配有三種策略:靜態的,棧式的,堆式的。

    靜態儲存分配是指在編譯時就能確定每個資料目標在執行時刻的儲存空間需求,因而在編譯時就可以給他們分配特定的儲存空間。靜態儲存分配要求程式中不允許有可變資料結構的存在(比如陣列,連結串列),也不允許有巢狀或者遞迴的結構出現,因為它們會導致編譯程式無法計算準確的儲存空間需求。

    棧式分配(動態儲存分配)是由一個類似於堆疊的執行棧來實現的。在棧式儲存方案中,程式對資料區的需求在編譯時是完全未知的,只有到執行的時候才能夠知道,但是規定在執行中進入一個程式模組時,必須知道該程式模組所需的資料區大小才能夠為其分配記憶體.和我們在資料結構所熟知的棧一樣,棧式儲存分配按照先進後出的原則進行分配。

    靜態儲存分配要求在編譯時能知道所有變數的儲存要求,棧式儲存分配要求在過程的入口處必須知道所有的儲存要求,而堆式儲存分配則專門負責在編譯時或執行時模組入口處都無法確定儲存要求的資料結構的記憶體分配,比如可變長度串和物件例項.堆由大片的可利用塊或空閒塊組成,堆中的記憶體可以按照任意順序分配和釋放.

    五 java中的堆和棧

    棧與堆都是Java用來在Ram中存放資料的地方。與C++不同,Java自動管理棧和堆,程式設計師不能直接地設定棧或堆。

    Java的堆是一個執行時資料區,類的(物件從中分配空間。這些物件透過new、newarray、anewarray和multianewarray等指令建立,它們不需要程式程式碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配記憶體大小,生存期也不必事先告訴編譯器,因為它是在執行時動態分配記憶體的,Java的垃圾收集器會自動收走這些不再使用的資料。但缺點是,由於要在執行時動態分配記憶體,存取速度較慢。

    棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本型別的變數(,int, short, long, byte, float, double, boolean, char)和物件控制代碼。

  • 中秋節和大豐收的關聯?
  • 有人說現代詩歌現在已經式微了,對此你怎麼看?會有新形式出現嗎?