JAvaベースString
これはThe Java Language Specificationの3.10.5節の例で、上記の説明がありますが、これは理解に難くないはずです
出力結果はtrue true true true false trueです.自分で分析してください.
その結果、上記の分析をまとめると、1.単独で「」引用符で作成した文字列はすべて定数であり、コンパイル期間はすでにString Poolに格納されていることが判明した.2.new String("")で作成したオブジェクトはheapに格納され、実行期間は新しく作成された.3.定数のみを含む文字列コネクタを使用して「aa」+「aa」のように作成したものも定数であり、コンパイル期間は決定できる.String Poolに格納されていることが判明しました.4.変数を含む文字列コネクタを使用して「aa」+s 1のように作成されたオブジェクトが実行期間で作成され、heapに格納されます.6.「aa」+s 1およびnew String(「aa」+s 1)形式で作成されたオブジェクトがString Poolに格納されているかどうかはよく分かりませんが、intern()メソッドを呼び出さなければ参加できない可能性があります.
よく受ける面接問題はいくつかあります.
1.
3つ、コンパイル期間Constant Poolで1つ、実行期間heapで2つ作成します.
2.[size=xx-small][/size]
s 1が指すオブジェクトの文字列は何ですか?
答え:「s 1」
StringBuffer スレッドが安全なStringBuilderです スレッドのセキュリティは保証されず(1.5で導入された)、一般的にStringBufferよりも速い
Stringオブジェクトの長さは固定されており、その内容を変更したり、Stringオブジェクトに新しい文字を追加したりすることはできません.+を使用して文字列を直列に接続して、新しい文字または文字列を追加することもできますが、+は新しいStringインスタンスを生成します.プログラムがこのような追加文字列に対する需要が頻繁である場合、+を使用して文字列の直列接続を行うことは推奨されません.オブジェクト向けプログラミングでは、生成されたオブジェクトを繰り返し運用できることが望ましい.オブジェクトの生成にはメモリ空間と時間が必要であり、Stringインスタンスを絶えず生成することは非効率的な行為である.
J2SE 5.0 java.lang.StringBuilderクラスを提供します.このクラスを使用すると、デフォルトでは16文字の長さになります.初期の長さを指定することもできます.StringBuilderオブジェクトは、追加された文字が格納可能な長さを超えている場合、追加された文字を格納するために自動的に長さを増やします.文字列を頻繁に追加する必要がある場合は、StringBuilderを使用するとプログラムの効率が大幅に向上します.次の簡単なテストプログラムで、効率の差がどれほど大きいかを知ることができます.
7ü 例6.5
例6.5では、まず+を用いて文字列を直列に接続し、System.currentTimeMillis()を用いてforループ実行前後のシステム時間を取得することで、forループがどのくらい実行されたかを知ることができる.以下は私のコンピュータのテストデータです.
実行時間:4641 実行時間:16
実行時間の差が大きいことがわかり、+直列文字列の使用による負担を示しています.常に文字列を追加する必要がある場合は、StringBuilderを使用することをお勧めします.実際に例6.5では、第2のforループ実行時間は、append()も基本データ型を受け入れることができるので、特にString.valueOf()メソッドを使用してintからStringを取得する必要はない.以下の方法に変更すると、実行時間を大幅に短縮できます.
StringBuilderを使用して最後に文字列の結果を出力するには、toString()メソッドを使用します.length()メソッドを使用して、現在のオブジェクトの文字長を知ることができ、capacity()は、そのオブジェクトが現在収容可能な文字容量を返すことができます.また、StringBuilderにはinsert()のように指定された位置に文字を挿入する方法もあり、その位置が後で文字があれば、すべての文字を後ろに移動します.deleteChar()メソッドでは、指定した位置の文字を削除できますが、reserve()メソッドでは文字列を反転できます.詳細はjava.lang.StringBuilderのAPIファイルの説明を問い合わせることができます.
StringBuilderはJ 2 SEです 5.0新たに追加されたクラスはJ 2 SE 5.0以前のバージョンで同じ要件がある場合はjava.lang.StringBufferを使用します.実際、StringBuilderはStringBufferと同じ操作インタフェースを有するように設計されている.StringBuilderは同期(Synchronized)の問題を処理していないため、シングルマシン非マルチスレッド(Multithread)の場合にStringBuilderを使用すると効率的です.StringBufferは同期の問題を処理し、StringBuilderがマルチスレッドで動作する場合は、StringBufferを使用してオブジェクトが同期の問題を管理できるようにします.
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
package other;
public class Other { static String hello = "Hello"; }
出力結果はtrue true true true false trueです.自分で分析してください.
その結果、上記の分析をまとめると、1.単独で「」引用符で作成した文字列はすべて定数であり、コンパイル期間はすでにString Poolに格納されていることが判明した.2.new String("")で作成したオブジェクトはheapに格納され、実行期間は新しく作成された.3.定数のみを含む文字列コネクタを使用して「aa」+「aa」のように作成したものも定数であり、コンパイル期間は決定できる.String Poolに格納されていることが判明しました.4.変数を含む文字列コネクタを使用して「aa」+s 1のように作成されたオブジェクトが実行期間で作成され、heapに格納されます.6.「aa」+s 1およびnew String(「aa」+s 1)形式で作成されたオブジェクトがString Poolに格納されているかどうかはよく分かりませんが、intern()メソッドを呼び出さなければ参加できない可能性があります.
よく受ける面接問題はいくつかあります.
1.
String s1 = new String("s1") ;
String s2 = new String("s1") ;
の上にいくつのStringオブジェクトが作成されていますか?3つ、コンパイル期間Constant Poolで1つ、実行期間heapで2つ作成します.
2.[size=xx-small][/size]
String s1 = "s1";
String s2 = s1;
s2 = "s2";
s 1が指すオブジェクトの文字列は何ですか?
答え:「s 1」
StringBuffer スレッドが安全なStringBuilderです スレッドのセキュリティは保証されず(1.5で導入された)、一般的にStringBufferよりも速い
Stringオブジェクトの長さは固定されており、その内容を変更したり、Stringオブジェクトに新しい文字を追加したりすることはできません.+を使用して文字列を直列に接続して、新しい文字または文字列を追加することもできますが、+は新しいStringインスタンスを生成します.プログラムがこのような追加文字列に対する需要が頻繁である場合、+を使用して文字列の直列接続を行うことは推奨されません.オブジェクト向けプログラミングでは、生成されたオブジェクトを繰り返し運用できることが望ましい.オブジェクトの生成にはメモリ空間と時間が必要であり、Stringインスタンスを絶えず生成することは非効率的な行為である.
J2SE 5.0 java.lang.StringBuilderクラスを提供します.このクラスを使用すると、デフォルトでは16文字の長さになります.初期の長さを指定することもできます.StringBuilderオブジェクトは、追加された文字が格納可能な長さを超えている場合、追加された文字を格納するために自動的に長さを増やします.文字列を頻繁に追加する必要がある場合は、StringBuilderを使用するとプログラムの効率が大幅に向上します.次の簡単なテストプログラムで、効率の差がどれほど大きいかを知ることができます.
7ü 例6.5
AppendStringTest.java
public class AppendStringTest {
public static void main(String[] args) {
String text = "";
long beginTime = System.currentTimeMillis();
for(int i = 0; i < 10000; i++)
text = text + i;
long endTime = System.currentTimeMillis();
System.out.println(" :" + (endTime - beginTime));
StringBuilder builder = new StringBuilder("");
beginTime = System.currentTimeMillis();
for(int i = 0; i < 10000; i++)
builder.append(String.valueOf(i));
endTime = System.currentTimeMillis();
System.out.println(" :" + (endTime - beginTime));
}
}
例6.5では、まず+を用いて文字列を直列に接続し、System.currentTimeMillis()を用いてforループ実行前後のシステム時間を取得することで、forループがどのくらい実行されたかを知ることができる.以下は私のコンピュータのテストデータです.
実行時間:4641 実行時間:16
実行時間の差が大きいことがわかり、+直列文字列の使用による負担を示しています.常に文字列を追加する必要がある場合は、StringBuilderを使用することをお勧めします.実際に例6.5では、第2のforループ実行時間は、append()も基本データ型を受け入れることができるので、特にString.valueOf()メソッドを使用してintからStringを取得する必要はない.以下の方法に変更すると、実行時間を大幅に短縮できます.
for(int i = 0; i < 10000; i++)
builder.append(i);
StringBuilderを使用して最後に文字列の結果を出力するには、toString()メソッドを使用します.length()メソッドを使用して、現在のオブジェクトの文字長を知ることができ、capacity()は、そのオブジェクトが現在収容可能な文字容量を返すことができます.また、StringBuilderにはinsert()のように指定された位置に文字を挿入する方法もあり、その位置が後で文字があれば、すべての文字を後ろに移動します.deleteChar()メソッドでは、指定した位置の文字を削除できますが、reserve()メソッドでは文字列を反転できます.詳細はjava.lang.StringBuilderのAPIファイルの説明を問い合わせることができます.
StringBuilderはJ 2 SEです 5.0新たに追加されたクラスはJ 2 SE 5.0以前のバージョンで同じ要件がある場合はjava.lang.StringBufferを使用します.実際、StringBuilderはStringBufferと同じ操作インタフェースを有するように設計されている.StringBuilderは同期(Synchronized)の問題を処理していないため、シングルマシン非マルチスレッド(Multithread)の場合にStringBuilderを使用すると効率的です.StringBufferは同期の問題を処理し、StringBuilderがマルチスレッドで動作する場合は、StringBufferを使用してオブジェクトが同期の問題を管理できるようにします.