集合框架_Collection_Set_HashSet

来源:互联网 发布:远程wifi控制软件 编辑:程序博客网 时间:2024/06/05 01:59

Set:元素不可以重复,是无序。

 Set接口中的方法和Collection一致。
  |--HashSet: 内部数据结构是哈希表 ,是不同步的。

在往HashSet集合中添加元素前要判断元素是否相同,哈希表如何确定元素是否相同?
  1.判断两个元素的哈希值是否相同,如果不同,就不判断内容;如果相同,再判断两个对象的内容是否相同
  2.判断哈希值相同,其实判断的是对象的hashCode的方法;判断内容相同,用的是equals方法。

  如何保证该集合的元素唯一性呢?
  是通过对象的hashCode和equals方法来完成对象唯一性的。
  如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
  如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。
  如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。
  
  记住:如果元素要存储到HashSet集合中,必须在定义该元素的时候覆盖hashCode方法和equals方法。为什么?

Object类有hashCode()和equals()方法,不同数据(也许是为了达到相同的效果或表象)根据自身数据结构的特点定义了新的hashCode()和equals()方法来覆盖了父类的这两个方法。如果自己定义了新的类,为了达到相同或者不同的效果,那么通常都需要覆盖父类中的hashCode()和equals()方法。

比如,如果定义的类会产生很多对象,如人,学生,书,通常都需要覆盖equals,hashCode方法。建立对象判断是否相同的依据。
HashSet集合数据结构是哈希表,所以存储元素的时候,使用的元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来确定是否相同。
如果new一个Person添加一个的话,因为地址不同,即使两个Person里面的内容相同,默认的HashSet会认为是不同的,这时候就应该在建立Person的时候重写Person里面的hashCode和equals方法。简单的方法是根据对象中属性所属的数据类型来重写hashCode和equals方法,可以运用该属性所属类的hashCode和equals方法,如return name.hashCode()+age*38。这中写法中,地址是通过属性的一些简单计算得到的,这样属性(内容)相同,地址就相同了。

 

HashSet的子类LinkedHashSet是有序的,比如 HashSet  hs=new LinkedHashSet;往hs存储都是有序的。

所以Set和List最主要的区别是存储的元素相同不相同。