String StringBuffer StringBuilder之间的关系

  String类是不可变字符串,对String类型每次进行修改都会创建一个新的string对象,这样有一个好处就是编译器共享字符串。我们可以想象一下将各种字符串放在公共的存储池中,字符串变量指向存储池中的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。但是这样会不会造成内存遗漏呢?毕竟,原始字符串是放置在堆中。十分幸运,Java将自动的进行内存回收。如果一块内存不再使用了,系统将会自动回收。总之共享带来的高效率远胜于提取拼接字符串带来的效率。
  在Java中每次拼接字符串都会构建一个新的String对象,既耗时又浪费空间,使用StringBuffer或者StringBuilder可以避免这种情况。
  StringBuffer是线程安全的、可变的字符序列。它类似于String对象,但Stringbuffer可以修改,String对象是不可以修改的。在任何时间点它包含一些特定的字符序列,但是序列的长度和内容可以通过确定来改变方法调用。StringBuffer上的主要操作是 append和 insert方法,它们被重载,以便接受任何类型的数据。它们有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。append方法总是在缓冲区的末尾添加这些字符; insert方法在指定点添加字符。每个StringBuffer对象都有一个容量。只要字符串缓冲区中包含的字符序列长度不超过容量,就不需要分配新的内部缓冲数组。如果内部缓冲区溢出,则自动将其放大。从JDK5的发行版开始,这个类已经被一个为单线程StringBuilder设计的等价类所补充。StringBuilder类通常应该优先使用这个类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。
  StringBuilder是一个可变的字符序列。这个类提供了一个与StringBuffer兼容的API,但是并不能保证同步。这个类被设计为在字符串缓冲区被单个线程使用的地方(通常是这样)作为一个drop-in替换StringBuffer。在可能的情况下,建议优先使用StringBuilder这个类,因为在大多数实现下它会更快

猜你喜欢

转载自blog.csdn.net/dingpf1209/article/details/80713491
今日推荐