string s1 =
"1";
//字串物件:3153
string s2 =
"2";
string s3 =
"3";
string s4 =
"4";
string s5 =
"5";
string s6 =
"6";
string s11 =
"1";
//字串物件:3159
string s21 =
"2";
string s31 =
"3";
string s41 =
"4";
string s51 =
"5";
string s61 =
"6";
//字串物件:3159
//在堆中建立乙個string物件
string s =
newstring
("a")+
newstring
("b");
//將此string物件中的值嘗試放入stringtable,並將串池中的物件返回,
string s1 = s.
intern()
;system.out.
println
(s1 ==
"ab");
// true
system.out.
println
(s ==
"ab");
// true
注意:當串池中沒有intern
嘗試放入的字串時,會將字串放入串池,此時s
也變為了串池中的物件
在1.6中會將s
複製乙份放入串池中,並不會改變s
的位置
//在串池中新增"ab"
string x =
"ab"
;//在堆中建立乙個string物件
string s =
newstring
("a")+
newstring
("b");
//將此string物件中的值嘗試放入stringtable,並將串池中的物件返回(並沒有成功放入)
system.out.
println
(s1 == x)
;// true
system.out.
println
(s == x)
;// false
注意:當串池中已經存在intern
嘗試放入的字串時,則不會將字串放入串池,此時s
還是堆中的物件,所以s
不等於x
public
static
void
main
(string[
] args)
line.
intern()
;}system.out.
println
("cost:"
+(system.
nanotime()
- start)
/1000000);
}catch
(filenotfoundexception e)
catch
(ioexception e)
}
stringtablesize
time
128172 ms
1024
116 ms
4096
87 ms
入池去重,以及對效能的優化
public
static
void
main
(string[
] args)
//不入池
list.
add(line)
;//入池
} system.out.
println
("cost:"
+(system.
nanotime()
- start)
/1000000);
} system.in.
read()
;}catch
(filenotfoundexception e)
catch
(ioexception e)
}
string
物件大小從6m
降到500k
,byte陣列從16m
降到1m
詳解JVM 中的StringTable
字串常量池是 jvm中的乙個重要結構,用於儲存jvm執行時產生的字串。在jdk7之前在方法區中,儲存的是字串常量。而字串常量池在 jdk7開始移入堆中,隨之而來的是除了儲存字串常量外,還可以儲存字串引用 因為在堆中,引用堆中的字串常量很方便,所以可以儲存引用 這使得很多字串的操作在 jdk7中和在之...
StringTable效能調優
如果專案中有很多常量或者字串,適當調整引數 調整 xx stringtablesize 桶個數 如 xx stringtablesize 1009 如果存在堆中的字串比較多,且有很多重複的資料,那麼可以使用intern 減少記憶體占用。演示 intern 減少記憶體占用 xx stringtable...
利用stringtable 實現多語言
在 資源檢視 stringtable 下 右鍵 stringtable 插入副本 彈出對話方塊 選擇語言 如 英語 美國 確定 會新增加了乙個stringtable 然後在 新增 if getacp 936 如果判斷當前系統不是中文系統用下列函式將英文本串表設為使用字串表 setthreaduila...