TriyHoo

做好一件事需要的是专注和持之以恒

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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

    山东

 

芝兰生于幽林,不以无人而不芳;

君子修道立德,不以穷困而改节;

posted on 2014-12-14 11:24  TriyHoo  阅读(104)  评论(0)    收藏  举报