标签:
要了解HashMap的实现原理,首先得知道散列表(哈希表).
一、散列表
散列表是一种可以快速地查找所需要的对象的数据结构,散列表为每个对象计算一个整数,称为散列码(hash code),散列码是由对象的实例域产生的一个整数。具有不同的数据域对象将产生不同的散列码,java中的散列码是通过hashcode方法实现的。
在java中,散列表用链表和数组实现,每个列表称为桶,要想查找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余,所得到的结果就是保存这个元素的桶的索引。比如一个大小为16的桶,散列码为12的对象,应保存在他的12%16=12号桶中,如果散列码为28的对象,28%16=12,也应该保存在12号桶中,只需在原有的基础上再添加元素就行。
二、模拟HashMap
HashMap的实现原理就是哈希表,只不过HashMap的需要判断键不能重复,如果重复,用新的值覆盖旧的值。我用LinkedList数组模拟实现HashMap中的put和get方法。LinkedList中装的是Entry内部类,里面有key和value属性
package test; import java.util.LinkedList; public class MyMap<K,V> { private LinkedList[] table; private int size; public MyMap(){ this(16); } public MyMap(int capacity){ table = new LinkedList[capacity]; } @SuppressWarnings("unchecked") public void put(K key,V value){ Entry e = new Entry(key,value); //得到hash值,使hash的值都为正数 int hash = key.hashCode()%table.length; hash = hash>0?hash:-hash; LinkedList link = table[hash]; if(link == null){ table[hash] = new LinkedList(); table[hash].add(e); }else{ //判断键是否有重复的,有就覆盖,没有就添加 for(int i=0;i<link.size();i++){ Entry entry = (Entry) link.get(i); if(entry.key.equals(key)){ entry.value = value; return; } } table[hash].add(e); } size++; } public V get(K key){ int hash = key.hashCode()%table.length; hash = hash>0?hash:-hash; LinkedList link = table[hash]; if(link!=null){ for(int i=0;i<link.size();i++){ Entry entry = (Entry) link.get(i); if(entry.key.equals(key)){ return (V) entry.value; } } } return null; } public int size(){ return size; } class Entry<K,V>{ K key; V value; public Entry(){ } public Entry(K key,V value){ this.key = key; this.value =value; } } @SuppressWarnings("unchecked") public static void main(String[] args) { MyMap myMap = new MyMap(); myMap.put(1, "aaaa"); myMap.put(1, "bbbb"); myMap.put(2, "cccc"); System.out.println(myMap.get(2)); System.out.println(myMap.size()); } }
参考资料:107尚学堂_高淇_java300集最全课程_容器_自己实现HashMap_Map底层实现_哈希算法实现_使用数组和链表
标签:
原文地址:http://www.cnblogs.com/duoluomengxing/p/4771226.html