Java知識點彙總
1.數據類型
1.1裝箱和拆箱問題
1.2 緩存池
從深入理解Java虛擬機一書來說,是不存在這個說法的。從大部分百度而來的結果,就是說如下:
123,這個數字存在哪裏? 這個從JVM來說,它是存在常量池中的。
按照緩存池的說法,int的緩存範圍是-128~127,那我們用220來測試下結果。
private void cachePool(){ Integer a = Integer.valueOf(220); Integer b = Integer.valueOf(220); AppLog.i(String.valueOf(a == b)); Integer c = Integer.valueOf(123); Integer d = Integer.valueOf(123); AppLog.i(String.valueOf(c == d)); Integer e = 220; Integer f = 220; AppLog.i(String.valueOf(e == f)); Integer g = 123; Integer h = 123; AppLog.i(String.valueOf(g == h)); }
結果是false,true,false,true。
這裏的理解是有誤的。首先常量池存的是字符串,比如“abc”,abc存在常量池裏面。s = "abc",這個時候,s並不在常量池。
在會過來說緩存池。在java中,當int的範圍是【-128,127】時,JVM事先把這個範圍內的數值,先存放在堆裏面。所以對123的使用,緩存池的地址。
基本類型對應的緩衝池如下:
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
-
char in the range \u0000 to \u007F
1.3 常量池
常量池只要針對字符串常量,這個上文有說到,字符串會在使用的時候,存放到常量池中。
String s1 = "abc"; String s2 = "abc"; AppLog.i(String.valueOf(s1 == s2));
結果是true,更進一步,把s2換成“abc”,還是true。也就是s1和s2都是常量池一個地址的引用。
1.4 String
最重要的是不可變性:
String 由final char[]value,由於final修飾,所以value不能指向其他數組,並且string內部沒有修改value的方法,所以String是不可修改的。
hashcode可以緩存,應爲不變。
StringPool機制,這個就是上面說的常量池。
String是線程安全的。
StringBuild不是線程安全
StringBuffer線程安全,內部有synchronized
String.intern(),這個方法會主動把字符串放入常量池。
1.5 精度問題
Java 不能隱式執行向下轉型,因爲這會使得精度降低。
short s = 1; /*1是int類型,所以+以後轉換爲int類型,強轉爲short型*/ s = (short) (s+1); /*支持隱私轉換*/ s +=1;
1.6 static
1.6.1 static 變量
其他從JVM角度來講,static的變量和類沒有關係,類的實例是在java heap裏面new出來的。而static 變量存在於方法區。類名只是爲了找到這個全局變量的位置而已。(C++的說法,全局變量,功能類似)
1.6.2 static方法
靜態方法也是獨立於類的存在,所以靜態方法必須實現。存在於JVM的方法區。
1.6.3 static代碼塊
- 首先這部分代碼,只有在類使用的時候,纔會被加載。
- 其次,它只會運行一次,或者說在類加載的時候,被運行。而不是new一個類的時候,所以它比new 更早。
-
構造代碼塊,也就是沒有static,這個很顯然,是在每次構造的時候調用。其次,每次都會調用。可以理解爲是構造函數的一部分。
1.6.4 static內部類
從JVM的角度看,只是一個命名方式而已,跟外部類,是完全不想幹的2個類。