黑马程序员技术交流社区

标题: 深入解析HashMap三 [打印本页]

作者: 小刀葛小伦    时间: 2019-8-8 17:46
标题: 深入解析HashMap三
get(Object key)操作
get(Object key)操作时根据键来获取值,如果了解了put操作,get操作容易理解,先来看看源码的实现:
[Java] 纯文本查看 复制代码
public V get(Object key) {
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))//-------------------1----------------
                return e.value;
        }
        return null;
    }

意思就是:
1、当key为null时,调用getForNullKey(),源码如下:
[Java] 纯文本查看 复制代码
private V getForNullKey() {
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {
            if (e.key == null)
                return e.value;
        }
        return null;
    }

2、当key不为null时,先根据hash函数得到hash值,在更具indexFor()得到i的值,循环遍历链表,如果有:key值等于已存在的key值,则返回其value。如上述get()代码1处判断。


总结下HashMap新增put和获取get操作:
[Java] 纯文本查看 复制代码
//存储时:
int hash = key.hashCode();
int i = hash % Entry[].length;
Entry = value;

//取值时:
int hash = key.hashCode();
int i = hash % Entry[].length;
return Entry;

理解了就比较简单。

此处附一个简单的HashMap小算法应用:

[Java] 纯文本查看 复制代码
package com.xtfggef.hashmap;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
* 打印在数组中出现n/2以上的元素
* 利用一个HashMap来存放数组元素及出现的次数
* @author erqing
*
*/
public class HashMapTest {
       
        public static void main(String[] args) {
               
                int [] a = {2,3,2,2,1,4,2,2,2,7,9,6,2,2,3,1,0};
               
                Map<Integer, Integer> map = new HashMap<Integer,Integer>();
                for(int i=0; i<a.length; i++){
                        if(map.containsKey(a)){
                                int tmp = map.get(a);
                                tmp+=1;
                                map.put(a, tmp);
                        }else{
                                map.put(a, 1);
                        }
                }
                Set<Integer> set = map.keySet();//------------1------------
                for (Integer s : set) {
                        if(map.get(s)>=a.length/2){
                                System.out.println(s);
                        }
                }//--------------2---------------
        }

此处注意两个地方,map.containsKey(),还有就是上述1-2处的代码。

理解了HashMap的上面的操作,其它的大多数方法都很容易理解了。搞清楚它的内部存储机制,一切OK!









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