1.String是不可变类,StringBuilder、StringBuffer是可变类
在这里的可变指的是引用所指的值,即
String s = "abc";
执行上述语句后,s引用所指向的值“abc”不再变化。如果改变s,如:s+"d",则会在常量池重新开辟一块区域存放“abcd”,并且s将指向这块区域。,而StringBuilder和StringBuffer直接调用append()等方法进行修改。
2.StringBuilder和StringBuffer区别
StringBuffer是线程安全的,因为在StringBuffer的每个类上面用了synchronized进行同步。
StringBuilder线程不安全,因为没用进行同步,所以效率会比StringBuffer高。
3.String、StringBuilder、StringBuffer效率对比
执行效率上StringBuilder>StringBuffer>String。
在数据量小时,选用String;在单线程操作大量数据时选用StringBuilder(没同步);在多线程操作大量数据选用StringBuffer。
4.String的+操作
我们在对String使用“+”操作时,会得到一个新的字符串(原字符串仍在常量池中),那么是怎么得到的呢?
这里我们使用的代码如下
对其进行反编译结果如下:
重点看红框部分,红框部分表示JVM将s1+"d"这句话变成了new StringBuilder().append(s1).append("d").toString(),即在堆中新开辟一内存存放StringBuilder对象,然后再将s1和d放进去,最后用toString()方法变为String对象放入常量池。
注意:这里是StringBuilder,不是StringBuffer。很多人和书上都理解错了,说的是StringBuffer。
5.new String("abc")创建了几次对象?
答案是可能一次,也可能两次。因为String不可变,所以如果原来常量池有“abc”,就只创建一次对象;如果常量池没有“abc”,则会创建两次对象,一次在堆中,一次在常量区。