您的位置:首页 > 编程语言 > Java开发

Java集合类——HashSet

2017-05-21 20:44 99 查看
HashSet实现了Set接口,Set中不能记住元素的添加顺序,不允许包含相同的元素,如果试图把两个相同的元素加入到Set中,将会添加失败,add()方法返回false,新元素也不会加入集合中。

HashSet是Set的一个实现类,因为是按照Hash算法来存储元素,所以在查找和存取上有很好的性能。HashSet的特点:

|-不能保证元素的排列顺序;

|-HashSet不是同步的,如果有多个线程要访问一个HashSet,需要进行同步操作;

|-HashSet中元素的值可以是null。

HashSet的底层实现机制是HashMap:

public HashSet() {

         map = new HashMap<>();

     }

   当执行add()方法时,HashSet的元素放在HashMap的Key中,HashMap的值统一是PRESENT,PRESENT的定义方式如下:

private static final Object PRESENT = new Object();

add()方法的实现如下:

public boolean add(E e) {

             return map.put(e, PRESENT)==null;

     }

HashMap调用put()方法时,遇到重复的Key值会覆盖,用新的value替换旧的value,而HashSet的元素保存在Key中,重复的元素被覆盖,所以HashSet的元素是不会重复的。

   需要注意,如果重写了equals()方法,就必须同时重写hashCode()方法,使得两个对象使用equals()方法比较返回true时,两个对象的hashCode值也相同。

   如果两个对象通过equals()方法返回true,但两个对象的hashCode值不同,这时HashSet将会把这两个对象保存在Hash表的不同位置,使这两个对象都添加成功。

   如果两个对象的hashCode()方法返回的hashCode值相同,但通过equals()方法比较反悔了false,这时,因为两个对象HashCode值相同,HashSet试图把两个对象保存在同一位置,但又不行,所以实际上会在这个位置上使用链式结构来保存多个对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: