日期:2014-05-20  浏览次数:20705 次

String编译器优化问题
public class fourtest {
public static final String i = "b";

public static void main(String args[]) {
String b = "ab";
String a = "a" + i;
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
输出 true, ture。 这个结果是编译器优化的结果。

public class fourtest {
public static final String i = null;

public static void main(String args[]) {
String b = "anull";
String a = "a" + i;
System.out.println(a == b);
System.out.println(a.equals(b));
}
}

输出 false ,true。 这个时候为啥不是true,true。

------解决方案--------------------
这种问题,你用jd-gui反编译一下生成的class文件就明白了

探讨

第一个例子中,i是final的。不定义final。 则输出 false, true 。 1楼能解释这个问题么
引用:

首先:楼主要搞清楚==和equals的区别
其他的区别先不说最大的区别在于:= =相对于栈中数据的比较; equals相对于堆中数据的比较;

其次:针对第一个例子
先在栈中创建一个对 String类的对象引用变量i,然后通过符号引用去字符串常量……

------解决方案--------------------
这种问题,你用jd-gui反编译一下生成的class文件就明白了

探讨

第一个例子中,i是final的。不定义final。 则输出 false, true 。 1楼能解释这个问题么
引用:

首先:楼主要搞清楚==和equals的区别
其他的区别先不说最大的区别在于:= =相对于栈中数据的比较; equals相对于堆中数据的比较;

其次:针对第一个例子
先在栈中创建一个对 String类的对象引用变量i,然后通过符号引用去字符串常量……