黑马程序员技术交流社区

标题: 自己实现Map接口简单方法<升级版> [打印本页]

作者: My_Android    时间: 2016-5-26 09:39
标题: 自己实现Map接口简单方法<升级版>
升级版功能:
1:提高查询效率。如何提高?
通过获得key.hashCode()来获得对象的散列码,即对象的地址。
在对散列码进行%数组的长度。
添加元素的时候只需要获得取完数的大小,添加到相应的下标的位置。
取出元素的时候获得%的大小,拿出相应下标的位置。
弊端:
效率提高了。%完之后的大小,可能会有相同的数值,会造成数据的丢失。
如何解决?
用链表来解决。Map的底层是<数组+链表>来实现的。数组放的不再是一个对象,而是一个链表。链表是有一个节点构成的。节点里的值就存放key,value 对象。
  1. import java.util.LinkedList;

  2. /**
  3. * 自定义Map实现升级版
  4. * 1:提高查询效率
  5. * @author hasee
  6. *
  7. */
  8. public class SxtMap002 {
  9.        
  10.         LinkedList[] arr = new LinkedList[999]; //map底层实现数组+链表
  11.        
  12.         int size;
  13.        
  14.         public void put(Object key,Object value){
  15.                 //创建一个键值对对象
  16.                 SxtEntry e = new SxtEntry(key,value);
  17.                 //获得key对象地址%数组的长度
  18.                 int a = key.hashCode()%arr.length;
  19.                 /**
  20.                  * 如果 arr[a]==null 代表没有链表对象,
  21.                  */
  22.                 if(arr[a] == null){
  23.                         //新建一个链表对象
  24.                         LinkedList list = new LinkedList();
  25.                         //往链表容器添加数据
  26.                         list.add(e);
  27.                         //把链表赋值给链表数组
  28.                         arr[a] = list;
  29.                 }else{
  30.                         /**
  31.                          * 不等于空,遍历key对象地址%数组的长度数组链表,如果链表存在相同key,则覆盖
  32.                          */
  33.                         for(int i=0;i<arr[a].size();i++){
  34.                                 SxtEntry e2 = (SxtEntry) arr[a].get(i); //链表添加进去是什么类型,取出来需要强制转型
  35.                                 if(e.key.equals(key)){
  36.                                         e2.value = value;
  37.                                         return ;  //键值重复 覆盖
  38.                                 }
  39.                         }
  40.                         /**
  41.                          * for循环没执行,代表key不相同,不相同直接往链表在添加一个数据
  42.                          */
  43.                         arr[a].add(e);
  44.                 }
  45.                 size++;
  46.         }
  47.        
  48.         public Object get(Object key){
  49.                 int a = key.hashCode()%arr.length;
  50.                 /**
  51.                  * 如果等于==null,代表没有链表,不需要遍历,直接返回空
  52.                  * 不都于需要遍历链表的存放的元素,如果有相等的key,则返回对应的value
  53.                  */
  54.                 if(arr[a] != null){
  55.                         for(int i=0;i<arr[a].size();i++){
  56.                                 SxtEntry e = (SxtEntry) arr[a].get(i);
  57.                                 if(e.key.equals(key)){
  58.                                         return e.value;
  59.                                 }
  60.                         }
  61.                 }
  62.                 return null;
  63.         }
  64. }
复制代码








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2