String
是java中的引用数据类型,String类是一个final类,不可以被继承,底层使用char数组实现的,因为数组被final修饰所以不可以动态的改变对象的值,是字符串常量,那么显然是线程安全的
String s1="hello";
String s1="world";
如上不是改变了s1的值,而是s1指向了新的地址,"hello"还在常量池中
字符串的拼接
String s1="hello";
String s2="world";
String s3=s1+s2;
或者String s3=new String("hello")+new String("word")
就需要创建3个对象,空间浪费,效率慢,而使用那两个类就可以用append方法
new StringBuilder().append("hello").append("world")
只需要创建一个对象,效率快
区别于String s="hello"+"world";这样效率是最快的,因为JVM根本认为就是String s="helloworld";
StringBuilder和StringBuffer都继承自AbstractStringBuilder
StringBuilder
线程不安全,效率高,数组初始容量是16,数组动态扩容,如果长度超过了字符串存储空间大小就需要进行扩容,它会重新分配内存,创建一个更大的数组,这个数组的容量是原来的 2 倍 + 2 的大小,并将原先的数组复制过来,再丢弃旧的数组,扩容方法在AbstractStringBuilder中
StringBuffer
线程安全,效率低,数组初始容量是16,数组动态扩容,如果长度超过了字符串存储空间大小就需要进行扩容,它会重新分配内存,创建一个更大的数组,这个数组的容量是原来的 2 倍 + 2 的大小,并将原先的数组复制过来,再丢弃旧的数组