前言
Java中字符串类型的声明包括String、StringBuffer、StringBuilder,这三种字符串类型各有特点,在使用时根据其特点使用。
String类型
String类型是程序员最常用的类型,每个字符串是一种对象。创建对象我们可以使用构造函数创建,如:
String str = new String("abc");
此时创建一个全新的对象,不会使用字符串池中对象。
我们常用方式是下面方式,这种方式和并非是基本数据类型的赋值,而是创建一个新的对象,等同于使用构造函数创建对象的方式,不同的是在创建对象前会在字符串池中找“abc”这个对象是否存在,如果存在复用这个对象
String str ="abc";
String使用final修饰类,一旦创建完成则不允许修改。换句话说String的值是不可变的,这就导致每次对String的操作都会生成新的String对象。如:
String str = "abc";
Str = str +"d";
这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“abcd”字符串也相应的需要开辟内存空间。
StringBuffer 和 StringBuilder
和 String 类不同的是StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的使用对象。如:
StringBuilder aa = new StringBuffer(“abc”);
aa.append(“d”)
无需开辟新的内存空间。StringBuffer和StringBuilder功能相同,不同的StringBuffer线程安全,但效率低,一般用于多线程。而StringBuilder线程不安全,但效率高。
三种字符串类型使用场景
如果要操作少量的数据(也就是字符串很短,而且变化少
)用 String;字符串很长,如字符串代表一篇文章或一部小说(修改一个标点符号,内存里再产生一个新的对象,不划算),此时用StringBuffer或StringBuilder,多线程下使用StringBuffer,单线程操作字符串缓冲区下操作大量数据 StringBuilder。
字符串的拼接
当字符串使用String时,拼接使用+;如:
String str="abc";
str ="hello"+str+"okkk";
实际上执行时转换为以下代码
(new StringBuilder("hello")).append(str).append("okkk").toString();
使用"+"进行拼接时有很好的可读性,对于单个字符串的拼接时,性能和使用append差不多。但如果结构比较复杂,如使用循环来连接字符串,就不如使用StringBuilder。如:
String str="abc";
for(int i=0;i<10;i++){
str = str + i;
}
使用“+”需要创建10个StringBuilder对象。