黑马程序员技术交流社区

标题: String和StringBuilder的区别 [打印本页]

作者: 耿渊博    时间: 2014-3-21 21:48
标题: String和StringBuilder的区别
String和StringBuilder都是表示字符串的,那么他们又什么区别吗?

作者: papercup    时间: 2014-3-21 21:55
StringBuilder是一个可变字符序列。String是一个长度固定的字符串对象,内容不能轻易被改变。下面的代码延时他们对字符串进行更新的时间:
  1. public class Jerque{
  2.         public static void main(String[] args){
  3.                 String str ="";
  4.                 long starTime = System.currentTimeMillis();
  5.                 for(long i = 0;i<100000;i++){
  6.                         str = str+1;
  7.                 }
  8.                 long endTime = System.currentTimeMillis();
  9.                 long time = endTime-starTime;
  10.                 System.out.println("String 消耗时间:"+time);
  11.                 StringBuilder builder = new StringBuilder("");
  12.                 starTime = System.currentTimeMillis();
  13.                 for(long j = 0;j<100000;j++){
  14.                         builder.append(j);
  15.                 }
  16.                 endTime = System.currentTimeMillis();
  17.                 time = endTime - starTime;
  18.                 System.out.println("StringBuilder 消耗时间:"+time);
  19.         }
  20. }
复制代码

可以看出:使用String对象比StringBuilder对象耗时更多。这就是StringBuilder的优点!
作者: zhxu188    时间: 2014-3-21 22:00
String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。基本来说在性能上都是 StringBuilder > StringBuffer > String 的了。
作者: 刘先斌    时间: 2014-3-21 22:05
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

作者: 郭黎明    时间: 2014-3-21 22:07
String 类代表字符串它们的值在创建之后不能改变。所以可以共享它们。StringBuilder是字符串缓存区,它的内容可以被修改,长度也可以改变,但StringBuilder不是线程安全的,如果你只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。
作者: yanzhendong    时间: 2014-3-21 22:21
String对象中的对象自创建后就不能被轻易改变,每次调用String类中的方法时实际上都是创建一个新的对象,因此在频繁的操作String对象的时候系统开销很大,而StringBuild对象是可以动态改变的,对其进行操作不用创建新的对象,但不是线程安全的,求给分
作者: 电饭煲    时间: 2014-3-21 23:29
String 是字符串类 最常用于简单的字符串操作
StringBuffer 是字符串缓冲。 适用于复杂的字符串增删改操作。
StringBuilder 是与 StringBuffer 兼容的 API 简化。 该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
作者: Asura    时间: 2014-5-7 07:08
顶一下!
作者: wanghe826    时间: 2014-5-7 23:18
有三个,分别是String,StringBuffer,StringBuilder
作者: 帽子    时间: 2014-5-8 01:53
String是一个长度固定的字符串对象
StringBuilder是一个可变字符序列.StringBuilder:和StringBuffer是API兼容的。但不保证同步。该类用作与StringBuffer的一个简易的替换,在绝大多数的实现中比StringBuffer快
StringBuilder是线程不安全的,所以效率高,String和StringBuilder调用toString()方法可以实现相互转换
作者: 嗯√低调〆    时间: 2014-5-8 08:46
string 不可变 StringBuilder可变
作者: 奇迹    时间: 2014-5-9 02:46
String 是不可变字符串,如果你没声明一次那么他就会在内存中又生出一份,比如:
String a = "1";
a = "2" + 1;
这样会生出2个字符串,就是"1" 和 "21"
而StringBuilder可以理解为是一个对象,但他是线程不安全的,
对他所有的操作很有可能发生字符串越位




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2