StringクラスとStringBuilder、StringBuffer
文字列クラス
生成された文字列は不変であり、その中には最終的に定義された char[] があるため、文字列が変更されるたびに、新しい String オブジェクトが実際に再生成されます。
ソースコードは次のとおりです。
コンパイル機能: コンパイラは、コンパイル中に変数に割り当てられた 2 つの定数文字列を結合します。
package com.demo.String;
public class TestString2 {
public static void main(String[] args) {
//编译器做了优化,直接在编译的时候将字符串进行了拼接
String str1="hello"+"java"; //相当于str1=“hello java”
String str2="hellojava";
//str1与str2是同一对象,即证明了这一观点
System.out.println(str1==str2);
String str3="hello";
String str4="java";
//编译的时候编译器不知道变量里面是什么值,所以没办法在编译的时候优化
String str5=str3+str4;
System.out.println(str5==str2);
}
}
StringBuffer と StringBuilder
StringBuffer: スレッド セーフ、スレッド同期チェック、低効率
StringBuilder: スレッドは安全ではありません、スレッド同期チェックなし、高効率、通常メソッドで使用されます、メソッドにはスレッドが関与しません
両者のソースコード設計構造はほぼ同じなので、使い方は全く同じです
package com.demo.String;
//测试字符串相关类
public class TsetString {
public static void main(String[] args) {
String s1 = new String("abcd");
StringBuilder sb=new StringBuilder("ABC");
// StringBuffer sbf=new StringBuffer("ABC");//效率低
sb.append(",I can sing my abc!");
sb.insert(0,"爱").insert(0,"我");//插入字符串
System.out.println(sb);
sb.delete(0,2);
System.out.println(sb);
sb.deleteCharAt(0).deleteCharAt(0);//删除某个字符
System.out.println(sb.charAt(0));//获取某个字符
System.out.println(sb.reverse());//字符串逆序
}
}
可変および不変シーケンスの使用上の落とし穴
5000 個のオブジェクトを生成し、直接分割