从源码看Java中String,StringBuffer,StringBuilder的区别

    xiaoxiao2021-03-25  70

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence

      从这里看不出StringBuffer和StringBuilder的不同,String多实现了一个Comparable接口。      接着看String:

    /** The value is used for character storage. */ private final char value[];

      可以看到String内部是通过一个字符数组来存储的,这个final就可以很好解释为什么String不可变了。   我们再看下StringBuffer和StringBuilder的父类AbstractStringBuilder:

    /** * The value is used for character storage. */ char[] value;

      所以StringBuffer和StringBuilder是可变的。      这里贴几个StringBuffer中的方法:

    @Override public synchronized int length() { return count; } @Override public synchronized int capacity() { return value.length; } @Override public synchronized void ensureCapacity(int minimumCapacity) { if (minimumCapacity > value.length) { expandCapacity(minimumCapacity); } }

      可以发现都用synchronized修饰了,为了同步,加了锁。   而看StringBuilder源码中的方法,可以发现并没有加synchronized修饰,所以StringBuffer是线程安全的,而StringBuilder不是,而StringBuffer为了线程安全加了锁,自然会影响它的效率,所以StringBuilder的效率自然更高。   

    转载请注明原文地址: https://ju.6miu.com/read-34877.html

    最新回复(0)