底层原理Hashmap源码解析实例
Map.java
1 package com.collection; 2 3 public interface Map<K, V> { 4 public V put(K k, V v); 5 6 public V get(K k); 7 8 public int size(); 9 10 interface Entry<K, V> { 11 public K getKey(); 12 13 public V getValue(); 14 } 15 }
HashMap.java
1 package com.collection; 2 3 public class HashMap<K, V> implements Map<K, V> { 4 private Entry<K, V>[] table = null; 5 private int size = 0; 6 private static int defaultLength = 16; 7 8 public HashMap() { 9 table = new Entry[defaultLength]; 10 } 11 12 @Override 13 public V put(K k, V v) { 14 int index = hash(k); 15 Entry<K, V> entry = table[index]; 16 if (entry == null) { 17 table[index] = new Entry<K, V>(k, v, null, index); 18 size++; 19 } else { 20 table[index] = new Entry<K, V>(k, v, entry, index); 21 } 22 return table[index].getValue(); 23 } 24 25 private int hash(K k) { 26 int index = k.hashCode() & (defaultLength - 1); 27 return Math.abs(index); 28 } 29 30 @Override 31 public V get(K k) { 32 if (size == 0) { 33 return null; 34 } 35 int index = hash(k); 36 Entry<K, V> entry = getEntry(k, index); 37 38 return entry == null ? null : entry.getValue(); 39 } 40 41 private Entry<K, V> getEntry(K k, int index) { 42 for (Entry<K, V> entry = table[index]; entry != null; entry = entry.next) { 43 if (entry.hash == index && (k == entry.getKey() || k.equals(entry.getKey()))) { 44 return entry; 45 } 46 } 47 return null; 48 } 49 50 @Override 51 public int size() { 52 return 0; 53 } 54 55 class Entry<K, V> implements Map.Entry<K, V> { 56 K k; 57 V v; 58 Entry<K, V> next; 59 int hash; 60 61 public Entry(K k, V v, Entry<K, V> next, int hash) { 62 this.k = k; 63 this.v = v; 64 this.next = next; 65 this.hash = hash; 66 } 67 68 @Override 69 public K getKey() { 70 return k; 71 } 72 73 @Override 74 public V getValue() { 75 return v; 76 } 77 } 78 }
TestHashMap.java
1 package com.collection; 2 3 public class TestHashMap { 4 public static void main(String[] args) { 5 com.collection.HashMap map = new com.collection.HashMap<>(); 6 7 8 for (int i = 0; i < 6666; i++) { 9 map.put("Monkey" + i, "計算方法的事實"); 10 System.out.println(map.get("Monkey")); 11 } 12 13 System.out.println(map); 14 15 } 16 }
分类:
JAVA-集合
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何统计不同电话号码的个数?—位图法
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析
· 三维装箱问题(3D Bin Packing Problem, 3D-BPP)
· Windows上,10分钟构建一个本地知识库
· Java虚拟机代码是如何一步一步变复杂且难以理解的?
· 凯亚物联网平台如何通过MQTT网络组件接入设备