package test;
public class Test4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s="a"+"b"+"c";
System.out.println(s=="abc");
String t="a";
t=t+"b";
t=t+"c";
System.out.println(t=="abc");
}
}
输出结果:
true
false
这里说明
String s="a"+"b"+"c";
不等同于
String s="a";
s=s+"b";
s=s+"c";
这是因为s="a"+"b"+"c";直接被JVM视作s="abc",
而String s="a";//这里创建一个“a”的字符串在方法区常量池里,s指向它,
s=s+"b";//这里再创建一个“ab”的字符串在方法区常量池里,s指向它,“a”的字符串并没有被删除
s=s+"c";//这里又创建一个“abc”的字符串在方法区常量池里,s指向它,“a”及“ab”的字符串都没有被删除
这个过程会产生很多字符串,很耗内存,建议直接用上面的方式去处理字符串。
要理解这个过程,需要对的方法区常量池及String的是finally的类有所了解。