JAVA面试题----------String、StringBuilder和StringBuffer

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 的大小,并将原先的数组复制过来,再丢弃旧的数组

基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer

猜你喜欢

转载自blog.csdn.net/wangdongli_1993/article/details/81102096