Java字符串常量
静态常量池指的是class字节码中,声明的常量部分
Test1
代码
public class Main {
private static final String filedA = "a";
public static void main(String[] args) {
String filedB = "b";
}
}
javap 反编译后结果
#5 = Utf8 filedA
#20 = Utf8 filedB
#24 = Utf8 b
#27 = Utf8 a
Test2
代码
public class Main {
private static final String filedA = "a" + "b";
public static void main(String[] args) {
String filedB = "b";
}
}
javap 反编译后结果
#5 = Utf8 filedA
#20 = Utf8 filedB
#24 = Utf8 b
#27 = Utf8 ab
Test3
代码
public class Main {
public static void main(String[] args) {
String filedA = "a";
String filedB = "b";
String filedC = filedA + filedB;
String filedD = filedA + "c";
}
}
javap 反编译后结果
#22 = Utf8 filedA
#24 = Utf8 filedB
#25 = Utf8 filedC
#26 = Utf8 filedD
#30 = Utf8 a
#31 = Utf8 b
#35 = Utf8 c
由结果看出,filedC的值(ab)和filedD的值(ac)并没有出现在常量池中,由+号直接对字符串连接的,常量池中直接放连接后的结果,由+号对常量的引用进行连接的,常量池中不会放入计算结果
Test4
代码
public class Main{
public static void main(String[] args){
String filedA = "a";
String filedB = new String("a");
String filedC = new String("b");
System.out.println(filedA==filedB);// 运行后结果为false
}
}
javap 反编译后结果
#21 = Utf8 filedA
#23 = Utf8 filedB
#24 = Utf8 filedC
#32 = Utf8 a
#35 = Utf8 b
new的过程会创建一个对象,filedB和filedC的值是一个引用地址,而filedA的值是一个字面量,所以filedA==filedB的结果为false
intern()用法
代码
public class Main {
public static void main(String[] args){
String filedA = "a";
String filedB = new String("a");
System.out.println(filedA==filedB); // false
String filedC = filedB.intern();
System.out.println(filedA==filedC); // true
}
}
intern的作用是,初始化的时候,从常量池取值,常量池中存在就从常量池中获取,不存在就创建一个,然后返回常量池中的值