码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap的实现原理

时间:2015-08-30 19:20:29      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:

  要了解HashMap的实现原理,首先得知道散列表(哈希表).

一、散列表

  散列表是一种可以快速地查找所需要的对象的数据结构,散列表为每个对象计算一个整数,称为散列码(hash code),散列码是由对象的实例域产生的一个整数。具有不同的数据域对象将产生不同的散列码,java中的散列码是通过hashcode方法实现的。

  在java中,散列表用链表和数组实现,每个列表称为桶,要想查找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余,所得到的结果就是保存这个元素的桶的索引。比如一个大小为16的桶,散列码为12的对象,应保存在他的12%16=12号桶中,如果散列码为28的对象,28%16=12,也应该保存在12号桶中,只需在原有的基础上再添加元素就行。

技术分享

二、模拟HashMap

  HashMap的实现原理就是哈希表,只不过HashMap的需要判断键不能重复,如果重复,用新的值覆盖旧的值。我用LinkedList数组模拟实现HashMap中的put和get方法。LinkedList中装的是Entry内部类,里面有key和value属性

package test;

import java.util.LinkedList;

public class MyMap<K,V> {

    private LinkedList[] table;
    private int size;
    public MyMap(){
        this(16);
    }
    public MyMap(int capacity){
        table = new LinkedList[capacity];
    }
    
    @SuppressWarnings("unchecked")
    public void put(K key,V value){
        Entry e = new Entry(key,value);
        //得到hash值,使hash的值都为正数
        int hash = key.hashCode()%table.length;
        hash = hash>0?hash:-hash;
        
        LinkedList link = table[hash];
        if(link == null){
            table[hash] = new LinkedList();
            table[hash].add(e);
        }else{
            //判断键是否有重复的,有就覆盖,没有就添加
            for(int i=0;i<link.size();i++){
                Entry entry = (Entry) link.get(i);
                if(entry.key.equals(key)){
                    entry.value = value;
                    return;
                }
            }
            table[hash].add(e);
        }
        size++;
    }
    
    public V get(K key){
        int hash = key.hashCode()%table.length;
        hash = hash>0?hash:-hash;
        LinkedList link = table[hash];
        if(link!=null){
            for(int i=0;i<link.size();i++){
                Entry entry = (Entry) link.get(i);
                if(entry.key.equals(key)){
                    return (V) entry.value;
                }
            }
        }
        return null;
    }
    
    public int size(){
        return size;
    }
    
    class Entry<K,V>{
        K key;
        V value;
        
        public Entry(){
            
        }
        
        public Entry(K key,V value){
            this.key = key;
            this.value =value;
        }
    }
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        MyMap  myMap = new MyMap();
        myMap.put(1, "aaaa");
        myMap.put(1, "bbbb");
        myMap.put(2, "cccc");
        System.out.println(myMap.get(2));
        System.out.println(myMap.size());
    }
}

 

参考资料:107尚学堂_高淇_java300集最全课程_容器_自己实现HashMap_Map底层实现_哈希算法实现_使用数组和链表

HashMap的实现原理

标签:

原文地址:http://www.cnblogs.com/duoluomengxing/p/4771226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!