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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范龙波 高级黑马   /  2013-4-30 17:17  /  1495 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 范龙波 于 2013-4-30 23:20 编辑

import java.util.*;
class Persion
{
        private String name;
        private int Age;
        public String Getname()
        {
                return name;
        }
        
        public int GetAge()
        {
                return Age;
        }
        public int hashCode()    //这个方法是怎么被主函数调用的
        {
                return 60;
        }
        public boolean equals(Object obj)//这个函数是怎么被主函数调用的啊,我创建的Persion对象里也没用到equals这个方法啊怎么他自己就用上了呢??
        {
                if(!(obj instanceof Persion))
                        return false;
                Persion p=(Persion)obj;
                System.out.println(this.name+"......"+p.name);
                return this.name.equals(p.name)&&this.Age==p.Age;
        }
        public  Persion(String name,int Age)
        {
                this.name=name;
                this.Age=Age;
        }
}
class HashListDemo
{
        public static void main(String[] args)
        {
               
                HashSet a=new HashSet();
                a.add(new Persion("张三",11));
                a.add(new Persion("李四",22));
                a.add(new Persion("李四",22));

                a.add(new Persion("王二麻子",31));
                Iterator f=a.iterator();
                while (f.hasNext())
                {
                                Persion p=(Persion)f.next();
                                sop(p.Getname()+"\t"+p.GetAge());
                }

        }
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
你使用HashSet存储元素 都是要判断equals和hashCode的方法的 都是默认调用进行判断的  你可以在equals和hashCode的方法里写上输出语句试试
回复 使用道具 举报
equals和hashCode可以判断HashSet集合中元素的唯一性

评分

参与人数 1黑马币 +3 收起 理由
范龙波 + 3 很给力!

查看全部评分

回复 使用道具 举报
吴东泽 发表于 2013-4-30 17:28
你使用HashSet存储元素 都是要判断equals和hashCode的方法的 都是默认调用进行判断的  你可以在equals和has ...

是不是HashSet a=new HashSet() 的时候equals和hashCode的方法就被调用了???
回复 使用道具 举报
范龙波 发表于 2013-4-30 18:10
是不是HashSet a=new HashSet() 的时候equals和hashCode的方法就被调用了???

明白了 谢谢 当equals里的结果为true的时候只打印一次就停止了,当equals为false时可以全部打印出来。有些明白怎么回事了。:victory:
回复 使用道具 举报
创建HashSet时其实是创建了一个HashMap
public HashSet() {
        map = new HashMap<>();
    }
那调用add()方法时,实际操作是这个
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
map中的操作就是下面这个了
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;
    }

代码虽然不太好懂,但起码可以看到它调用了传入元素的hashCode和equals方法,而且equals方法时在hash值相等后才调用的。
看不懂没关系,起码这几段源代码证明了元素在存入HashSet时,就调用了元素的hashCode和equals方法

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
403383221 发表于 2013-4-30 18:32
创建HashSet时其实是创建了一个HashMap
public HashSet() {
        map = new HashMap();

明白了,更理解了谢谢
回复 使用道具 举报
黄玉昆 黑马帝 2013-4-30 23:12:21
8#
如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马