String 不可变类
存储在常量池中
改变字符串改变了对象
JVM特殊处理
String s="WE";
String s2="W"+"E";
0: ldc #2 // String WE
2: astore_1
3: ldc #2 // String WE
5: astore_2
6: return
String s="WE";
String s2="W"+"E";
String s3=new String("WE");
System.out.println(s==s2);true s与s2直接指向常量池存储的"WE"
System.out.println(s2==s3);false s3指向堆
string的常用方法
subString()截取字符串
equals()字符串比较 已重写 为比较内容
length() 字符串长度
intern()查找常量池中是否存在该字符串 native方法
String 不可变的好处
-
节省堆空间
-
多线程安全 共享
-
安全 Socket
-
做redis缓存快
StringBuilder 可变的且性能好
StringBuffer 可变且线程安全的
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
+=对String的影响
String s2 = "WE";
s2 += "ARE";
0: ldc #2 // String WE
2: astore_1
3: new #3 // class java/lang/StringBuilder
6: dup
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6 // String ARE
16: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: return
在方法体内 String类型变量传递的是副本
StringBuffer和StringBuilder是对象的引用