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

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 之间的性能测试比较

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值