越深入java 就覺得java做得越爛,java設計問題 之 : JVM緩字符串常量
在前面三貼中,我提到過
1 Object 要用8byte指針內存
see (http://topic.csdn.net/u/20081202/14/e93bd51a-a222-4e00-a7a5-5c6f07e7ed52.html)
2 Long a = 2l;
Long b = 2l;
//結果爲ture
System.out.println(a == b);
Long c = 128l;
Long d = 128l;
//結果爲false
System.out.println(c == d);
see (http://topic.csdn.net/u/20081119/12/b3c447ef-6665-4225-8d36-60e211663bb3.html)
3 JVM會把系統裏的字符串常量,緩存到JVM中(在java中如果你定義N多個字符變量,值是一樣的,實際在JVM中只有一份)
上面3個問題合起來可以說明一個問題:
java對基礎數據的cache封裝方案是不正確的,應當只能算是曲線救國,解決不了根本問題。
因原很簡單:java應當cache 字符,而不是這符串String,
最好的選擇是:cache utf-16le(java用的內部字符編碼),而java確不是這樣做的。
導致的問題:a)符串String 常量是無法確定的,如果在一個系統中使用過多的常量,會讓內存漲破。
b)不能在for等語句中使用String,這樣容易讓內存out,系統玩完,(往往剛學的新手不知道)。
c)逼得大家選擇Stringbuffer類來操作可變String,很不方便。
問題核心提示:java 不cache utf-16le的願因 是代價比cache String要高。爲什麼要高呢? 請詳細瞭解 三個問題就可以回答
1 Object 要用8byte指針內存
see (http://topic.csdn.net/u/20081202/14/e93bd51a-a222-4e00-a7a5-5c6f07e7ed52.html)
2 Long a = 2l;
Long b = 2l;
//結果爲ture
System.out.println(a == b);
Long c = 128l;
Long d = 128l;
//結果爲false
System.out.println(c == d);
see (http://topic.csdn.net/u/20081119/12/b3c447ef-6665-4225-8d36-60e211663bb3.html)
3 JVM會把系統裏的字符串常量,緩存到JVM中(在java中如果你定義N多個字符變量,值是一樣的,實際在JVM中只有一份)
上面3個問題合起來可以說明一個問題:
java對基礎數據的cache封裝方案是不正確的,應當只能算是曲線救國,解決不了根本問題。
因原很簡單:java應當cache 字符,而不是這符串String,
最好的選擇是:cache utf-16le(java用的內部字符編碼),而java確不是這樣做的。
導致的問題:a)符串String 常量是無法確定的,如果在一個系統中使用過多的常量,會讓內存漲破。
b)不能在for等語句中使用String,這樣容易讓內存out,系統玩完,(往往剛學的新手不知道)。
c)逼得大家選擇Stringbuffer類來操作可變String,很不方便。
問題核心提示:java 不cache utf-16le的願因 是代價比cache String要高。爲什麼要高呢? 請詳細瞭解 三個問題就可以回答
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.