2018.3.1學習心得

介紹完了對象數據類型,今天開始學習直接量和運算符。

先來是直接量

直接量是指在程序中直接通過源代碼的方式指定的值,有時也成爲字面量。

在 Java 中可以定義的直接量包含:基本數據類型(num)、字符串類型(string)、null。

這裏提到一個內存的知識點。

棧內存是指向堆內存。

總的來說,棧內存是來存儲數據引用的。堆內存是存儲目標數據的。另外還有常量池,常量池的數據是編譯器就被確定下來,後期拿來可以直接使用。

我在CSDN的網站中找到相關一些關於棧內存,對內存,常量池的片段。

1:棧

   在函數中定義的一些基本類型的變量數據和對象的引用變量都在函數的棧內存中分配。  

   當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當該變量退出該作用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間可以立即被另作他用。

   每個線程包含一個棧區,每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。棧分爲3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。

2:堆

   堆內存用來存放由new創建的對象和數組。 在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或對象後,在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。  引用變量就相當於是爲數組或對象起的一個名稱,以後就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象。引用變量就相當於是爲數組或者對象起的一個名稱。引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外後被釋放。而數組和對象本身在堆中分配,即使程序運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身佔據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變爲垃圾,不能在被使用,但仍然佔據內存空間不放,在隨後的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是java比較佔內存的原因。實際上,棧中的變量指向堆內存中的變量,這就是java中的指針! 

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

   jvm只有一個堆區(heap)被所有線程共享。

3、方法區(method area)

   方法區跟堆一樣,被所有的線程共享。用於存儲虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。

4、常量池(constant pool)

   常量池指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。除了包含代碼中所定義的各種基本類型(如int、long等等)和對象型(如String及數組)的常量值(final)還包含一些以文本形式出現的符號引用,比如:類和接口的全限定名; 字段的名稱和描述符; 方法和名稱和描述符。虛擬機必須爲每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(string,integer和floating point常量)和對其他類型,字段和方法的符號引用。對於String常量,它的值是在常量池中的。而JVM中的常量池在內存當中是以表的形式存在的,對於String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字符串值,注意:該表只存儲文字字符串值,不存儲符號引用。說到這裏,對常量池中的字符串值的存儲位置應該有一個比較明瞭的理解了。在程序執行的時候,常量池會儲存在方法區(Method Area),而不是堆中。


   棧的優勢是,存取速度比堆要快,僅次於寄存器,棧數據可以共享(指的是線程共享,而給進程共享)。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量數據(int, short, long, byte, float, double, boolean, char)和對象句柄(引用)。

關於 String 類的特殊說明

String 類是一個不可改變類,意思就是在String 對象被創建出來後就不能被改變了。當程序第一次使用某個字符串直接量時,Java 會使用常量池來緩存該字符串直接量。如果後面程序用到了這個字符串直接量,Java 會直接引用常量池字符串。

在常量池中不會存在兩個一樣的字符串字面量值。

接下來Eclipse來簡單的寫一下關於這些內容的代碼。


 下面一個知識點是運算符。

在JS裏面學過 + - > < == += -=



用eclipse體現出來


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章