当前位置: 代码迷 >> J2SE >> String编译器优化有关问题
  详细解决方案

String编译器优化有关问题

热度:26   发布时间:2016-04-24 00:36:43.0
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,然后通过符号引用去字符串常量……
  相关解决方案