String
在Java中,String类用于用于创建和操作字符串。String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,在这里不作赘述。但值得注意的是,String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。
1 | String s = "Google"; |
上段代码的运行结果如下:
1 | s = Google |
看似String类是可以改变的,那为什么又说String类是不可改变的呢?
答:在这里的变量s,并非String对象,而是指向对象地址的引用。变量s存储在栈空间,而真正的对象存储在堆空间。
在执行上图中的两句代码时,堆空间实际上创建了两个对象,变量s改变的是内存中对象的地址,第一个对象的内容并未发生改变,最后也会被垃圾回收机制回收内存。所以说,String 类是不可改变的,你一旦创建了 String 对象,那它的值就无法改变了。对了,String 是被 final 修饰的,他的长度是不可变的。
StringBuffer、StringBuilder
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
三者在执行速度方面的比较:
StringBuilder > StringBuffer > String
如何正确地、适当地使用这三个类:
如果要求字符串不可变,操作少量数据,那么应该选择String类
如果需要字符串可变并且是线程安全的,操作大量数据,那么应选择StringBuffer类
如果要求字符串可变并且不存在线程安全问题,操作大量数据,那么应选择StringBuilder类