Java教程 目录

String,StringBuffer和StringBuilder区别

Java String类

在这一小节中,我们将学习StringStringBufferStringBuilder之间的区别。StringBufferStringBuilder有什么区别是一个流行的java面试问题。

本教程主要介绍String类的主要功能,然后比较StringStringBufferStringBuilder之间的区别。

1. String

  • String类表示字符串,可以通过两种方式实例化String

    ------ --- - ------
    -- --
    ------ --- - --- ------ --------
    
  • String在Java中是不可变的,因此很容易在不同的线程或函数之间共享它。

  • 当使用双引号创建String时,它首先在JVM字符串池中查找具有相同值的String,如果找到它则返回引用,否则它将创建String对象,然后将它放入String池中。这样JVM通过在不同的线程中使用相同的String来节省大量空间。但是如果使用新的运算符,它会在堆内存中显式创建一个新的String

  • +运算符为String重载并用于连接两个字符串。虽然在内部它使用StringBuffer来执行此操作。

  • String覆盖equals()hashCode()方法,只有两个字符串在相同的顺序中具有相同的字符时才相等。请注意,equals()方法区分大小写,如果不查找区分大小写的检查,则应使用equalsIgnoreCase()方法。

  • String表示UTF-16格式的字符串。

  • String是一个final类,除了private int hash字段之外,所有字段都是final。此字段包含hashCode()函数值,仅在调用hashCode()方法并在此字段中缓存时创建。此外,使用String类的final字段和一些计算生成散列,因此每次调用hashCode()方法时,都会产生相同的输出。对于调用者来说,它就像每次都在进行计算,但在内部它会被缓存在哈希字段中。

2. String与StringBuffer

由于String在Java中是不可变的,因此每当执行字符串操作(如连接,子字符串等)时,它会生成一个新的String并丢弃旧的String以进行垃圾收集。

这些都是繁重的操作,并在堆中产生大量垃圾。所以Java提供了StringBufferStringBuilder类用于String操作。

StringBufferStringBuilder是java中的可变对象,并为String操作提供append()insert()delete()substring()方法。

3. StringBuffer 与 StringBuilder

在Java 1.4之前,StringBufferString操作的唯一选择,但它有一个缺点,即它的所有公共方法都是同步的。StringBuffer提供线程安全性,但性能成本。

在大多数情况下,不在多线程环境中使用String,因此Java 1.5引入了一个新的类StringBuilder,类似于StringBuffer,除了线程安全和同步。

因此,如果处于单线程环境中或者不关心线程安全性,则应使用StringBuilder,否则请使用StringBuffer

4. String,StringBuffer与StringBuilder

  • String是不可变的,而StringBufferStringBuider是可变类。
  • StringBuffer是线程安全和同步的,而StringBuilder不是,因引StringBuilderStringBuffer更快。
  • String 连接 + 操作符在内部使用StringBufferStringBuilder类。
  • 对于非多线程环境中的String操作,应该使用StringBuilder,否则使用StringBuffer类。

上一篇:Java Character类
下一篇:Java中为什么String在是不可变的?