A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 耿渊博 中级黑马   /  2014-3-21 21:48  /  1790 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String和StringBuilder都是表示字符串的,那么他们又什么区别吗?

11 个回复

倒序浏览
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的优点!

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。基本来说在性能上都是 StringBuilder > StringBuffer > String 的了。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
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 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
String 类代表字符串它们的值在创建之后不能改变。所以可以共享它们。StringBuilder是字符串缓存区,它的内容可以被修改,长度也可以改变,但StringBuilder不是线程安全的,如果你只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
String对象中的对象自创建后就不能被轻易改变,每次调用String类中的方法时实际上都是创建一个新的对象,因此在频繁的操作String对象的时候系统开销很大,而StringBuild对象是可以动态改变的,对其进行操作不用创建新的对象,但不是线程安全的,求给分

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
String 是字符串类 最常用于简单的字符串操作
StringBuffer 是字符串缓冲。 适用于复杂的字符串增删改操作。
StringBuilder 是与 StringBuffer 兼容的 API 简化。 该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
顶一下!
回复 使用道具 举报
有三个,分别是String,StringBuffer,StringBuilder
回复 使用道具 举报
String是一个长度固定的字符串对象
StringBuilder是一个可变字符序列.StringBuilder:和StringBuffer是API兼容的。但不保证同步。该类用作与StringBuffer的一个简易的替换,在绝大多数的实现中比StringBuffer快
StringBuilder是线程不安全的,所以效率高,String和StringBuilder调用toString()方法可以实现相互转换
回复 使用道具 举报
string 不可变 StringBuilder可变
回复 使用道具 举报
String 是不可变字符串,如果你没声明一次那么他就会在内存中又生出一份,比如:
String a = "1";
a = "2" + 1;
这样会生出2个字符串,就是"1" 和 "21"
而StringBuilder可以理解为是一个对象,但他是线程不安全的,
对他所有的操作很有可能发生字符串越位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马