永发信息网

SET集合容器的存储结构是什么样子呢??求个大神解析下!!

答案:1  悬赏:10  手机版
解决时间 2021-11-30 13:52
  • 提问者网友:低吟詩仙的傷
  • 2021-11-30 09:27
SET集合容器的存储结构是什么样子呢??求个大神解析下!!
最佳答案
  • 五星知识达人网友:归鹤鸣
  • 2021-11-30 10:15
HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT。其实你要看底层最好阅读API源码,如下
 public class HashSet 
 extends AbstractSet 
 implements Set, Cloneable, java.io.Serializable 
 { 
 // 使用 HashMap 的 key 保存 HashSet 中所有元素
 private transient HashMap map; 
 // 定义一个虚拟的 Object 对象作为 HashMap 的 value 
 private static final Object PRESENT = new Object(); 
 ... 
 // 初始化 HashSet,底层会初始化一个 HashMap 
 public HashSet() 
 { 
 map = new HashMap(); 
 } 
 // 以指定的 initialCapacity、loadFactor 创建 HashSet 
 // 其实就是以相应的参数创建 HashMap 
 public HashSet(int initialCapacity, float loadFactor) 
 { 
 map = new HashMap(initialCapacity, loadFactor); 
 } 
 public HashSet(int initialCapacity) 
 { 
 map = new HashMap(initialCapacity); 
 } 
 HashSet(int initialCapacity, float loadFactor, boolean dummy) 
 { 
 map = new LinkedHashMap(initialCapacity 
 , loadFactor); 
 } 
 // 调用 map 的 keySet 来返回所有的 key 
 public Iterator iterator() 
 { 
 return map.keySet().iterator(); 
 } 
 // 调用 HashMap 的 size() 方法返回 Entry 的数量,就得到该 Set 里元素的个数
 public int size() 
 { 
 return map.size(); 
 } 
 // 调用 HashMap 的 isEmpty() 判断该 HashSet 是否为空,
 // 当 HashMap 为空时,对应的 HashSet 也为空
 public boolean isEmpty() 
 { 
 return map.isEmpty(); 
 } 
 // 调用 HashMap 的 containsKey 判断是否包含指定 key 
 //HashSet 的所有元素就是通过 HashMap 的 key 来保存的
 public boolean contains(Object o) 
 { 
 return map.containsKey(o); 
 } 
 // 将指定元素放入 HashSet 中,也就是将该元素作为 key 放入 HashMap 
 public boolean add(E e) 
 { 
 return map.put(e, PRESENT) == null; 
 } 
 // 调用 HashMap 的 remove 方法删除指定 Entry,也就删除了 HashSet 中对应的元素
 public boolean remove(Object o) 
 { 
 return map.remove(o)==PRESENT; 
 } 
 // 调用 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素
 public void clear() 
 { 
 map.clear(); 
 } 
 ... 
 }由上面源程序可以看出,HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet
中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。  
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯