欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java| String, StringBuffer和tringBuilder之间的区别?

程序员文章站 2022-03-15 20:53:08
...

String是 java 编程中最广泛使用的类之一,也是核心 java 面试中最重要的主题之一。
本文主要讲解String 类的主要特性,然后我们将比较 String vs StringBuffer 和 StringBuilder。

String字符串在 java 中是不可变的,而且是最终的,因此每当我们进行 String 操作时,就会创建一个新的 String。字符串处理是一种资源消耗,所以 java 提供了两个字符串操作的实用类—— StringBuffer 和 StringBuilder。

StringBuffer 和 StringBuilder 是可变类。 Stringbuffer 操作是线程安全和同步的,其中 StringBuilder 操作不是线程安全的。

因此,当多个线程在同一个字符串上工作时,我们应该使用StringBuffer,但在单线程环境中,我们应该使用 StringBuilder。 由于没有同步开销,StringBuilder 的性能比 StringBuffer 快。


String in Java

  • 1.String 类表示字符串,我们可以用两种方式实例化 String.
  • String str = "yveshe";或者String str = new String ("yveshe");
  • 2.在 java 中,String类时不可变类,所以很容易在不同的线程或函数*享它
  • 3.当我们使用双引号创建String字符串对象时,它首先在 JVM 字符串池中寻找具有相同值的 String 时,如果找到 String,它会返回引用,否则 它创建 String 对象,然后将它放置在 String 池中。 这样 JVM 可以通过在不同的线程中使用相同的字符串来节省大量的空间。 但是如果使用new操作符来实例化String时,它会在堆内存中显式创建一个新字符串对象.
  • 4.+ 运算符为 String 重载,用于连接两个字符串。 然后它在内部是使用 StringBuffer 来执行这个操作的,可以通过反编译观看其最终编译结果.
  • 5.String重写equals()和 hashCode ()方法,只有在两个字符顺序相同的情况下,两个字符串才是相等的。 注意: equals()方法是大小写敏感的,使用 equalsIgnoreCase ()方法可以忽略大小写敏感
  • 6.String字符串是用UTF-16(Unicode的一种实现模式)格式来表示的
  • 7.String是final修饰的,除了"private int hash"之外的字段,所有字段都是 final 修饰。 字段hash中用于缓存 hashCode () 函数值,只在调用 hashCode ()方法时创建,然后在此字段中缓存。 因此对相同的String每次调用 hashCode ()方法,都会产生相同的输出。 对于调用者来说,每次调用hashCode方法时都像是重新计算了hash值一样,实际上它缓存在字段hash中,源码如下
    /** Cache the hash code for the string */
    private int hash; // Default to 
    
    //生成String时将original的hash值缓存起来
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
    
    //使用缓存的hash值,如果缓存的hash值为默认值且不为空字符串,则重新计算hash值
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
    
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    

String VS StringBuffer

由于 String 在 java 中是不可变的,所以每当我们做 String 操作,比如 concat,substring等,它就会生成一个新的字符串并丢弃旧的字符串给垃圾收集器收集
这些都是繁重的操作,会产生大量的垃圾。 所以 Java 提供了 StringBuffer 和 StringBuilder 类,这些类应该用于字符串的操作。
Stringbuffer 和 StringBuilder 是 java 中的可变对象,并提供字符串操作的 append(), insert(), delete() and substring() 方法.

建议: 在对字符串有繁重的操作时,不建议使用String,而是根据多线程环境使用Stringbuffer或者StringBuilder.


StringBuffer vs StringBuilder

在 Java 1.4之前,StringBuffer 是字符串操作的唯一选择,但它有一个缺点,即它的所有公共方法都是同步的。提供线程安全性,但需要性能成本。
在大多数场景中,我们不会在多线程环境中使用 String,所以 Java 1.5引入了一个新的 StringBuilder 类型,它与 StringBuffer 类似,除了线程安全和同步。

因此,当我们处于单线程环境或不关心线程安全,我们应该使用 StringBuilder 否则使用 StringBuffer。请参阅 StringBuffer 和 StringBuilder 之间的性能测试


String VS StringBuffer VS StringBuilder

  • 1.String 是不可变的,而 StringBuffer 和 stringbuilder 是可变类.
  • 2.StringBuffer是线程安全和同步的,而 StringBuilder 不是,这就是 StringBuilder 比 StringBuffer 更快的原因
  • 3.字符串连接操作 + 操作符内部使用 StringBuffer 或 StringBuilder 类,解语法糖可知.
  • 4.对于非多线程环境中的字符串操作,我们应该使用 StringBuilder 而不是使用 StringBuffer 类

总结: 比较了String 与 StringBuffer 和 StringBuilder 之间的差异。 在大多数的字符串操作场景中,StringBuilder 比 StringBuffer 更适合。

相关链接:
StringBuffer 和 StringBuilder 之间的性能测试比较

相关标签: String