一、String
String 是 Java 中的一个类,用于表示字符串。它是不可变的,因为内部使用字符数组来保存字符串内容,用于存放值的value[ ]是final类型,因此只能被赋值一次,不能被更改,即一旦创建就不能被修改。
当对 String 进行修改时,实际上是创建了一个新的 String 对象,将修改后的字符串复制到新的对象中。
二、StringBuffer
StringBuffer 和 StringBuilder也是 Java 中的类,用于表示可变的字符串。它们可以进行插入、删除和替换等操作。
StringBuffer:字符串变量(Synchronized,即线程安全)。 内部也使用字符数组来保存字符串内容,但是该数组没有被 final 修饰,可以改变其长度。当对 StringBuffer 进行修改时,直接在原有的字符数组上进行操作,不会创建新的对象。如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。
三、StringBuilder
StringBuilder的实现原理与 StringBuffer 相同,唯一的区别是 StringBuilder 不是线程安全的,而 StringBuffer 是线程安全的。
StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder 对象被当作是一个包含字符序列的变长数组。
四、String、StringBuffer 和 StringBuilder 的优缺点
(一)优点:
- String的优点是简单易用,适合于保存少量且不会被修改的字符串。
- StringBuffer 和StringBuilder的优点是可以高效地进行字符串操作,适合于频繁修改字符串的场景。
(二)缺点:
- String每次对字符串进行修改都会创建一个新的对象,导致内存开销较大。
- StringBuffer 由于其所有方法都是同步的,相对于StringBuilder效率要相对低一点,但也远比String要高的多。
- StringBuilder 不具备线程安全性,如果在多线程环境下使用可能会出现问题。
五、总结
- 如果只在单线程环境下使用,并且不需要频繁修改字符串,可以使用 String。
- 如果需要频繁修改字符串并且在多线程环境下使用,应该使用 StringBuffer。
- 如果只在单线程环境下使用,并且需要频繁修改字符串,可以使用StringBuilder。