String、StringBuilder和StringBuffer的比较

String

String在Java中的具体操作
String str = “abc” + “def” + “gk”;
System.out.println(str);
(1)String 中使用+字符串进行字符串的连接时,首先以最左边的字符串为参数创建StringBuilder对象,然后依次向右边进行append操作,最后将StringBuilder对象通过toString()方法转换成String对象。
(2)所以以上String str = “abc” + “def” + “gk”;这行代码的实现过程是:String str = new StringBuilder(“abc”).append(“def”).append(“gk”).toString();
(3)所以使用+进行多个字符串的连接时,实际上是产生了一个StringBuilder对象和一个String对象。
(4)连续多次使用+号带来的效率低下的代价,每做一次+运算,就产生一个StringBuilder对象,然后append之后就被回收掉。如果直接采用StringBuilder对象进行append的话,那么进行N次字符串的连接操作,就可以节省N-1次创建和销毁对象的时间。
(5)故,在循环中要进行字符串连接的操作,通常都是用StingBuffer或StringBuilder对象来进行append操作。

String、StringBuilder和StringBuffer的区别

(1)可变与不可变:String是不可变对象,StringBuilder和StringBuffer是可变字符串对象(其内部的字符数组长度可变)。
(2)String中的对象是不可变的,可以理解为常量,是线程安全的。StringBuffer与StringBuilder的方法和功能是完全等价的,只是查看StringBuffer的源码可以知道,其中的方法大都采用了synchronized关键字进行修饰,故是线程安全的,而StringBuilder没有,被认为是非线程安全的。
(3)三者的执行效率:
StringBuilder > StringBuffer > String,这个是相对的,但不一定在所有情况下都是这样。应该根据不同情况来选择使用:
当字符串相加操作或者改动较少的情况下,建议使用String str = “abc” + "def"这种形式;
当字符串相加操作较多的情况下,建议使用StringBuilder,但如果需要进行多线程操作的话,建议选择使用StringBuffer。

猜你喜欢

转载自blog.csdn.net/weixin_42882887/article/details/82051657
今日推荐