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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Nemo 中级黑马   /  2015-6-18 20:58  /  456 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

哈希表结构存储元素:
每个对象都有自己的哈希值,哈希表数据结构就是根据这个值进行存储的,但是由于这个值是系统确定且无序的,
因此存进去的时候数据就是无序的,往外取得时候是按照hash值从小到大取,因此存取不一定是一致的。
注意:如果两个对象的hash值一样(通常是不可能的,但是通过复写hashCode方法来自定义hash值),那么还
要再比较两个对象是否相等,调用equals方法。如果不相等,那么就在该hash值下再顺延出一片空间存储第二
个对象,如果相等,那么第二个就不存入集合了。
特点:
1.无序:
          每个对象的hash值是无法确定的,因此当我们将对象存入HashSet中时,我们无法知道它被存入hash表的哪个位置,但是当我们遍历hash表时,
是按照hash值从小到大遍历的,因此元素在被存入和取出时的顺序不一定是一致的。
2.不重复:
          hash表是如何保证数据不重复的呢?主要依赖于两个方法hashCode和equals,当我们将一个元素添加进hash表时,在HashSet底层的处理流程
如下:
        (1)通过对象的hashCode方法计算得到hash值
        (2)将此值于表中的元素的hash值进行比较
        (3)如果找不到相同的,那么就直接按照hash值存入hash表
        (4)如果找到相同的,那么调用该对象的equals方法与hash值一样的那个元素进行比较
        (5)如果不同,则在此hash值代表的空间下顺延一片空间存储自身对象
        (6)如果相同,则视为重复元素,不存储
在我们使用contains,remove等方法时,由于这些方法中都包含了在集合中查找是否有相同对象的操作,因此就要进行两个元素是否相等的比较:
对于ArrayList:是否相等只依赖于对象的equals方法。
对于HashSet:是否相等依赖于hashCode和equals方法。
原因:底层的数据结构的不同,依赖于hashCode是hash表的特点。
例子:
我们想将人对象存入HashSet中,相达到不重复(假定名字和年龄一样为重复元素)的效果,如果直接添加,打印,那么是会输出我们看来的
重复元素的,因为每个对象的hash值都是不同的,因此我们需要复写hashCode方法,希望姓名和年龄一样的对象的hashCode也是一样的,
同时也要复写equals方法,否则是否相同元素就是看地址了。代码如下:
  1. import java.util.*;
  2. class Person
  3. {
  4.         private String name;
  5.         private int age;
  6.         Person(String name,int age)
  7.         {
  8.                 this.name=name;this.age=age;
  9.         }
  10.         public String getName()
  11.         {return name;}
  12.         public int getAge()
  13.         {return age;}
  14.         public boolean equals(Object obj)
  15.         {
  16.                 if(!(obj instanceof Person))
  17.                         return false;
  18.                 Person p=(Person)obj;
  19.                 System.out.println(this.name+".....equals run....."+p.getName());
  20.                 return this.name==p.getName()&&this.age==p.getAge();
  21.         }
  22.         public int hashCode()
  23.         {
  24.                 return name.hashCode()+age*13;
  25.         }
  26. }
  27. class HashSetTest
  28. {
  29.         public static void main(String[] args)
  30.         {
  31.                 HashSet hs=new HashSet();
  32.                 hs.add(new Person("helong1",22));
  33.                 hs.add(new Person("helong2",23));
  34.                 hs.add(new Person("helong3",24));
  35.                 hs.add(new Person("helong1",22));
  36.                 hs.add(new Person("helong2",23));
  37.                 hs.add(new Person("helong3",24));
  38.                
  39.                 for(Iterator it=hs.iterator();it.hasNext();)
  40.                 {
  41.                         Person p=(Person)it.next();
  42.                         sop(p.hashCode()+"....."+p.getName()+"...."+p.getAge());
  43.                 }
  44.         }
  45.         private static  void sop(Object obj)
  46.         {System.out.println(obj);}
  47. }
复制代码




1 个回复

倒序浏览
欢迎指正 。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马