String问题好多人不是很清楚,这是以前的博文,详细的介绍了一下:点击打开链接
还有一部分上一篇没有介绍到,现补充一下。
看到好多都在问自字符串相加然后比较为什么不相等。下面简单说一下:
public class Final {
String a;
public Final(){
a="g";
}
public void display(){
System.out.println(a=="g");
}
public static void main(String []args){
Final f=new Final();
f.display();
}
}
运行结果为true
a和“g”都存在栈中的常量区,都指向同一个地址,所以为true。不明白的话可以参照开头博文的内容。主要说一说下面的情况。
public class Final {
String a;
public Final(){
a="g";
}
public void display(){
System.out.println(a+a=="gg");
}
public static void main(String []args){
Final f=new Final();
f.display();
}
}
运行结果为false
为什么为false呢,我们用反编译工具反编译一下看看代码:
import java.io.PrintStream;
public class Final
{
final String a = "g";
public Final()
{
}
public void display()
{
System.out.println((new StringBuilder(String.valueOf(a))).append(a).toString() == "gg");
}
public static void main(String args[])
{
Final f = new Final();
f.display();
}
}
对比发现,a+a在程序执行的时候编译成了(new StringBuilder(String.valueOf(a))).append(a).toString()。生成了新的类,存在了堆中。==比较的是引用,所以造成了比较结果为false。