一.
HashSet底层采用HashMap实现
二.
这个HashMap的key就是放进HashSet中的对象,而value就是一个Object类型的对象,这个value我们不关心它到底是什么
三.
当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),
该行的key就是向HashMap中增加的那个对象,该行的value就是一个Object类型的常量四.
HashMap底层采用数组维护
五.
调用增加的那个对象的hashCode方法,来得到一个hashCode值,
然后根据该值计算出一个数组的下标索引(计算出数组中的一个位置)六.
将准备增加到Map中的对象与该位置上的对象进行比较(equals)方法,如果相同,那么就将该位置上的那个对象(Entry类型)的value值替换掉;否则,沿着该Entry的链继续重复上述过程,如果到链的最后依然没有找到与此对象相同的对象, 那么这个时候就会将该对象增加到数组中,然后将数组中该位置上的那个对象链到这个新对象的后面
七.
对于HashSet,HashMap来说,这样做的原因就是为了提高查找的速度,使得查找时间不随Set或者Map的大小而改变
八.
Set.add()添加重复的返回false
Map.put()添加key一样的,把以前的value覆盖Set的特性:无重复性,无序性
public class HashMapTest {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Map map = new HashMap();
map.put("welcome", "abc");
map.put("hello", "abc");
map.put("world", "xyz");
map.put("hello world", "abcxyz");
Set set = map.entrySet();// 返回此映射中包含的映射关系的 Set 视图。
for (Iterator it = set.iterator(); it.hasNext();) {
Map.Entry me = (Map.Entry) it.next();// 后面的知识可以用泛型写
System.out.print(me.getKey() + " ");
System.out.println(me.getValue());
}
Set set2 = map.keySet();// 返回此映射中包含的键的 Set 视图。
for (Iterator it = set2.iterator(); it.hasNext();) {
String key = (String) it.next();
String value = (String) map.get(key);
System.out.println(key + " " + value);
}
@SuppressWarnings("unused")
Set set3 = new HashSet();
}
}
本文深入探讨了HashSet的内部实现机制,包括使用HashMap作为底层数据结构、对象的哈希码计算、插入操作的详细流程以及如何利用这些特性提高查找效率。同时,展示了如何通过Java代码实现对HashSet的基本操作。

被折叠的 条评论
为什么被折叠?



