HashSet,在Java中就是散列表的实现,它就是为快速查找value诞生的。HashSet使用数组和链表实现散列表,不同的hashcode的value存放不同数组下标的位置,相同hashcode的value存放相同数组下标的链表上的不同位置上。(在JDK8版本中,对于哈希表的实现进行了一些改进,通过数组加链表加红黑树实现,此举将大大减少发生哈希冲突时链表的比较次数,提高性能。)
HashSet几大特点:
- set中的元素不能重复,即若在容器中插入已有元素是插不进去的,容器只会保留一个。
- set中的元素排列无序,即set中的元素顺序既不是按照插入顺序排列的,也不是根据hashcode顺序排列的。
以下是HashSet源代码中的部分注释
/**
* It makes no guarantees as to the iteration order of the set;
* in particular, it does not guarantee that the order will remain constant over time.
*/
即set内的顺序是不稳定的。
- set不提供get()来获取指定位置的元素,所以遍历需要用到迭代器或者增强型for循环。
package collection; import java.util.HashSet; import java.util.Iterator; public class TestCollection { public static void main(String[] args) { HashSet<Integer> numbers = new HashSet<Integer>(); for (int i = 0; i < 20; i++) { numbers.add(i); } //Set不提供get方法来获取指定位置的元素 //numbers.get(0) //遍历Set可以采用迭代器iterator for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) { Integer i = (Integer) iterator.next(); System.out.println(i); } //或者采用增强型for循环 for (Integer i : numbers) { System.out.println(i); } } }