当前位置: 代码迷 >> J2SE >> java中能不能让两个new出来的对象能用==判断放回true,该怎么解决
  详细解决方案

java中能不能让两个new出来的对象能用==判断放回true,该怎么解决

热度:82   发布时间:2016-04-23 20:06:08.0
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呢
------解决思路----------------------
引用:
Quote: 引用:

==号比较的是内存地址,
如果你输出之前这样做:
t=t1;
输出的就是true了。

那就是无法用==返回true咯?那我之前看到别人的帖子说重写equals,然后调用重写的equals判断相等,其实本质就是调用了自己定义的方法啊,就比如我说a.equals(b),我调用了自己写的equals方法,这样的比较能说明两个是同一个对象么?=============================================================================================
另外,比如我自己的类里写的新的方法,equals(当前类 类名),这其实是重载了,然后调用equals,他应该会调用自己写的方法,而不会调用Object里面的equals方法吧?其实两个方法都符合,为什么优先调用自己的equals呢

对于第一个,的确是调用了自己写的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;
}
}
  相关解决方案