1. 程式人生 > 實用技巧 >Java的一些細節語法(不定時更新。。。)

Java的一些細節語法(不定時更新。。。)

目錄

    1. ConcurrentHashMap不允許key為null,但是HashMap是可以的。TreeMap key不支援null。

    2. 以下程式碼裡面,請注意:

      Integer a = 150;
      Integer b = 150;
      Integer c = 100;
      Integer d = 100;
      Integer e = new Integer(100);
      System.out.println(a == b); //false
      System.out.println(a == 150); //true  這種是真正的在對比值的大小
      System.out.println(c == d); //true
      System.out.println(c == e); //false
      
    3. Process類有輸出流,輸入流,錯誤流。

    4. 關於nio裡面Bufferduplicate方法:

      ByteBuffer buf = ByteBuffer.allocate(100);
      /**
               * duplicate函式的官方註釋,並不是真正的複製。
               * Creates a new byte buffer that shares this buffer's content.
               *
               * <p> The content of the new buffer will be that of this buffer.  Changes
               * to this buffer's content will be visible in the new buffer, and vice
               * versa; the two buffers' position, limit, and mark values will be
               * independent.
               * */
      ByteBuffer buf2 = buf.duplicate();
      
    5. Java Stream的資料來源有容器,陣列和I/O,Stream的中間操作(intermediate function)並不會直接執行,只有遇到終端操作(terminal function)才會開始執行。

    6. 在Java裡面, count = count++,會導致count++沒有效果,這個從位元組碼層面是可以解釋的。

               0: iconst_0
               1: istore_1    // 將0存入到引數1的位置
               2: iload_1     //將引數1的位置,也就是0,讀取到運算元棧
               3: iinc          1, 1   //給引數1的位置的引數直接+1
               6: istore_1            //將運算元棧頂,也就是0,儲存在引數1的位置
               7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
              10: iload_1  //將引數1的位置,也就是0,讀取到運算元棧
              11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
              14: return
      

      相對的,count = ++count的位元組碼如下:

               0: iconst_0
               1: istore_1    // 將0存入到引數1的位置
               2: iinc          1, 1   // 將引數1的位置,也就是0,直接+1,
               5: iload_1     // 讀取引數1的位置,也就是1,放在運算元棧
               6: istore_1    // 將運算元棧頂的值,也就是1,儲存在引數1的位置
               7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
              10: iload_1     // 將引數1的位置,也就是1,讀取到運算元1棧
              11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
              14: return
      
      

      注意觀察兩段程式碼iinc前後的區別。

    7. Java的棧幀包括:區域性變量表,運算元,動態連結,方法返回地址(注意,不包含本地方法棧)

    8. 通過DataSource物件訪問的驅動程式本身不會向DriverManager註冊,且其物件屬性是可以進行更改的,如果伺服器配置發生了變化,可以通過更新DataSource來進行對應的適配。