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個類。

相關文章