关于JAVA的==和equals问题!
publicclassTest{publicstaticvoidmain(Stringargs[]){Testtest1=newTest();Testtest2=newT...
public class Test {
public static void main(String args[])
{
Test test1 = new Test();
Test test2 = new Test();
System.out.println(test1 == test2);
System.out.println(test1.equals(test2));
}
}
为什么第二句结果是false?? 展开
public static void main(String args[])
{
Test test1 = new Test();
Test test2 = new Test();
System.out.println(test1 == test2);
System.out.println(test1.equals(test2));
}
}
为什么第二句结果是false?? 展开
12个回答
展开全部
这个的结果应该2个都是false,如果是String类型的话,第2个应该是是true。
原因是这样的,所有的对象都继承了Object,如果继承以后没有覆盖Object的equals方法的话,调用时会直接调用Object中的equals,而Object中的equals是这样写的:
public boolean equals(Object obj) {
return (this == obj);
}
所以,你的这段代码里 == 和equals是一样的。
但是,String类继承Object后,覆盖了equals,String中的equals是这样的:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
所以,String的equals会返回true。
原因是这样的,所有的对象都继承了Object,如果继承以后没有覆盖Object的equals方法的话,调用时会直接调用Object中的equals,而Object中的equals是这样写的:
public boolean equals(Object obj) {
return (this == obj);
}
所以,你的这段代码里 == 和equals是一样的。
但是,String类继承Object后,覆盖了equals,String中的equals是这样的:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
所以,String的equals会返回true。
展开全部
==比较的是地址, 而在Object类中equals也是比较的地址,你的这个Test类继承了Object类所以覆盖了的equals方法也是比较的地址,所以为false; 但是很多其他的类重写了equals方法,例如:String类,他的equals就是比较的内容,所以你把 Test test1 = new Test() ; Test test2 = new Test(); 改成String str1 = new String(); String str2 = new String(); 则返回true;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
两个结果都应该是false才对
每当你使用“new”关键字创建对象的时候,Java就会在内存中开辟一个空间用来存放这个对象,空间是有地址的,而地址是唯一的(可以把地址想像成是门牌号,一栋楼房里不能有两个相同的门牌号),“==”比较的就是这个门牌号。
你用了两次new,也就是说开辟了两个空间,这两个空间的地址各不相同(尽管你创建的都是同一个类的实例),所以第一句应该返回false。
第二个equals比较的是对象的String形式,如果你在类中添加一个toString方法(此方法的返回值就是对象的String形式):
public String toString() { return "Test"; } 这样equals将返回true。
因为在使用equals比较的时候,equals会自动调用“比较方”与“被比较方”的toString方法,如果它们的toString方法都返回相同的String,那么它们就是相等的。
每当你使用“new”关键字创建对象的时候,Java就会在内存中开辟一个空间用来存放这个对象,空间是有地址的,而地址是唯一的(可以把地址想像成是门牌号,一栋楼房里不能有两个相同的门牌号),“==”比较的就是这个门牌号。
你用了两次new,也就是说开辟了两个空间,这两个空间的地址各不相同(尽管你创建的都是同一个类的实例),所以第一句应该返回false。
第二个equals比较的是对象的String形式,如果你在类中添加一个toString方法(此方法的返回值就是对象的String形式):
public String toString() { return "Test"; } 这样equals将返回true。
因为在使用equals比较的时候,equals会自动调用“比较方”与“被比较方”的toString方法,如果它们的toString方法都返回相同的String,那么它们就是相等的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你用的是Object类型,equals和==是一样的作用,比较的都是地址
在String类型中,equals比较的是内容,==比较的是地址
希望能帮到你!呵呵……
在String类型中,equals比较的是内容,==比较的是地址
希望能帮到你!呵呵……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
==表示是同一个引用,而equals表示值是否相同。而这里明显你比较的是new的两个对象,他们的值是不相同的,你可以想想,如果这两个对象是同一个对象他们值才能相同,而他们不是同一个对象所以值肯定是不相同的 也可以这么说两个对象的地址是不同的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询