Java的一些細節語法(不定時更新。。。)
阿新 • • 發佈:2020-08-03
目錄
-
ConcurrentHashMap
不允許key為null,但是HashMap
是可以的。TreeMap
key不支援null。 -
以下程式碼裡面,請注意:
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
-
Process
類有輸出流,輸入流,錯誤流。 -
關於nio裡面
Buffer
的duplicate
方法: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();
-
Java Stream
的資料來源有容器,陣列和I/O,Stream的中間操作(intermediate function)
並不會直接執行,只有遇到終端操作(terminal function)
才會開始執行。 -
在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
前後的區別。 -
Java的棧幀包括:區域性變量表,運算元,動態連結,方法返回地址(注意,不包含本地方法棧)
-
通過
DataSource
物件訪問的驅動程式本身不會向DriverManager
註冊,且其物件屬性是可以進行更改的,如果伺服器配置發生了變化,可以通過更新DataSource
來進行對應的適配。