HashSet是Set接口的典型实现,因此不能包含有重复元素。同时也是无序的(这个无序是指遍历HashSet时得到的元素顺序跟add进入的顺序会不一样)。此外元素可以是null,但只能添加一个null元素,并且null元素放在第一位。
new HashSet()对象其实是new HashMap()对象,初始化一个大小为16的Entry数组,这个通过看HashSet源码可以知道。
而且通过源码可以知道往HashSet添加元素时为了排除重复元素,HashSet使用了HashMap的键的去重,两者为同一段代码,也即是说原理实现与HashMap的键去重是一样的。需要注意的是:判断两个元素是否相同,先是比较它们的HashCode()返回hashCode值是否相等,并且再通过equals()判断两个对象是否相等。所以需要重写对象的hashCode()和equals(),尽量保证两个对象通过equals()方法比较返回true时,它们的hashCode()方法返回值也相等。
同时HashSet使用Hash算法存储元素,因此具有良好的存取和查询能力。往HashSet里添加一个元素时,会调用对象重写的HashCode()方法得到该对象的hashCode值。然后根据该hashCode值决定该对象在HashSet中存储的位置。