升级版功能:
1:提高查询效率。如何提高?
通过获得key.hashCode()来获得对象的散列码,即对象的地址。
在对散列码进行%数组的长度。
添加元素的时候只需要获得取完数的大小,添加到相应的下标的位置。
取出元素的时候获得%的大小,拿出相应下标的位置。
弊端:
效率提高了。%完之后的大小,可能会有相同的数值,会造成数据的丢失。
如何解决?
用链表来解决。Map的底层是<数组+链表>来实现的。数组放的不再是一个对象,而是一个链表。链表是有一个节点构成的。节点里的值就存放key,value 对象。
- import java.util.LinkedList;
- /**
- * 自定义Map实现升级版
- * 1:提高查询效率
- * @author hasee
- *
- */
- public class SxtMap002 {
-
- LinkedList[] arr = new LinkedList[999]; //map底层实现数组+链表
-
- int size;
-
- public void put(Object key,Object value){
- //创建一个键值对对象
- SxtEntry e = new SxtEntry(key,value);
- //获得key对象地址%数组的长度
- int a = key.hashCode()%arr.length;
- /**
- * 如果 arr[a]==null 代表没有链表对象,
- */
- if(arr[a] == null){
- //新建一个链表对象
- LinkedList list = new LinkedList();
- //往链表容器添加数据
- list.add(e);
- //把链表赋值给链表数组
- arr[a] = list;
- }else{
- /**
- * 不等于空,遍历key对象地址%数组的长度数组链表,如果链表存在相同key,则覆盖
- */
- for(int i=0;i<arr[a].size();i++){
- SxtEntry e2 = (SxtEntry) arr[a].get(i); //链表添加进去是什么类型,取出来需要强制转型
- if(e.key.equals(key)){
- e2.value = value;
- return ; //键值重复 覆盖
- }
- }
- /**
- * for循环没执行,代表key不相同,不相同直接往链表在添加一个数据
- */
- arr[a].add(e);
- }
- size++;
- }
-
- public Object get(Object key){
- int a = key.hashCode()%arr.length;
- /**
- * 如果等于==null,代表没有链表,不需要遍历,直接返回空
- * 不都于需要遍历链表的存放的元素,如果有相等的key,则返回对应的value
- */
- if(arr[a] != null){
- for(int i=0;i<arr[a].size();i++){
- SxtEntry e = (SxtEntry) arr[a].get(i);
- if(e.key.equals(key)){
- return e.value;
- }
- }
- }
- return null;
- }
- }
复制代码
|
|