黑马程序员技术交流社区
标题:
String、Stringbuffer和Stringbuilder之间的区别和联系,就是不明!
[打印本页]
作者:
黄敏
时间:
2012-8-9 12:12
标题:
String、Stringbuffer和Stringbuilder之间的区别和联系,就是不明!
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 定义的字符串都是可以修改的 那它们的真正区别在哪? 说什么线程安全与非线程安全,这个我就不理解了 ,高手能详细给我解释清楚吗?
作者:
于启会
时间:
2012-8-9 12:30
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) 具有相同的效果。 每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。
作者:
杜鹏云
时间:
2012-8-9 12:37
首先, 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。
作者:
黄敏
时间:
2012-8-9 14:52
此问题也解决
作者:
绽弧
时间:
2012-8-9 15:21
{:soso_e183:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2