java中能不能让两个new出来的对象能用==判断放回true,该怎么解决
java中能不能让两个new出来的对象能用==判断放回true
package yzqdayself;
public class TestObjectEquals
{
public String name;
public int age;
public TestObjectEquals(String name,int age){
this.name=name;
this.age=age;
}
@Override
public boolean equals(Object o){
TestObjectEquals t=(TestObjectEquals)o;
if(this.name.equals(t.name)&&this.age==t.age)
return true;
return false;
}
@Override
public int hashCode(){
return name.length()+age;
}
public static void main(String[] args)
{
TestObjectEquals t=new TestObjectEquals("zhangsan", 18);
TestObjectEquals t1=new TestObjectEquals("zhangsan", 18);
System.out.println(t.equals(t1)); //true
System.out.println(t==t1);//是false
}
}
java中比如hashset里面重写hashcode和equals方法。就不会重复添加内容相同的对象,底层貌似是用hashcode和equals判断的,那java如上面 System.out.println(t==t1);//是false,能否返回值是true呢
------解决思路----------------------
对于第一个,的确是调用了自己写的equals方法,然后判断两者是否相等,这里所谓的相等是基于你写的equals方法而言的,可能两个年龄相同的学生对象就是相等的,但这两个对象不是同一个对象,分别有不同的内存地址,所以“这样的比较能说明两个是同一个对象”是不正确的。
对于第二个,是设计好的内部规则,虚拟机会根据方法名先找与自己实际引用类型相同的那个类下面的同名方法(参数类型也是符合的),如果没找到,然后再找超类中符合条件的。
具体参考核心卷 5.1.3动态绑定章节,部分内容如下


------解决思路----------------------
两个new出来的对象 使用== 比较不可能相等。
重新equals 方法 和 hashcode方法,只是为了通过在比较两个对象的内容上是否相等,从而判断这两个对象是否相等,这个只是业务上的相等,不是java里面的== 的相等。
------解决思路----------------------
java如果能和C++一样重载运算符的话可能还可以
------解决思路----------------------
Java中没有C++中的运算符重载、指针这样的语法,从而使Java在语法上简单了很多(C++--)
另外,HashSet底层是采用这样的机制来判断的:
1st & ( 2nd
------解决思路----------------------
3rd )
hashCode( ) & ( ==
------解决思路----------------------
equals( ) )
对应jdk源码中是这样的:
再加个小例子:
package yzqdayself;
public class TestObjectEquals
{
public String name;
public int age;
public TestObjectEquals(String name,int age){
this.name=name;
this.age=age;
}
@Override
public boolean equals(Object o){
TestObjectEquals t=(TestObjectEquals)o;
if(this.name.equals(t.name)&&this.age==t.age)
return true;
return false;
}
@Override
public int hashCode(){
return name.length()+age;
}
public static void main(String[] args)
{
TestObjectEquals t=new TestObjectEquals("zhangsan", 18);
TestObjectEquals t1=new TestObjectEquals("zhangsan", 18);
System.out.println(t.equals(t1)); //true
System.out.println(t==t1);//是false
}
}
java中比如hashset里面重写hashcode和equals方法。就不会重复添加内容相同的对象,底层貌似是用hashcode和equals判断的,那java如上面 System.out.println(t==t1);//是false,能否返回值是true呢
------解决思路----------------------
对于第一个,的确是调用了自己写的equals方法,然后判断两者是否相等,这里所谓的相等是基于你写的equals方法而言的,可能两个年龄相同的学生对象就是相等的,但这两个对象不是同一个对象,分别有不同的内存地址,所以“这样的比较能说明两个是同一个对象”是不正确的。
对于第二个,是设计好的内部规则,虚拟机会根据方法名先找与自己实际引用类型相同的那个类下面的同名方法(参数类型也是符合的),如果没找到,然后再找超类中符合条件的。
具体参考核心卷 5.1.3动态绑定章节,部分内容如下
------解决思路----------------------
两个new出来的对象 使用== 比较不可能相等。
重新equals 方法 和 hashcode方法,只是为了通过在比较两个对象的内容上是否相等,从而判断这两个对象是否相等,这个只是业务上的相等,不是java里面的== 的相等。
------解决思路----------------------
java如果能和C++一样重载运算符的话可能还可以
------解决思路----------------------
Java中没有C++中的运算符重载、指针这样的语法,从而使Java在语法上简单了很多(C++--)
另外,HashSet底层是采用这样的机制来判断的:
1st & ( 2nd
------解决思路----------------------
3rd )
hashCode( ) & ( ==
------解决思路----------------------
equals( ) )
对应jdk源码中是这样的:
e.hash == hash && ((k = e.key) == key
------解决思路----------------------
key.equals(k))
再加个小例子:
public class TestHashSetJdk{
public static void main(String[] args){
Set<Student> set = new HashSet<Student>();
Student s1 = new Student("小明");
Student s2 = new Student("小强");
set.add(s1);
set.add(s1); //再次添加同一个对象
set.add(s2); //比较组
for(Student s : set)
System.out.println(s.name);
}
}
class Student{
String name;
public Student(String name){
this.name = name;
}
@Override
public int hashCode(){
return 1;
}
@Override
public boolean equals(Object obj){
return false;
}
}