关于==与equals方法的区别的比较。为啥c==d?而a!=b?难道是因为我在声明的时候进行了初始化?c==d到底比较的是什么?
如果c==d,那么为什么i!=j============================================
a.equals(b)
c==d
c.equals(d)
i.equals(j)
a instanceof Object
c instanceof Object
a instanceof String
c instanceof String============================================
package com.test.model;public class TestEquals {
/**
* @param args
*/
public static void main(String[] args) {
String a=new String("abc");
String b=new String("abc");
String c;
String d;
// int c;
// int d;
c="123";
d="123";
Integer i= new Integer(1);
Integer j= new Integer(1);
if (a==b){
System.out.println("a==b");
};
if (a.equals(b)){
System.out.println("a.equals(b)");
}
if (c==d){
System.out.println("c==d");
}
;
if (c.equals(d)){
System.out.println("c.equals(d)");
}
// System.out.println(a);
// System.out.println(b);
if (i==j){
System.out.println("i==j");
};
if (i.equals(j)){
System.out.println("i.equals(j)");
}
if (a instanceof Object){
System.out.println("a instanceof Object");
}
if (c instanceof Object){
System.out.println("c instanceof Object");
}
if (a instanceof String){
System.out.println("a instanceof String");
}
if (c instanceof String){
System.out.println("c instanceof String");
}
}}
如果c==d,那么为什么i!=j============================================
a.equals(b)
c==d
c.equals(d)
i.equals(j)
a instanceof Object
c instanceof Object
a instanceof String
c instanceof String============================================
package com.test.model;public class TestEquals {
/**
* @param args
*/
public static void main(String[] args) {
String a=new String("abc");
String b=new String("abc");
String c;
String d;
// int c;
// int d;
c="123";
d="123";
Integer i= new Integer(1);
Integer j= new Integer(1);
if (a==b){
System.out.println("a==b");
};
if (a.equals(b)){
System.out.println("a.equals(b)");
}
if (c==d){
System.out.println("c==d");
}
;
if (c.equals(d)){
System.out.println("c.equals(d)");
}
// System.out.println(a);
// System.out.println(b);
if (i==j){
System.out.println("i==j");
};
if (i.equals(j)){
System.out.println("i.equals(j)");
}
if (a instanceof Object){
System.out.println("a instanceof Object");
}
if (c instanceof Object){
System.out.println("c instanceof Object");
}
if (a instanceof String){
System.out.println("a instanceof String");
}
if (c instanceof String){
System.out.println("c instanceof String");
}
}}
请lz看看论坛中其他的帖子,有不少关于这方面的讨论。
主要就是讨论==和equals的区别,以及boxing发面的问题
可以使用equals方法检测两个字符串是否相等。
如果字符串s与字符串t相等,则表达式s.equals(t)返回true;
否则返回false。
需要注意,s与t可以是字符串变量,也可以使字符串常量。
一定不能使用==运算符检测两个字符串是否相等!
这个运算符只能够确定两个字符串是否被放置在同一个位置。
当然,如果字符串放在同一个位置,他们必然相等。
但是,完全有可能将内容相同的两个字符串放在不同的位置上。
如果虚拟机总是将相同的字符串共享,就可以使用==运算符检测是否相等。
但实际上只有字符串常量是共享的,而+或substring等操作产生的结果都不是共享的。
因此,永远都不要使用==运算符的测试字符串的相等性,否则在程序中会出现很糟糕的bug,从表面上看很像随机产生的间歇性错误!
From《Java2核心技术第七版卷I,基础知识,Page49》
关于字符串变量常量的多看看吧,
论坛里面精华区有帖子 String类型的重点总结 收藏
说明:本文为自己耗力总结,转载请注明出处。
作者:zangxt
这是修改过的程序=========================================
package com.test.model;public class TestEquals {
public static void main(String[] args) {
String a=new String("abc");
String b=new String("abc");
String c;
String d; c="123";
d="123"; if (a==b){
System.out.println("a==b");
};
if (a.equals(b)){
System.out.println("a.equals(b)");
}
if (c==d){
System.out.println("c==d");
}
;
if (c.equals(d)){
System.out.println("c.equals(d)");
}
c=new String("123");
d=new String("123");
if (c==d){
System.out.println("c==d");
}
;
if (c.equals(d)){
System.out.println("c.equals(d)");
} }}
========================
这是执行结果:
a.equals(b)
c==d
c.equals(d)
c.equals(d)
可以看出来。对c,d变脸进行new初始化后。b==c就不成立了。
String c="123";
String d="123";
会导致虚拟机的常量共享。所以c和d指向通过一个地址。c==d成立。
String c=new String("123");
String d=new String("123");
c和d现在是两个分配在堆内存的变量,因此c==d不成立。虽然c和d指向的地址中保存的值相同。高手给个指导,点评一下我的看法。
String c = new String("123");
String d = new String("123");
c == d ? false
d = c;//d指向了c指向的内存地址
c == d ? true
当“==”左右为基本八个变量时,是比较他们相等不相等;
当“==”左右为对象时候,看其是否是同一个对象,即是
不是在同一个同存(和原始Object类中的equals()方法一样),
但是很多类中都重写了equals()方法,要看其具体是什么作用才行。
我感觉 的就是这样,不知道对你有没有帮助。加油,楼主。
帖子我看了。心情变得很坏。
帖子里说话跟绕口令是的,并且堆、栈不分。
并且我觉得那个帖子说明了在以下情况下为什么s1!=s2.
String s1 = "Java";
String s2 = new String("Java");
但我要问的是为什么在下面的情况里s1=s2;
String s1 = "Java";
String s2 = "Java";
是因为s1和s2都指向了栈中同一个地址,还是说s1==s2比较的是栈里的值?
用这种方式初始化,此时,虚拟机会将 把“Java”放进一个 stringPool 里面String s2 = "Java";
再进行这个变量的初始化时,虚拟机会看那个StringPool里面是否有这个字符串,有的话,就把s2指向这个字符串。这样一来,s1 和 s2 指向的是同一个地址。而 == 比较的是对象的内存地址,所以,就相等了
请问
String c = "123";
String d = "123";
的情况下c==d相当与123==123还是c和d在栈内的地址进行比较?