什么是HashSet?
HashSet类可以说是个集合,存在于java.util包中的类。既然可以说是集合,那么肯定也有集合的特性,HashSet中不允许重复的元素存在。
HashSet的实现原理
HashSet的底层是由HashMap实现的,而且HashSet的值是存放于HashMap的key上。
都说HashSet是无序的,但事实真的是这样吗???
真相
HashSet的无序其实是相对于它存入的数据来说的。相对于存入的数据的顺序来说,读取的数据的顺序是无序的。
public static void hashset(){
Set set = new HashSet();
set.add("北京");
set.add("上海");
set.add("广州");
set.add("深圳");
set.add("广州");//看输出结果,输出不会有重复
set.add(100);
for (Object ft:set
) {
System.out.println(ft);
}
}
输入的顺序是上面的顺序,但是输出的顺序却和输入的顺序不同。
这是为什么呢???
因为HashSet的存储是由HashCode决定的。当存入数据时HashCode会计算该元素的位置。然后根据计算出的相应的数值,把元素存入到对应的位置中。所以当我们顺序遍历的时候会发现存入数据的顺序和输出数据的顺序不一致,这就是HashSet的无序性。
当有两个元素,他们计算得出的HashCode的值一样时,只会保留其中一个。计算得出HashCode的值,如果在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾。如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。