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。
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。
解决方案 »
- Java泛型的一个问题
- 江湖救急:JAVA XML判定标签结束
- Java中如何调用C# dll中的带有List参数的函数及返回List对象(Java JNI高手,Help!)
- 求助:用java语句如何得到XML中ELEMENT的值??
- 如下的一个小程序为什么进入循环之后无法退出呢? 请达人指教 小生感谢各位
- 那里有大量java源代码?
- 新手求教 System.out.println与System.out.print区别
- 解答后立即给分100分呀
- java组合
- 再问tomcat3.3.1的目录禁止的问题?
- ArrayList如何判断一个符合条件的类的实例是否存在?
- 我的数据库插入文本代码哪里错了 求高手解释。 万分感谢
其他的区别先不说最大的区别在于:= =相对于栈中数据的比较; equals相对于堆中数据的比较; 其次:针对第一个例子
先在栈中创建一个对 String类的对象引用变量i,然后通过符号引用去字符串常量池 里找有没有"b",如果没有,则将"b"存放进字符串常量池 ,并令i指向”b”,如果已经有”b” 则直接令i指向“b”。
同样的b最后的结果为"ab",将“ab”存放进字符串常量池,并令b指向“ab”,如果已经有”ab” 则直接令b指向“ab”.
a的如上,最后结果为“ab”,因为已经存在,所以直接令a指向"ab",最后用==或者equals都是为true再次:针对第二个例子
null是对象,String i = null
对于对象的创建,一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象。
所以即使最后a和b的值一样,用==指向的两个相同值的空间,所以为false,而equals仍然为true。最后:这个就是考虑的Java的内存关系,栈内存定义变量,堆内存开辟空间。这是我的一点小理解,随时探讨,呵呵。
final只对引用的"值"(即内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象 的变化,final是不负责的。