ヒント:記事を書いた後、目次を自動的に生成できます。生成方法については、右側のヘルプドキュメントを参照してください。
1.文字列定数プール
定数プールは、JVMで分割されたメモリ領域です。JVMの実行が開始されると、定数プールとして特別な領域が作成されます。
直接割り当てモードを使用してStringクラスオブジェクトをインスタンス化する場合は、インスタンス化されたオブジェクト(文字列コンテンツ) )はこのオブジェクトプールに自動的に保存されます。
次回も直接代入モードを使用してStringオブジェクトを宣言する場合、この時点でオブジェクトプールに指定されたコンテンツがあると、直接参照されます。
そうでない場合は、新しい文字列オブジェクトを作成し、次回の使用のためにオブジェクトプールに保存します
2.文字列リフレクション操作
リフレクションは、オブジェクト指向プログラミングの重要な機能です。一部のプログラミング言語は「イントロスペクション」とも呼ばれます。これ
は、プログラムの実行中にオブジェクトの詳細情報(タイプ情報、属性情報など)を取得/変更することを指します。、これは、オブジェクトをより適切に「認識」させることと同じです
。Javaでリフレクションを使用するのは少し面倒です。リフレクションの具体的な使用法については、後のコースで詳しく説明します。
文字列が不変である理由(の利点は何ですか?)不変のオブジェクト?
- 文字列オブジェクトプールを実装すると便利です。文字列が可変の場合、オブジェクトプールは文字列をいつディープコピーするかを考慮する必要があります。
- 不変オブジェクトはスレッドセーフです。
- 不変オブジェクトはハッシュコードをキャッシュするのに便利であり、キーとして使用すると、HashMapに効率的に保存できます。
注:次のコードは開発で作成しないでください。多数の一時オブジェクトが生成され、効率は比較的低いです。**
String str = "Hello";
// 获取 String 类中的 value 字段. 这个 value 和 String 源码中的 value 是匹配的.
Field valueField = String.class.getDeclaredField("value");
// 将这个字段的访问属性设为 true
valueField.setAccessible(true);
// 把 str 中的 value 属性获取到.
char[] value = (char[]) valueField.get(str);
// 修改 value 的值
value[0] = 'h';
System.out.println(str);
実行結果こんにちは
3.文字列内のいくつかの操作
1.文字列内の左右の空白文字(スペース、改行、タブなど)を削除します
s1.trim();
2.文字列を大文字に(小文字に)
s1.toUpperCase();
s1.toLowerCase();
3.プール操作への文字列
s2.intern();
String str1 = new String("hello"),intern();
最初に検索し、見つからない場合はプールに入り、その場所に戻ります。プールに入った後、新しいスペースはゴミスペースとしてリサイクルされます。
4.文字列接続(+と同等)
4.StringBuffer和StringBuilder
一般的に、Stringの操作は比較的単純ですが、Stringの不変の性質により、文字列の変更を容易にするために、StringBufferクラスとStringBuilderクラスが提供されています。
StringBufferとStringBuilderの関数のほとんどは同じで、主
にStringの「+」を使用してStringBufferを導入して文字列を接続しますが、この操作をStringBufferクラスのappend()メソッドに変更する必要があります。
public class Test{
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append("World");
fun(sb);
System.out.println(sb);
}
public static void fun(StringBuffer temp) {
temp.append("\n").append("www.bit.com.cn");
}
}
1.ストリングリバース
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.reverse());
2.指定した範囲を削除します
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10));
3.位置を指定する前にデータを挿入します
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.insert(0, "lala"));