ディレクトリ
ときに文字列が変化し、StringBufferのStringBuilderクラス(データを格納するための容器)の使用を必要とします。
そして、Stringクラスは異なり、StringBufferのStringBuilderクラスのオブジェクトは、何度も変更することができ、新たな未使用のオブジェクトを生成しません。
StringBufferのStringBuilderのは、速度の利点と比較するので、そのほとんどの場合、我々は、StringBuilderクラスを使用することをお勧めします。
機能
- 可変長
- 異なるタイプのデータが格納されていてもよいです
- 最終的に使用して文字列に変わります
- 文字列を変更することができます
機能
public class TestStringBuilder {
public static void main(String[] args) {
String str;
StringBuilder sBuilder=new StringBuilder();//可变字符序列:相比String 无final修饰
StringBuffer sbBuffer=new StringBuffer("abcdefg");
//StringBuilder线程不安全,效率高(一般使用它),StringBuffer线程安全,效率低
System.out.println(Integer.toHexString(sbBuffer.hashCode()));
System.out.println(sbBuffer);
System.out.println("********");
//更改字符串的内容
sbBuffer.setCharAt(2, 'M');
System.out.println(Integer.toHexString(sbBuffer.hashCode()));//hashcode一样,说明对象没变,
System.out.println(sbBuffer);
}
}
public class TestStringBuilder2 {
public static void main(String[] args) {
StringBuilder sbStringBuilder=new StringBuilder();
for(int i=0;i<26;i++) {
sbStringBuilder.append((char)('a'+i));//append扩展,可以链式调用
}
System.out.println(sbStringBuilder);
//reverse 倒序
sbStringBuilder.reverse();
System.out.println(sbStringBuilder);
//setCharAt 替换
sbStringBuilder.setCharAt(3, '可');
System.out.println(sbStringBuilder);
//insert 插入
sbStringBuilder.insert(4, '变').insert(5, '的');
//insert最后会调用return this,返回自己,所以可以链式调用。
System.out.println(sbStringBuilder);
//delete 删除,和insert一样,可以链式调用
sbStringBuilder.delete(3, 5).delete(17, 19);
System.out.println(sbStringBuilder);
}
}
//{
// 和String类含义类似的方法
// public int indexOf(String str)
// public int indexOf(String str,int fromindex)
// public String substring (int start)
// public String subString (int start,int end)
// public int length()
// char charAt(int index)
//}
/*
* 测试String和StringBuilder的使用陷阱
*/
public class TestStringBuilder3 {
public static void main(String[] args) {
//使用String进行字符串的拼接 (!*不能出现这样的代码*!)
String string="";
for(int i=0;i<5000;i++) {
string=string+i; //相当于产生了10000个对象(i代表的数字为了和string相加,会变成一个字符串对象以和string联结)
}
//要用StringBuilder的append
StringBuilder stringBuilder=new StringBuilder();
for(int i=0;i<5000;i++) {
stringBuilder.append(i);
}
}
}
違い
StringBuilderクラスは、Java 5、メソッドはスレッドセーフではありません(アクセスを同期することはできません)であることを、それとのStringBuilder StringBufferの間の最大の違いに提示されています。
StringBufferのは、基本的には親のメソッドを呼び出し、同期の変更に追加され、それがスレッドセーフである;しかし、頻繁にロックと解除するロックがパフォーマンスの低下につながる、実行速度はStringBufferのより遅いです。
StringBuilderのすべてのメソッドは、スレッドセーフので、synchronizedキーワードで改変されていないが、プロセスがロックガイドを解放するため、実行速度に速いのStringBufferよりも、ロックされていません。