String,StringBuffer,StringBuild

String(不可变的字符序列)

String类被final修饰,底层数据结构为被final修饰的char型value数组,且String类没有提供修改value数组元素值的方法,故String具有不可变性。

不可变的好处:

1.缓存hash值,因为String的hash值会经常用到,比如String做HashMap的key,那么String不可变保证hash值不可变,只需要计算一次,提高计算效率,

2.String Pool 字符串常量池,一旦字符串String 被创建,下次创建相同的字符串就可以从常量池直接取,也只有当String是不可变才能这样做,

3.安全String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。
4.线程安全 String是不可变的,保证了线程的安全,

StringBuffer、StringBuild(可变的字符序列)

1)StringBuffer是使用缓冲区的,本身也是操作字符串的,但与String类不同,String类中的内容一旦声明之后不可改变,改变的只是其内存地址的指向,而StringBuffer中的内容是可以改变的。对于StringBuffer而言,本身是一个具体的操作类,所以不能像String那样采用直接赋值的方式进行对象实例化,必须通过构造方法完成。
2)StringBuilder 类在 Java 5 中被提出,由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
3)扩容机制

无参构造器默认容量16;有参构造器默认容量为参数length+16;或者指定容量
public StringBuffer() {
        super(16);
    }
    public StringBuffer(int capacity) {
        super(capacity);
    }
    public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }
    public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }


//扩容为原来的两倍加2
 private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

StringBuild和 StringBuffer (所有方法用synchronized做同步)之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。


版权声明:本文为qq_43645690原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。