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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡川 中级黑马   /  2012-3-28 23:13  /  2956 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

重新学java ,想起了一个很常见的面试题String 和StringBuffer 的区别

8 个回复

倒序浏览
真是老生常谈啊,为了积分!再写一遍!
String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 其实耐心也很重要哦!

查看全部评分

回复 使用道具 举报
String 类代表字符串,字符串是常量,它们的值在创建之后不能更改。
StringBuffer是一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,
但通过某些方法调用可以改变该序列的长度和内容。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,
就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。
这个是jdk里面的解释
回复 使用道具 举报
1、String是不可变的,StringBuffer是可变的且线程安全的。

2、从速度上说,String较慢,StringBuffer较快。

3、对StringBuffer进行操作,是在原来的对象之上进行改变,而对String进行操作,是创建新的对象。
回复 使用道具 举报
String,是字符串常量,StringBuffer是字符串变量(线程安全);
简单的讲它们的区别在于,String是不可变对象,因此每次对Strng类型进行改变的时候,其实等于生成了一个新的String对象,然后将指针只指向的新的String对象,....因为每次声称对象都会对系统性能产生影响,对于新生成的对象,都放在Eden中;当Eden充满时(小孩太多了),VC的GC就会开始工作,那速度一定会相当慢的.
    但如果使用了StringBuffer,结果就不一样了,每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用.所以一般情况下推荐使用StringBuffer,特别是字符串对象经常改变的情况下.    而在某些情况下,String对象的字符串拼接的其实是被JVM解释成StringBuffer对象的拼接,所以有些时候S听对象的速度并不会比StringBuffer对象慢,而特别是一下的字符串对象生成中,String效率是远比StringBuffer快的:
  String str = "This is only a" + "simple" + "test";
StringBuffer  str1= new StringBufer("This is only a").append("simple" ).append("test");
我们会惊讶的发现生成str对象的速度实在太快了,这时候StringBuffer居然速度不占优势,其实这是JVM的一个把戏,
  实际上String str= "This is only a" + "simple" + "test";  就是String str= "This is only a simple test";所以不需要太多时间了.
   但是,如果字符串来自另外的String对象的话,速度也没那么快;例如;
  String str2 = "This is only a";
String str3 = "simple";
String st4= "test";
String st1= "str2+str3+str4;
这时候JVM会规规矩矩按照原来的方式去做.
总而言之: 如果偶尔对字符串常量进行拼接,可以使用String,它足够简单轻量级; 如果经常对字符串进行拼接,累加操作请用StringBuffer或StringBuider;单线程环境建议用StringBuilder,因为它比Stringbuffe快r, 多线程环境用StringBuffer,它是县线程安全的;
回复 使用道具 举报
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。
回复 使用道具 举报
1.public final class String extends Object implements Serializable, Comparable<String>, CharSequence
   String 类代表字符串
  public final class StringBufferextends Object implements Serializable, CharSequence
   可以看出String实现了Comparable<String>, 因此在网TreeSet里装的时候可以按某种方式进行排序。
2.String字符串是常量;它们的值在创建之后不能更改。因为 String 对象是不可变的,所以可以共享
   Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder (或 StringBuffer)类及其 append 方法实现的。
3.   StringBuffer一个类似于 String 的字符串缓冲区,在任意时间点上它都包含某种特定的字符序列但   通过某些方法调用可以改变该序列的长度和内容。例如 append 和 insert 方法,每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。
4.StringBuffer  和  String之间的转换;
String toString() 返回此序列中数据的字符串表示形式。
StringBuffer(String str) :以指定的字符串创建StringBuffer对象。
回复 使用道具 举报
String 和 StringBuffer都是JAVA 平台提供了两个类,它们可以储存和操作字符串,即包含多个字符的字符数据。这个 String 类提供了数值不可改变的字符串。而这个 StringBuffer 类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用 StringBuffer。典型地,你可以使用 StringBuffers 来动态构造字符数据。
回复 使用道具 举报
String: 是对象不是原始类型.为不可变对象,一旦被创建,就不能修改它的值.对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.String 是final类,即不能被继承.
StringBuffer:是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象它只能通过构造函数来建立,StringBuffer sb = new StringBuffer();对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中付值的时候可以通过它的append方法.sb.append("hello")。字符串连接操作中StringBuffer的效率要比String高。  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马