Java集合篇五:HashMap

Posted 陈小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合篇五:HashMap相关的知识,希望对你有一定的参考价值。

1.HasMap 自定义基础版

package com.test.collection;


/**
 * 自定义实现Map功能
 * map :存放键值对,根据键对象找对应的值对象
 * @author chenx
 *
 */
public class MyMap001 {
    Entry[] arr=new Entry[999];
    int size;
    
    public void put(Object key,Object value){
        Entry e=new Entry(key,value);
        
        //解决键重复的处理,后面的直接覆盖
        for(int i=0;i<size;i++){
            if(arr[i].key.equals(key)){
                arr[i].value =value;
                return;
            }
        }
        arr[size++]=e;
    }
    
    public Object get(Object key){
        for(int i=0;i<size;i++){
            if(arr[i].key.equals(key)){
                return arr[i].value;
            }
        }
        return null;
    }
    public boolean containsKey(Object key){
        for(int i=0;i<size;i++){
            if(arr[i].key.equals(key)){
                return true;
            }
        }
        return false;
    }
    public int size(){
        return size;
    }
    public static void main(String[] args) {
        MyMap001 map=new MyMap001();
        map.put("a", "张三");
        map.put("a", "李四");
        map.put("c", "王五");
        //map.remove(2);
        System.out.println(map.get("a"));
        System.out.println(map.size());
        
        
    }

}

class Entry{
    Object key;
    Object value;
    public Entry(Object key, Object value) {
        super();
        this.key = key;
        this.value = value;
    }
}

2.HasMap 自定义升级版

package com.test.collection;

import java.util.LinkedList;


/**
 * 自定义实现Map功能(升级版)
 * map :存放键值对,根据键对象找对应的值对象
 * 
 * 1.提升查询效率,避免MyMap002中的循环遍历: 数组+链表
 * 
 * hashMap:底层实现(数组+链表),链表中放对象,对象中存key,value
 * 
 * @author chenx
 *
 */
public class MyMap002 {
    LinkedList[] arr=new LinkedList[999];
    int size;
    
    public void put(Object key,Object value){
        Entry2 e=new Entry2(key,value);
        int has=key.hashCode();
        has = has<0?-has:has;
        int a =has%arr.length;
        if(arr[a] ==null){
            LinkedList list =new LinkedList();
            arr[a] =list;
            list.add(e);
        }else{
            
            LinkedList list=arr[a];
            for(int i=0;i<list.size();i++){
                Entry2 e1=(Entry2)list.get(i);
                if(e1.key.equals(key)){
                    e1.value = value;//重复的进行覆盖
                    return;
                }
            }
            arr[a].add(e);
        }
    }
    
    public Object get(Object key){
        int has=key.hashCode();
        has = has<0?-has:has;
        int a =has%arr.length;
        if(arr[a] !=null){
            LinkedList list=arr[a];
            for(int i=0;i<list.size();i++){
                Entry2 e=(Entry2)list.get(i);
                if(e.key.equals(key)){
                    return e.value;
                }
            }
        }
        return null;
    }
    
    public static void main(String[] args) {
        MyMap002 map=new MyMap002();
        map.put("a", "张三");
        map.put("a", "李四");
        map.put("c", "王五");
        //map.remove(2);
        System.out.println(map.get("a"));
        //System.out.println(map.size());
        
        
    }

}

class Entry2{
    Object key;
    Object value;
    public Entry2(Object key, Object value) {
        super();
        this.key = key;
        this.value = value;
    }
}

 

以上是关于Java集合篇五:HashMap的主要内容,如果未能解决你的问题,请参考以下文章

java集合系列之HashMap源码

Java集合 -- HashSet 和 HashMap

Java集合系列五HashMap解析

Java集合详解4:HashMap和HashTable

Java并发多线程编程——集合类线程不安全之HashMap的示例及解决方案

leetcode 1208. 尽可能使字符串相等-----滑动窗口篇五,前缀和篇一,二分篇一