永发信息网

java中StringBuffer和String有什么区别阿

答案:3  悬赏:40  手机版
解决时间 2021-04-05 10:13
  • 提问者网友:棒棒糖
  • 2021-04-05 04:37
java中StringBuffer和String有什么区别阿
最佳答案
  • 五星知识达人网友:猎心人
  • 2021-04-05 06:09
楼上说了一大段,还是没有说清楚区别

其实很简单,就是一个变量和常量的关系
StringBuffer对象的内容可以修改
而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象

比较
StringBuffer str = new StringBuffer("a");
str.append("bc");

String str2 = "a";
str2 = str2 + "bc";

str引用的一直是同一对象
而str2引用的在两句中是完全不同的对象
全部回答
  • 1楼网友:行雁书
  • 2021-04-05 07:29
ava.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。 可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。 StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。 append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。 通常,如果 sb 引用 StringBuilder 的一个实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。 只要发生有关源序列(如在源序列中追加或插入)的操作,该类就只在执行此操作的字符串缓冲区上而不是在源上实现同步。 每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 java.lang.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。 append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容为“start”的字符串生成器对象,则该方法调用 z.append("le") 将使字符串生成器包含“startle”,而 z.insert(4, "le") 将更改字符串生成器,使之包含“starlet”。 通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。 将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。
  • 2楼网友:逃夭
  • 2021-04-05 07:12
在java中有3个类来负责字符的操作。 1.character 是进行单个字符操作的, 2.string 对一串字符进行操作。不可变类。 3.stringbuffer 也是对一串字符进行操作,但是可变类。 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 都会重新建立新的对象来保存新的值.这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯