文章目录
String、StringBuffer 和 StringBuilder 区别
String、StringBuffer和StringBuilder三者都是Java中用来处理字符串的类
然而,因为String 是不可变的类,因此一旦创建了String 对象,其值就不能被修改。任何对String 的操作都会返回一个新的String 对象。
所以在字符串拼接时候如果使用String 的话性能会很低,因此我们需要使用另一个类型StringBuffer ,它提供了append方法可用于字符串的拼接,并用synchronized来保证了线程安全。
因为StringBuffer 使用了synchronized 来保证线程安全,所以它的性能不是很高,于是JDK1.5后添加了StringBuilder,它同样提供了append拼接字符串的方法,但它没有使用synchronized 来保证线程的安全,在性能上要优于StringBuffer,因此在非并发操作的环境下可以使用性能更高的StringBuilder 来对字符串进行操作。
因此:StringBuffer的出现用来解决单线程下String不能够拼接的问题的,也就是String不能修改对象的值,然而因为StringBuffer 用了synchronized关键字修饰,所以它的性能比较低,所以在StringBuilder 是用来解决单线程下StringBuffer性能低下的问题的。
一、 String类
1 创建字符串
-
最简单的方式:
String str = "Runoob";
在代码中遇到字符串常量时,这里的值是 “Runoob”,编译器会使用该值创建一个 String 对象。这种方式其实在字符串池中创建,并将Runoob地址赋给str。 -
用构造函数创建:
String str2=new String("Runoob");
使用new 关键字创建的字符串对象在堆上,并将对象地址赋给str2。 -
注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。
比如:
String str1 = "hello";
String str2 = "hello";
str1和str2的地址其实是不一样的,每次创建都是创建了个新的对象
再比如:
String str1 = "hello";
System.out.println(System.identityHashCode(str1)); //460141958
str1 = str1+"world";
System.out.println(System.identityHashCode(str1)); //1163157884
str1 的地址和经过修改后的str1 地址是不同的,原因是str1 在字符串公共池中有一个地址,然后str1 拼接了 world,此时会在字符串池中再创建一个字符串对象并将修改后的字符串也就是helloworld 赋值给str1,而此时的str1对象和上面的str1 对象已经不是同一个了。
因此创建了String对象后,其值是不可被修改的,只会创建新的对象将修改后的值赋值给新的字符串对象
二、StringBuffer类
当对字符串进行修改时候,单线程不用担心考虑性能,考虑到线程安全的情况下使用StringBuffer创建字符串对象。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象。
使用StringBuffer对字符串的相关操作
1 创建字符串
public class StringBufferTest2 {
public static void main(String[] args) {
StringBuffer str = new StringBuffer();
str.append("hello");
System.out.println(str); //hello
}
}
append方法:public StringBuffer append(String s)
将指定的字符串追加到此字符序列。
2 在字符串指定位置插入
public class StringBufferTest2 {
public static void main(String[] args) {
StringBuffer str = new StringBuffer();
str.append("hello");
str.insert(2,"world");
System.out.println(str); //heworldllo
}
}
insert()方法,在指定位置插入指定的字符串
3 字符串指定位置删除
public class StringBufferTest2 {
public static void main(String[] args) {
StringBuffer str = new StringBuffer();
str.append("heworldllo");
str.delete(2,7);
System.out.println(str); //hello
}
}
delete() :在指定位置删除,将2-7不包括7的位置删除掉
4 其他
使用StringBuffer类创建对象对字符串操作改变的是自身对象的值
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello");
System.out.println(System.identityHashCode(stringBuffer)); //460141958
stringBuffer.insert(2,"world");
System.out.println(System.identityHashCode(stringBuffer)); //460141958
}
}
如上先是创建了StringBuffer对象stringBuffer ,然后追加了字符串hello,打印出地址值为 460141958 ,然后在2的位置后插入字符串 world ,此时stringBuffer 的值是已经被改变,打印出地址值还是460141958 ,因此使用StringBuffer创建的对象是操作的对象自身
三、StringBuilder类
和StringBuffer类的方式和方法完全一样
使用StringBuilder创建字符串
public class StringBuilderTest1 {
public static void main(String[] args) {
StringBuilder str = new StringBuilder();
str.append("hello");
System.out.println(str);
}
}
四、总结
什么时候使用String、StringBuffer和StringBuilder呢
- 操作少量的数据:适用String
- 单线程操作字符串缓冲区下操作大量数据:适用StringBuilder,因为操作大量数据单线程性能低,StringBuffer不适合
- 多线程操作字符串缓冲区下操作大量数据:适用StringBuffer