【1】String类和StringBuilder类的区别
String类:
1、字符串都是常量,他们的值在创建之后是不可更改的
2、字符串的底层是一个被final修饰的数组,不能改变,是一个常量。即底层private final byte[] value;
3、进行字符串的相加,内存就会有多个字符串,占用空间多,效率低下。
StringBuilder类:
1、也称字符串缓冲区,可以提高字符串操作效率,即一个长度可以变化的字符串
2、底层也是一个数组,但是没有被final修饰,可以改变长度。byte[] value=new byte[16];
3、StringBuilder在内存中使用只有一个数组,占用空间少,效率高,若超出缓冲区默认容量,会自动扩容。
总之:字符串是常量,他们的值在创建之后是不可更改的,正因如此,在字符串相加时需要不断创建字符串对象,效率低。而字符串缓冲区可以支持可变的字符串,因此字符串拼接时始终是一个数组中完成,效率高。
【2】字符串拼接问题
public static void main(String[] args) {
String str="abc";
str+="def";
System.out.println(str);
}
分析:以上代码总共产生了三个字符串,分别是:"abc"、"def"、"abcdef", 引用变量str首先指向abc对象,最终指向拼接出来的新字符串对象即abcdef。
【3】StringBuilder类的构造函数和API
1、构造函数:
StringBuilder():构造一个不带任何字符的字符串生成器(底层是可变数组),其初始容量为16个字符。
StringBuilder(String str):构造一个字符串生成器,初始化为指定的字符串内容
2、StringBuilder类常用方法:
public static void main(String[] args) {
StringBuilder sb=new StringBuilder("hellojavaworld");
//增
sb.append("这是梦想");
System.out.println(sb);
//删
sb.delete(3, 6);//删除位置在[3,6)上的字符
System.out.println(sb);
sb.deleteCharAt(10);//删除位置在10上的字符
System.out.println(sb);
//改-插入
StringBuilder sb1=new StringBuilder("$2334654776");
sb1.insert(3,"/");//在下标为3的位置上插入
System.out.println(sb1);
//改-替换
StringBuilder sb2=new StringBuilder("$2你好吗3455345");
sb2.replace(3, 5,"我很好");//在下标[3,5)位置上插入字符串
System.out.println(sb2);
//查
StringBuilder sb3=new StringBuilder("adsfs");
for(int i=0;i<sb3.length();i++) {
System.out.println(sb3.charAt(i)+"\t");
}
System.out.println();
//截取
String str=sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
System.out.println(str);
System.out.println(sb3);
}
【4】面试题:String、StringBuilder和StringBuffer的区别?
1、String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可变的,直至这个对象销毁。
2、StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、setChartAt等方法改变其内容,一旦生成了最终的字符串,调用toString方法将其转变为String。
3、JDK1.5新增了StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高,通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder。
StringBuilder JDK1.5开始 效率高 线程不安全
StringBuffer JDK1.0开始 效率低 线程安全