A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马乔荣柱 中级黑马   /  2012-10-5 22:52  /  2394 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.从Object类中继承的equals方法,比较两个对象的地址
public boolean equals(Object obj){
        return this==obj;
}
2.若要比较两个对象的属性值(int类型),也需要重写equals方法,以Student类为例
class Student
{
        int s_id;
        public boolean equals(Object obj){
                if(obj instanceof Student){
                        Student s=(Student)obj;
                        return this.s_id==s.s_id;
                 }
        }
}
3.对于String类型的属性的值的比较,则不需要重写,直接
属性值A.equals(属性值B)

以上是我用自己的理解总结的,欢迎指整。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
本帖最后由 黄小贝 于 2012-10-6 03:06 编辑

楼主你好~我是来砸场子的~{:soso__3880293213992091465_4:}

首先不论楼主你的equal函数能不能通过编译~(可以自己试下)

让我们用实验证明~

import java.util.HashSet;
import java.util.Set;

public class Student {
        
        private int s_id;
        
        public Student(int sId) {
                s_id = sId;
        }
        
        /* public int hashCode() {
                 return s_id;
         }*/

        public boolean equals(Object obj) {
               
                if(this == obj){
                     return true;
                }
               
                if (obj instanceof Student) {
                        Student s = (Student) obj;
                        return this.s_id == s.s_id;
                }
               
                return false;//这是楼主不通过编译的原因
        }
        
        public static void main(String[] args) {
               
                Student student1 = new Student(1);
                Student student2 = new Student(1);
               
                Set<Student> set = new HashSet<Student>();
                set.add(student1);
                set.add(student2);
               
                System.out.println(set.size());//得到的结果是2
               
        }
}

我用了一个HashSet  add两个id一样Student对象~~然后我们可以很明显的发现~~打印值为2,也就是说~ 尽管重写equal方法~这两个对象还是被HashSet判断成不同~~

原因是什么~  因为没有重写 hashcode方法~

写到这里,我又手贱看了一下JDK源码,发现了为什么没有重写hashcode 就会有这样的结果~~

让我们一路跟踪到 HashMap的put方法~  哇咔咔~ 我也是今天才知道的~

  public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }





评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 技术分+10

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马