字符串

标签: java String StringBuffer StringBuilder
3人阅读 评论(0) 收藏 举报
分类:

String类对象是被final修饰的,是不可变字符串,并没有提供用于修改字符串的方法,所以长度也是不可变的。

String a = "AAA";


String b = "BBB";


a += b;


System.out.print(a);// 输出"AAABBB"

执行执行绿→执行,貌似是把"AAA"拼接"BBB"变成了"AAABBB",其实并不是这样。"AAA"永远是"AAA",虽然执行了绿,但每次都只是创建了一个新的String对象,最后将引用变量a指向了"AAABBB"

所以,每次都要创建一个新的字符串,是会降低运行效率的。但不可变字符串却有一个优点:编译器可以让字符串共享。

String str = "AAA";

这时候并没有创建一个新的String对象,而是直接引用了的对象。


java设计者认为,共享带来的高效率,远远胜过了提取、拼接字符串所带来的低效率。


上面只新建了3个对象,但如果更多呢?实际走下demo:

String str = "";
long startTime = System.currentTimeMillis();// 开始记录时间
for (int i = 0; i < 10000; i++) {
  str += i;
}
long endTime = System.currentTimeMillis(); // 结束记录时间
long totalTime = endTime - startTime;// 总消耗时间
System.out.println("耗时" + totalTime + "毫秒");// 输出"耗时175毫秒"

这还只是10000次,如果是10000*10000呢?

此时就需要StringBuilder,和 String 类不同的是,StringBuilder 和 StringBuffer 类的对象能够被多次的修改,并且不产生新的未使用对象。

同样是10000次,StringBuilder效率的不是一点点,再走一遍demo:

StringBuilder str = new StringBuilder();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
  str.append(i);
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;

System.out.println("耗时" + totalTime + "毫秒");// 输出"耗时2毫秒"

对于像文件读写这种需要频繁、大量修改的操作,建议用StringBuilder。在应用程序要求线程安全的情况下,必须使用StringBuffer了,因为StringBuilder虽然效率,但其方法不是线程安全的(不能同步访问)。

最后道个歉,String、StringBuilder、StringBuffer具体是怎么处理的?类变量、全局变量、局部变量,分别是怎么运行的?什么时候释放?线程安全到底是什么?我还没有实践过,也不是非常了解内存机制,所以这篇博文的表达和图画的不是很清楚,对不起各位看客,后面我会开新博文补上的。

查看评论
    个人资料
    等级:
    访问量: 103
    积分: 74
    排名: 156万+
    文章分类
    文章存档
    最新评论