j2se学习笔记五
Map接口下面有HashMap,HashTable等不同的实现接口类。HashMap与HashTable的区别在于前者线程不安全,效率高;后者线程安全,效率低(联想到StringBuilder和StringBuffer,以及ArrayList和Vector),下面是自己实现的HashMap,底层实现是用数组+链表的数据结构,这样的好处是用避免了单纯用数组存放键值对索引遍历的低效率,这样的数据结构首先构造一个链表类型的数组,由于使用的是哈希散列算法,所以在存放键值对对象时候根据Key得到hashcode,根据hashcode得到存放区域,在java中如果俩个对象(这里是key)的equals相同,那么他们的hashcode必定相同,反之则不然。内存结构大致如下所示:

所以在存储的时候根据hashcode找到存储区域,然后遍历数组中的链表,如果key值相等,则覆盖value,否则这在链表后添加新的对象。实现的代码如下(只实现put和get方法):
package myhashmap; import java.util.LinkedList; import java.util.List; /** * 实现HashMap,底层实现数组+链表的数据结构 * @author CSDREAM1 * */ public class MyHashMap { LinkedList[] arry = new LinkedList[200]; int size; public static void main(String[] args) { MyHashMap map = new MyHashMap(); map.put("崔昊", "青岛"); map.put("崔昊", "山东"); map.put("贝克汉姆", "England"); System.out.println(map.size()); System.out.println(map.get("崔昊")); } //put方法向HashMap中添加对象(key,value) public void put(Object key, Object value) { Pack p = new Pack(key, value); int hash = key.hashCode();//处理hashcode为负数的情况 hash = hash<0 ? -hash:hash; int a = hash%arry.length; if(arry[a] == null) { LinkedList list = new LinkedList(); arry[a] = list; list.add(p); }else { for(int i=0;i<arry[a].size();i++) { Pack p2 = (Pack) arry[a].get(i); if(p2.Key.equals(key)) { p2.Value = value; return; } arry[a].add(p); } } size++; } public Object get(Object key) { int a = key.hashCode()%arry.length; if(arry[a] != null) { for(int i=0;i<arry[a].size();i++) { Pack p = (Pack) arry[a].get(i); if(p.Key.equals(key)) { return p.Value; } } } return null; } public int size() { return size; } }
结果为:2
山东
芝兰生于幽林,不以无人而不芳;
君子修道立德,不以穷困而改节;

浙公网安备 33010602011771号