想必大家在熟悉不過了,不錯今天就遇到了這個萬年坑,哪怕喜歡翻源碼的人,也不屑一顧翻它的源碼,良言相勸最好翻下源碼。 1. String為啥被定義為final ? 2. String是線程安全的麽 ? 3. String的設計思想是什麼 ? 4. 偏移量是什麼 ? 在不看下麵解釋的時候自己想想,是不是 ...
想必大家在熟悉不過了,不錯今天就遇到了這個萬年坑,哪怕喜歡翻源碼的人,也不屑一顧翻它的源碼,良言相勸最好翻下源碼。
1. String為啥被定義為final ?
2. String是線程安全的麽 ?
3. String的設計思想是什麼 ?
4. 偏移量是什麼 ?
在不看下麵解釋的時候自己想想,是不是真的瞭解,每天都能遇見的String這個對象 ???
先說String是線程安全的麽?
答:是線程安全的,都定義final(不可變)了,這都不安全什麼才算安全,必須要看到 synchronized ?
再說String為啥被定義為final?
答:因為這樣有助於共用,提高性能,可以將字元串對象保存在字元串常量池中以供與字面值相同字元串對象共用。如果String對象是可變的,那就不能這樣共用,因為一旦對某一個String類型變數引用的對象值改變,將同時改變一起共用字元串對象的其他 String類型變數所引用的對象的值。String本質是個char數組. final修飾的欄位創建以後就不可改變,String設成final禁止繼承,避免被其它類繼承後破壞。
/** The value is used for character storage. */ private final char value[];
String的設計思想是什麼?
答:java程式語言的許多特性依賴於不可變的String對象,若String允許被繼承, 由於它的高度被使用率, 可能會降低程式的性能
偏移量是什麼?
答:就是在數組中(int[] ary={1,2,3})。變數名(ary)保存的是數組的首地址,數組實際的記憶體是一塊連續的記憶體區域。所以ary[i]就是相對數組首地址的便宜量,即就是根據首地址和偏移量([i])就可以知道偏移後的地址,這也是為什麼在java中你可以用ary[i]訪問元素的根本原因。