A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小刀葛小伦 黑马粉丝团   /  2019-8-8 17:46  /  1068 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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[i] = value;
 
//取值时:
int hash = key.hashCode();
int i = hash % Entry[].length;
return Entry[i];

理解了就比较简单。

此处附一个简单的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[i])){
				int tmp = map.get(a[i]);
				tmp+=1;
				map.put(a[i], tmp);
			}else{
				map.put(a[i], 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!




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马