java String StringBuffer StringBuilder的区别

从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

你可能感兴趣的:(java String StringBuffer StringBuilder的区别)