【问题标题】:Difference between String and StringBuffer in javajava中String和StringBuffer的区别
【发布时间】:2014-03-06 04:33:29
【问题描述】:

我知道很多年前这个问题已经在很多网站上回答过很多次了。:P 我仍然有一些疑问,所以想发布这个。 基本区别在于,String 是不可变的,每次我们对 String 进行任何操作时,它都会创建一个新的 String 对象。

例如:-

String str = "some"; str = str + " text"

在上述情况下,创建了 2 个新字符串,而不是修改现有的 str,这可以通过使用 StringBuffer 来避免。

例如:- StringBuffer str = new StringBuffer(); str.append("try"); str.append("this");

我的问题是,为了追加方法,我们再次传递了一个字符串。在上述情况下,是否不会为字符串池中的“try”和“this”创建新的字符串对象。

【问题讨论】:

    标签: string stringbuffer


    【解决方案1】:

    是的,为"try""this" 创建了新的字符串对象。这里的好处是 StringBuffer 在内部将字符串存储为动态调整大小的数组。

    如果我们要连接两个以上的字符串,显然更有利:

    "try" + "this" + "test"
    

    这可能会创建 5 个 String 对象,因为您需要中间值。 (从技术上讲,文字的连接是在编译时执行的,所以这只是一个概念性的例子。)如果它们不是文字,编译器也很典型地将上面的 sn-p 重构为使用 StringBuilder

    StringBuilderStringBuffer 的更新非同步版本。一般来说,您应该更喜欢StringBuilder。这两个类之间的区别在"StringBuilder and StringBuffer in Java" 中进行了介绍。

    【讨论】:

    【解决方案2】:

    主要区别(除了“StringBuffer”是可变的和“String”是不可变的)是性能。 我找到了一个很好的解释here

    但是我也发现 StringBuilder 比 StringBuffer 更受欢迎,因为 StringBuffer 是同步的,而 StringBuilder 不是。

    【讨论】:

      【解决方案3】:

      对于一些字符串,我们看不出有什么区别。

      所以我想一个例子可以告诉你为什么应该使用 StringBuffer(或 StringBuilder,根据你的需要)而不是使用 +

      的字符串连接

      试试这个,自己看看

      public class UseSB {
          static int x = 100000;
          public static void main(String[] args) {
              long i1 = System.currentTimeMillis();
              main1();
              long i2 = System.currentTimeMillis();
              main2();
              long i3 = System.currentTimeMillis();
              System.out.println(i2-i1);
              System.out.println(i3-i2);
          }
      
          public static void main1() {
              String s = "x";
              for(int i=0;i<x;i++){
                  s = s + Integer.toString(i);
              }
              System.out.println(s.length());
          }
      
          public static void main2() {
              StringBuffer s = new StringBuffer("x");
              for(int i=0;i<x;i++){
                  s.append(Integer.toString(i));
              }
              System.out.println(s.toString().length());
          }
      
      }
      

      【讨论】:

        【解决方案4】:
        • 字符串: 字符串是immutable(一旦创建就不能更改)对象。创建为字符串的对象存储在常量字符串池中。 Java 中的每个不可变对象都是线程安全的,这意味着 String 也是线程安全的。两个线程不能同时使用一个字符串。字符串一旦分配就不能更改。

        • 字符串缓冲区: StringBuffer 是mutable。这意味着可以更改对象的值。通过 StringBuffer 创建的对象存储在堆中。 StringBuffer 具有与 StringBuilder 相同的方法,但 StringBuffer 中的每个方法都是同步的,即 StringBuffer 是线程安全的。

          因此,它不允许两个线程同时访问同一个方法。每个方法一次只能被一个线程访问。

          但是线程安全也有缺点,因为由于线程安全属性,StringBuffer 的性能会受到影响。因此在调用每个类的相同方法时,StringBuilder 比 StringBuffer 更快。

        • StringBuilder: StringBuilder 和 StringBuffer 一样,就是将对象存放在堆中,也可以修改。 StringBuffer 和 StringBuilder 的主要区别在于 StringBuilder 也不是线程安全的。 StringBuilder 速度很快,因为它不是线程安全的。

        来源:http://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html

        【讨论】:

          猜你喜欢
          • 2011-01-27
          • 1970-01-01
          • 2012-09-09
          • 2014-09-23
          • 2013-07-27
          • 2010-09-26
          相关资源
          最近更新 更多