文字列バッファ

3009 ワード

文字列バッファに関する議論が表示されます
(回転)
まず奇妙なプログラムを見てみましょう
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
}
}
このプログラムは本当に簡単ですね.しかし、何か問題がありますか.
1.Stringからの懸念
上のプログラムには、いったい何人のオブジェクトがありますか?
多くの人が口にしたかもしれません:2つ、s 1とs 2
どうして?
Stringはfinalクラスで、その値は可変ではありません.
理にかなっているように見えるので、チェックしてみましょう.少しプログラムを変更してください.
結果が表示されます.
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
ほほほ、多くの人はすでに2つの相手だけではないと言います
プログラムをコンパイルして実行し、出力:s 1==s 2
ああ!
どうしてs 1==s 2なの?
==明らかに、s 1とs 2は同じStringオブジェクト--「Monday」を参照している!
2.千変万化のString
もう少しプログラムを変更すると、もっと奇妙な発見があります.
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
}
}
s 2をnewオペレータで作成します
プログラム出力:
s1 != s2
s1 equals s2
うん、明らかに?
s 1 s 2はそれぞれ2つの「Monday」Stringオブジェクトを参照している
しかし、なぜ2つのプログラムが違うのでしょうか.
3.Stringのプールで泳ぐ
ははは、本をめくってやっと答えを見つけた.
元は、プログラムが実行されると文字列バッファが作成されます.
s 2=「Monday」という表現を用いて文字列を作成する場合、プログラムはまず
このStringバッファで同じ値のオブジェクトを探し、最初のプログラムではs 1が先に
プールに入れたので、s 2が作成されると、プログラムは同じ値のs 1を見つけました.
s 2をs 1が参照するオブジェクト「Monday」を参照
2段目のプログラムでは、newオペレータを使用して、彼はプログラムに理解しています.
「新しいのがほしい!古いのは要らない!」新しい「Monday」スティングオブジェクトが作成されました
メモリに作成します.彼らの値は同じですが、位置が異なり、プールで泳いでいます.
一人は岸辺で休んでいる.いや、資源の浪費だ.同じなのに分けて何をしなければならないのか.
4.ダイビングを続ける
プログラムの再変更:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
s2 = s2.intern();
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
}
}
今回加入:s 2=s 2.intern();
補足:
  intern  ,  String  (  equals(Object)  ), 。 ,  String  ,  String  。  intern 。

わあ!プログラム出力:
s1 == s2
s1 equals s2
もとは、プログラムはs 2を新しく作った後に、またintern()で彼を池の中でひっくり返しました
ははは、今回s 2とs 1は同じ対象を引用しました
メモリの消費量を削減
5.==equals()との争い
Stringはオブジェクトです.2つの異なるStringオブジェクトの値が同じかどうかを比較します.
明らかにequals()という方法を用いる
しかし、プログラムにそんなに多くのStringオブジェクトがあれば、equalsを何度も使います.
ああ、なんてことだ.遅いね.
より良い方法:
すべてのStringをintern()バッファに行きましょう
newを使うときにこの操作をしたほうがいいです.
String s2 = new String("Monday").intern();
これでみんな池に浸かっていました.