《Java 編程思想》004 switch對字符串支持的引申思考

與您共讀《Java 編程思想》 Page38~75

第三四章是關於Java操作符和控制流程的講解,有語言基礎無壓力,可快速瀏覽。

《Java編程思想》是基於Java SE5,在此補充Java7的7個新特性:
1. 對集合類的語言支持;
2. 自動資源管理;
3. 改進的通用實例創建類型推斷;
4. 數字字面量下劃線支持
5. switch中使用string
6. 二進制字面量
7. 簡化可變參數方法調用。

可以瞭解一下Java7中的switch支持String的實現細節及編譯工具gd-gui。 實質上還是通過String的hashCode方法將字符串轉化爲數字。並配合equals方法進行判斷。通過hashCode方法判斷後仍要用equals方法進行判斷,hashCode相同的字符串不一定是同一字符串。

1. Java數組的最大長度

Java 中數組length屬性是32位的有符號整數,它的最大值是2的31次冪,就是2G。

由此想到了String,底層也是基於數組的,是一個字符數組。字符是16位的基本類型,一個String的最大長度是多少呢?就是字符數組的最大長度也是2G,佔用內存是4GB。

數組具體的實現帶來的限制。這會使得實際的JVM不一定能支持上面說的理論上的最大length。
例如說如果有JVM使用uint32_t來記錄對象大小的話,那可以允許的最大的數組長度(按元素的個數計算)就會是:
(uint32_t的最大值 - 數組對象的對象頭大小) / 數組元素大小
於是對於元素類型不同的數組,實際能創建的數組的最大length也會不同。
JVM實現裏可以有許多類似的例子會影響實際能創建的數組大小。

2. 爲什麼hashCode是int

int長度爲32位的有符號整數,對於實際的內存大小足夠用。

3. euqals方法的作用

hashCode方法和equals方法是java.lang.Object類中有兩個非常重要的方法。equals()方法是用來判斷其他的對象是否和該對象相等,對兩個對象的地址值進行的比較,即比較地址是否相同。但是很多類覆蓋了equals方法,如String。equals方法具有自反性(reflexive)、對稱性(symmetric)、傳遞性(transitive)、一致性(consistent)。

4 hashCode方法的作用

大量對象比較時,使用預存的hashCode值比較提升效率。

5. String HashCode

s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
將上次一算出的hash值乘以31 然後再加上當前字符編碼值,由於這裏使用的是int肯定會有一個上限,當字符長時產生的數值過大int放不下時會進行截取,一旦截取HashCode的正確性就無法保證了,所以這點可以推斷出HashCode存在不相同字符擁有相同HashCode。

就延伸到這裏了後續問題繼續閱讀《Java 編程思想》。

參考 推薦閱讀:
淺談Java中的hashcode方法
java數組的最大長度是多少?
字符串不相同出現相同HashCode
Java的hashCode相同的字符串
Java提高篇——equals()與hashCode()方法詳解

發佈了39 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章