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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙国军 中级黑马   /  2012-4-17 12:51  /  1855 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙国军 于 2012-4-17 12:53 编辑


这是毕老师讲课视频中讲解HashSeet集合类时所截取的图片;

问题:
        这样做的目的,是为了多次向HashSeet集合类的对象hashSeet集合中存入自定义对象时,可以把对象存入集合hashSeet时,获得的哈希值都设为是60;以方便于自定义对象的内容的互相比较排序;
        但是这样做,不就是相当于存入集合hashSeet中的自定义对象的哈希值都相同,即地址值相同,一个地址值可以存入多个对象吗??这边我不能理解,大家帮忙看看能不能解答下???

4 个回复

正序浏览
理@想 发表于 2012-4-17 16:47
import java.util.*;

/*

对象不是在建立的时候,就在堆内存中开辟一个空间吗??如果这样的话,那么开辟的这个空间的地址值应该是独有的啊 ???

如果可以存入多个对象,那么相当于别的对象在建立的时候,就把它硬塞进这个已经开辟的空间中,这样做,怎么感觉怪怪的啊 ??
回复 使用道具 举报

import java.util.*;

/*
往hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素。
*/
class HashSetTest
{
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
        public static void main(String[] args)
        {
                HashSet hs = new HashSet();

                hs.add(new Person("a1",11));
                hs.add(new Person("a2",12));
                hs.add(new Person("a3",13));
                hs.add(new Person("a2",12));
                hs.add(new Person("a4",14))

                Iterator it = hs.iterator();

                while(it.hasNext())
                {
                        Person p = (Person)it.next();
                        sop(p.getName()+"::"+p.getAge());
                }
        }
}
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
       
        public int hashCode()如果没有覆盖hashCode方法则不会运行equals方法,因为对象已经用自己的hashCode开辟了存储空间,就没必要在进行equals比较了
        {
                System.out.println(this.name+"....hashCode");
                return 60;
        }

        public boolean equals(Object obj)
        {

                if(!(obj instanceof Person))
                        return false;

                Person p = (Person)obj;
                System.out.println(this.name+"...equals.."+p.name);

                return this.name.equals(p.name) && this.age == p.age;
        }

       
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
如果没有覆盖hashCode方法则不会运行equals方法,因为对象已经用自己的hashCode开辟了存储空间,就没必要在进行equals比较了。覆盖hashCode方法后,首先在3c位置存入第一个对象,在存入第二个对象时与第一个对象进行比较,不相同则在第一个对象下沿存入第二个对象,依次类推。
java规定: 1.如果两个对象相同,那么它们的hashCode值一定要相同;
           2.如果两个对象的hashCode相同,它们不一定相同.
因此我认为一个哈希值可以存多个对象。
初学java多多指教。
回复 使用道具 举报
HashSet存放数据时采用的数据结构是哈希表,HashSet有两个属性:容量capacity和大小size。
哈希表的每个位置可以称为桶,容量即为桶的数量。
大小即为元素的数目,capacity是可以比size小的,hashCode相同时,也就是发生哈希冲突的时候,他们被放在一个桶里面,在桶里面以链表的形式存放
回复 使用道具 举报
hashcode的作用:
1.提高查找元素的效率
2.每个对象可以计算出一个哈希值,可以将哈希值分组,每组分别对应某个存储区域,根据一个对象的哈希值就可以对应该存储的区域。一个哈希值存储区域可以对应多个对象。但是这些对象都是不相同的。相同的哈希值下对象也相同则为重复元素,不能存入hashSet集合中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马