集合框架_HashSet集合的add()方法的源码

本文深入探讨了HashSet和HashMap的工作原理,重点分析了元素如何添加到HashSet中,并详细解释了HashMap内部实现机制,包括哈希表的构造和查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. interface Collection {  
  2.     ...  
  3. }  
  4.   
  5. interface Set extends Collection {  
  6.     ...  
  7. }  
  8.   
  9. class HashSet implements Set {  
  10.     private static final Object PRESENT = new Object();  
  11.     private transient HashMap<E,Object> map;  
  12.       
  13.     public HashSet() {  
  14.         map = new HashMap<>();  
  15.     }  
  16.       
  17.     public boolean add(E e) { //e=hello,world  
  18.         return map.put(e, PRESENT)==null;  
  19.     }  
  20. }  
  21.   
  22. class HashMap implements Map {  
  23.     public V put(K key, V value) { //key=e=hello,world  
  24.       
  25.         //看哈希表是否为空,如果空,就开辟空间  
  26.         if (table == EMPTY_TABLE) {  
  27.             inflateTable(threshold);  
  28.         }  
  29.           
  30.         //判断对象是否为null  
  31.         if (key == null)  
  32.             return putForNullKey(value);  
  33.           
  34.         int hash = hash(key); //和对象的hashCode()方法相关  
  35.           
  36.         //在哈希表中查找hash值  
  37.         int i = indexFor(hash, table.length);  
  38.         for (Entry<K,V> e = table[i]; e != null; e = e.next) {  
  39.             //这次的e其实是第一次的world  
  40.             Object k;  
  41.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
  42.                 V oldValue = e.value;  
  43.                 e.value = value;  
  44.                 e.recordAccess(this);  
  45.                 return oldValue;  
  46.                 //走这里其实是没有添加元素  
  47.             }  
  48.         }  
  49.   
  50.         modCount++;  
  51.         addEntry(hash, key, value, i); //把元素添加  
  52.         return null;  
  53.     }  
  54.       
  55.     transient int hashSeed = 0;  
  56.       
  57.     final int hash(Object k) { //k=key=e=hello,  
  58.         int h = hashSeed;  
  59.         if (0 != h && k instanceof String) {  
  60.             return sun.misc.Hashing.stringHash32((String) k);  
  61.         }  
  62.   
  63.         h ^= k.hashCode(); //这里调用的是对象的hashCode()方法  
  64.   
  65.         // This function ensures that hashCodes that differ only by  
  66.         // constant multiples at each bit position have a bounded  
  67.         // number of collisions (approximately 8 at default load factor).  
  68.         h ^= (h >>> 20) ^ (h >>> 12);  
  69.         return h ^ (h >>> 7) ^ (h >>> 4);  
  70.     }  
  71. }  
  72.   
  73.   
  74. hs.add("hello");  
  75. hs.add("world");  
  76. hs.add("java");  
  77. hs.add("world");  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值