String、StringBuffer、StringBuilder类比较

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”,则会创建两次对象,一次在堆中,一次在常量区。

猜你喜欢

转载自blog.csdn.net/qq_38550836/article/details/82874927
今日推荐