JAVA性能の優れた調整-文字列性能の最適化

1401 ワード

1.文字列の3つの異なる作成方法:
String str1= "abc"; 
abcは文字列定数プールに直接保存されます。
String str2= new String("abc"); 
newオブジェクトで文字列オブジェクトを作成し、参照アドレスをヒープメモリに保存します。abcは文字列定数プールに保存されます。
String str3= str2.intern();
internメソッドの役割は、常量池に行って、str 2に対応する文字列オブジェクトを探し、ある場合は参照を返し、ない場合は文字列オブジェクトを作成します。
2.Stringオブジェクト最適化:
2.1ありふれた文字列のつなぎ合わせ問題
String str = "abcdef";
for (int i = 0; i < 1000; i++) {
	str = str + i;
}
for (int i = 0; i < 1000; i++) {
	str = (new StringBuilder(String.valueOf(str))).append(i).toString();
}
最初のforサイクルは次のオブジェクトを作成します。2番目のforサイクルはコンパイラの最適化後のスプライスです。
2.2 String.internを使ってメモリを節約する
String a =new String("abc").intern(); 
String b = new String("abc").intern(); 
if(a==b) { 
	System.out.print("a==b"); 
}
出力a==bがa変数を作成する時、スタックメモリにオブジェクトを作成し、internメソッドを呼び出して定数プールにabcオブジェクトを探していますが、作成されていないことが分かりました。参照作成b変数を返した場合、スタックメモリにオブジェクトを作成し、internメソッドを呼び出してabcペアを探します。直接参照に戻ります。
3.使用シーン:
A.String str= "abcdef"; 
B.String str= new String("abcdef"); 
C.String str= new String("abcdef").intern();
局部変数と定数を作成する時、私達は普通Aのこのような方式を使います。文字列を区別して2つの異なるオブジェクトを作成して使用する場合、Bを選択します。internは一般的に使われているものが少ないです。例えば、私たちは普段、同じ文字列のオブジェクトをたくさん作っています。対象はメモリに保存されます。intern法を使って、重複したオブジェクトのメモリ空間占有を減らすことが考えられます。