Java-HashSet类

  • 内容
  • 评论
  • 相关

Set是Collection子接口,模拟了数学上的集的概念

-----------------------------------------------------------------------

Set集合存储特点:

1):不允许元素重复.

2):不会记录元素的先后添加顺序.

-----------------------------------------------------------------------

Set只包含从Collection继承的方法,不过Set无法记住添加的顺序,不允许包含重复的元素。当试图添加两个相同元素进Set集合,添加操作失败,add()方法返回false。

Set判断两个对象是否相等用equals,而不是使用==。也就是说两个对象equals比较返回true,Set集合是不会接受这个两个对象的。

在一般的数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较.

此时的查询效率依赖于查找过程中所进行的比较次数.

-------------------------

如果元素的值(value)和在数组中的索引位置(index)有一个确定的对应关系(hash).

公式为:   index =   hash(value);

那么对于给定的值,只要调用上述的hash(value)方,就能找到数组中取值为value的元素的位置.

HashSet是Set接口最常用的实现类,顾名思义,底层才用了哈希表(散列/hash)算法.

其底层其实也是一个数组,存在的意义是提供查询速度,插入速度也比较快,但是适用于少量数据的插入操作.

HashSet中如何判断两个对象是否相同问题:

1):两个对象的equals比较相等.   返回true,则说明是相同对象.

2):两个对象的hashCode方法返回值相等.

对象的hashCode值决定了在哈希表中的存储位置.

二者:缺一不可.

当往HashSet集合中添加新的对象的时候,先回判断该对象和集合对象中的hashCode值:

1):不等: 直接把该新的对象存储到hashCode指定的位置.

2):相等: 再继续判断新对象和集合对象中的equals做比较.

  1>:hashCode相同,equalstrue: 则视为是同一个对象,则不保存在哈希表中.

1>:hashCode相同,equals为false:非常麻烦,存储在之前对象同槽为的链表上(拒绝,操作比较麻烦).

对象的hashCodeequals方法的重要性:

每一个存储到hash表中的对象,都得提供hashCode和equals方法,用来判断是否是同一个对象.

存储在哈希表中的对象,都应该覆盖equals方法和hashCode方法,并且保证equals相等的时候,hashCode也应该相等.

不同的数据类型如何来计算hashCode:

Eclipse可以自动生成hashCode和equals方法.

如果需要把我们自定义的对象存储到哈希表中,该类型 的对象应该覆盖equals和hashCode方法,并在该方法中提供自己的判断规则.

可以使用Eclipse工具自动生成hashCode和equals方法.

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注