String类和StringBuilder、StringBuffer
String类
生成的字符串是不可变的,里面有final定义的char[],所以每次改变字符串其实是重新生成一个新的String对象
源码如下:
编译特点:编译器在编译的时候会把一个变量赋值的两个不变的字符串并在一块
package com.demo.String;
public class TestString2 {
public static void main(String[] args) {
//编译器做了优化,直接在编译的时候将字符串进行了拼接
String str1="hello"+"java"; //相当于str1=“hello java”
String str2="hellojava";
//str1与str2是同一对象,即证明了这一观点
System.out.println(str1==str2);
String str3="hello";
String str4="java";
//编译的时候编译器不知道变量里面是什么值,所以没办法在编译的时候优化
String str5=str3+str4;
System.out.println(str5==str2);
}
}
StringBuffer和StringBuilder
StringBuffer:线程安全,做线程同步检查、效率低
StringBuilder:线程不安全,不做线程同步检查、效率高,通常方法中就用这个,方法不涉及线程
两者源码设计结构几乎一模一样,所以用法也一模一样
package com.demo.String;
//测试字符串相关类
public class TsetString {
public static void main(String[] args) {
String s1 = new String("abcd");
StringBuilder sb=new StringBuilder("ABC");
// StringBuffer sbf=new StringBuffer("ABC");//效率低
sb.append(",I can sing my abc!");
sb.insert(0,"爱").insert(0,"我");//插入字符串
System.out.println(sb);
sb.delete(0,2);
System.out.println(sb);
sb.deleteCharAt(0).deleteCharAt(0);//删除某个字符
System.out.println(sb.charAt(0));//获取某个字符
System.out.println(sb.reverse());//字符串逆序
}
}
可变和不可变序列使用陷阱
产生5000个对象,直接裂开