您的位置:首页 > 产品设计 > UI/UE

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: