程序员人生 网站导航

Java Map底层实现思路

栏目:php教程时间:2015-08-24 08:07:04
<pre name="code" class="java">package cn.com.commsoft.map; /** * * @author wengle *Java中规定,两个内容相同的对象 *(指的是通过调用equals方法返回true的对象),应当具有相等的hashcode *1、上面的话,相当于equals返回true的两个对象,就具有相同的hashcode, *但是具有相同hashcode的对象,通过调用equals方法不1定返回true(Map就是1个例子) *2、重写了equals方法,就必须重写hashcode方法,为了保证上面的Java规定 */ public class MyMap { MyEntry[] arr = new MyEntry[100]; int size; /** * 采取hash算法实现map,(每一个对象都有1个地址, * 根据地址生成的1个hash码,由于每一个对象的地址都不1样,所以 * 生成的hash码是唯1的) * @param key * @param value */ public void put(Object key, Object value){ MyEntry my = new MyEntry(key, value); //相当于地址映照函数,但是会产生地址映照冲突 int a = (key.hashCode()%100); //思路1:当地址冲突时,采取开放地址法处理冲突 while(arr[a].key != null){ a++; } arr[a] = my; /*思路2:当地址冲突时,采取链表法处理冲突-->这也是Java采取的设计思想, 数组加链表(即每一个数组元素里面放1个链表)*/ //第1步:申请1个每一个元素是链表的数组 MapLinkedList[] map = new MapLinkedList[999]; //第2步:添加元素 if(map[a] == null){ MapLinkedList list = new MapLinkedList(); list.add(e); map[a] = list; }else{ map[a].add(e); } } public Object get(Object key){ int a = (key.hashCode()%100); return arr[a].value; } } class MyEntry{ Object key; Object value; public MyEntry(Object key, Object value) { super(); this.key = key; this.value = value; } }



内容还会继续更新,敬请关注!
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐