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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String 和 StringBuffer之间的区别我知道,String定义的字符串是不可以修改的  为什么  我写的小联系里面的String s = “hello!”  然后String s = s + “ wold”,我知道结果是s= “hello wold”   不是说String定义的字符串不能修改吗?
StringBuffer s =  “hello” ,StringBuffer s =  s + “ world” 结果也是 “hello world” 我知道结果  就是不知道它们之间真正的区别在哪了  
Stringbuffer 和Stringbuilder   定义的字符串都是可以修改的  那它们的真正区别在哪?   说什么线程安全与非线程安全,这个我就不理解了  ,高手能详细给我解释清楚吗?

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 鼓励一下

查看全部评分

4 个回复

倒序浏览
String   str   =   "aaaa ";
str   =   str   +   "bbb ";

看似乎变了,可是在内存里     "aaaa "   还是存在着.他是不变的.
变的是在内存里又重新划分了个区域存放   "aaaabbb "   ,然后   str   指向   "aaaabbb ".

StringBuffer   sb   =   new   StringBuffer( "aaaa ");
sb.append( "bbb ");

这个先在内存里划分了快区域存放   "aaaa "   ,   当   sb.append( "bbb ");   时,   "aaaa "   变成了   "aaaabbb "

StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。 每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。


评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

回复 使用道具 举报
首先, String s = “hello!” 创建hello常量
然后String s = s + “ wold” 创建常量helloword,并将helloworld地址复制给引用变量s.
这时候内存中有hello和helloworld两个字符串常量。你要明白s只是一个引用变量,他可以指向不同的字符串常量,而不是字符串常量可以改变。
字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
看例子。String str="a"+"b"+"c"+"a";在constant pool中存在那些的字符串常量呢?答案是六个。首先有三个直接常量"a"、"b"、"c",其中两次出现的"a"是共享的。此外,由"a"+"b"生成"ab" 保存在内存中,接着"ab"+"c"生成"abc"保存在内存中,最后由"abc"+"a"生成"abca"保存在内存中,所以常量池中一共存在六个字符串常量。
正因为string类是不可变的,同时也产生很多额外的临时变量,所以才引发了stringbuffer和stringbuilder这两个类来避免这个问题。
StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

回复 使用道具 举报
此问题也解决
回复 使用道具 举报
{:soso_e183:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马