从String源码中可以看出,对于一个String对象,任何改变操作都不会改变原有的对象,而是生成新的对象 例如:
String str = new String("hello");
str = str+"world";
在上述代码中首先 一个String对象str 进行了一个字符串相加,在这个过程中已经生成了一个新的String对象并把 引用指向str。
在下面这段代码中
String s = new String("abc");
for(int i=0;i<10000;i++){
s += "m";
}
在循环中会生成10000个String 对象。
而StringBuilder则不会
StringBuilder sb = new StringBuilder("abd");
for(int i=0;i<10000;i++){
sb.append("m");
}
则只是对之前new 的对象进行append。
在这样的场景下,StringBuilder就比String高效
但是在这样的场景下则不同
String str = "hello"+"world";
StringBuilder sb = new StringBuilder().append("hello").append("world")
字符串相加的方式效率更高,因为在编译的时候就确定了值。
所以在改动较少和简单的字符串相加的情况下就用 String
在字符串相加较多的情况下就用StringBuilder。
StringBuilder 和 StringBuffer的区别
从源码中可以看出两者间的属性和方法大致一样,但是StringBuffer有一个特别的地方
@Override
public synchronized int length() {
return count;
}
@Override
public synchronized int capacity() {
return value.length;
}
@Override
public synchronized void ensureCapacity(int minimumCapacity) {
super.ensureCapacity(minimumCapacity);
}
以上是StringBuffer的部分源码,事实上StringBuffer上很多方法都加上了锁 synchronized,所以它是线程安全的
在需要线程安全的时候就可以使用StringBuffer
网友评论