java笔记1:String, StringBuffer,StringBuilder
2013-04-06 10:34
447 查看
java笔记1:String, StringBuffer,StringBuilder
1. String(不可变)
String类型是不可变的。对String对象 的一些操作(比如,追加,取子串等),其所得到的的最终结果都是创建新的对象。而原本的对象根本没有改变。
这样做的原因是为了多线程并发的安全考虑。若多个用户多线程并发访问这个成员变量,若对其操作不是创建新的对象,那就线程不安全了,任何人都可以对其修改,这结果是未知的,可怕的。比如:
* String s1 = "abc"; //定义一个String
* String s2 = s1; //第一个用户对其修改。
* String s3 = s1; //第二个用户对其修改。
String不可变特征,可以安全的实现共享。 String常量池因此而来。
2. StringBuilder和StringBuffer(可变)
尽可能的用StringBuilder而不要用StringBuffer,StringBuffer是JDK4.0之前用的。现在基本不用了。
它们的不同之处在于
StringBuffer是线程安全(synchronized)的,StringBuilder是线程不安全的。比如:StringBuffer的append(String s) 用synchronized关键字修饰了,而StringBuilder的append方法则没有,线程安全的设计类会折损运行速率。而通常没必要将字符串变量设计成线程安全的,因为字符串类型变量经常会用作局部变量,而java的局部变量永远是线程安全的,所以出于运行速率考虑,应该用StringBuilder。现在的开发中StringBuffer已基本被摒弃。
3.什么时候用String什么时候用StringBuilder?
字符串做成员变量时用String,做局部变量时用StringBuilder。
String类重写了Object类的equals方法,而StringBuffer类和StringBuilder类则没有,比较的还是内存地址引用。
4.String对象的“+” 拼接运算原理
字符串用 “+ ” 连接时,eg: s1 = s2 + s3 + “Hello World” ; 其背后的原理为:
利用StringBuilder的append()方法
即:s1 = new StringBuilder().append(s1).append(s2).append(“HelloWorld”);
5.String与StringBuffer类执行速率对比
String s = "";
StringBuilder sb = new StringBuilder();
//纳秒值
long start = System.nanoTime(); //记录开始时间(纳秒级)
for(int i = 0; i < 1000; i++) {
s = s + "a"; //运行时间:3750756
//sb = sb.append("a"); //运行时间:240533
}
long end = System.nanoTime(); //记录结束时间(纳秒级)
System.out.println(end - start);
1. String(不可变)
String类型是不可变的。对String对象 的一些操作(比如,追加,取子串等),其所得到的的最终结果都是创建新的对象。而原本的对象根本没有改变。
这样做的原因是为了多线程并发的安全考虑。若多个用户多线程并发访问这个成员变量,若对其操作不是创建新的对象,那就线程不安全了,任何人都可以对其修改,这结果是未知的,可怕的。比如:
* String s1 = "abc"; //定义一个String
* String s2 = s1; //第一个用户对其修改。
* String s3 = s1; //第二个用户对其修改。
String不可变特征,可以安全的实现共享。 String常量池因此而来。
2. StringBuilder和StringBuffer(可变)
尽可能的用StringBuilder而不要用StringBuffer,StringBuffer是JDK4.0之前用的。现在基本不用了。
它们的不同之处在于
StringBuffer是线程安全(synchronized)的,StringBuilder是线程不安全的。比如:StringBuffer的append(String s) 用synchronized关键字修饰了,而StringBuilder的append方法则没有,线程安全的设计类会折损运行速率。而通常没必要将字符串变量设计成线程安全的,因为字符串类型变量经常会用作局部变量,而java的局部变量永远是线程安全的,所以出于运行速率考虑,应该用StringBuilder。现在的开发中StringBuffer已基本被摒弃。
3.什么时候用String什么时候用StringBuilder?
字符串做成员变量时用String,做局部变量时用StringBuilder。
String类重写了Object类的equals方法,而StringBuffer类和StringBuilder类则没有,比较的还是内存地址引用。
4.String对象的“+” 拼接运算原理
字符串用 “+ ” 连接时,eg: s1 = s2 + s3 + “Hello World” ; 其背后的原理为:
利用StringBuilder的append()方法
即:s1 = new StringBuilder().append(s1).append(s2).append(“HelloWorld”);
5.String与StringBuffer类执行速率对比
String s = "";
StringBuilder sb = new StringBuilder();
//纳秒值
long start = System.nanoTime(); //记录开始时间(纳秒级)
for(int i = 0; i < 1000; i++) {
s = s + "a"; //运行时间:3750756
//sb = sb.append("a"); //运行时间:240533
}
long end = System.nanoTime(); //记录结束时间(纳秒级)
System.out.println(end - start);
相关文章推荐
- java学习笔记(7) -- String、StringBuffer、StringBuilder的区别
- Java笔记12: String,StringBuffer与StringBuilder的区别
- Java笔记12: String,StringBuffer与StringBuilder的区别
- java笔记(一):String,StringBuffer,StringBuilder
- Java笔记—String,StringBuffer ,StringBuilder 的区别
- 你不知道的Java学习笔记12--String、StringBuffer、StringBuilder比较
- 【JAVA_SE学习笔记】String、StringBuffer和StringBuilder
- java笔记之Object,String,StringBuilder,StringBuffer,时间类和日期类以及包装类
- NO10.Java笔记【String、StringBuilder、StringBuffer】
- 【Java学习笔记】String、StringBuffer和StringBuilder
- Java学习笔记之String、StringBuffer和StringBuilder
- Java 学习笔记 04 String 、StringBuilder 和 StringBuffer区别和联系
- Java笔记12: String,StringBuffer与StringBuilder的区别
- JAVA学习笔记——字符串操作(String,StringBuffer,StringBuilder)
- Java笔记12—1:String、StringBuffer和StringBuilder的区别
- Java笔记12—1:String、StringBuffer和StringBuilder的区别
- 黑马程序员java基础String、StringBuffer、StringBuilder笔记
- Java笔记8 - 探秘Java中的String、StringBuilder以及StringBuffer
- 【Java学习笔记】Day 3 String及StringBuilder及StringBuffer 【待整理】
- java基础学习笔记之String、StringBuffer、StringBuilder