Java集合——HashMap


@Author:云都小生


h3{color:green;font-size:24}
p{font-size:22}
strong{color:red;font-size:24}


回顾HashMap



HashMap实现了Map接口,继承AbstractMap。

HashMap也是我们使用非常多的Collection,它是基于哈希表的Map接口的实现。存储的元素是以Key-value的形。

这里写图片描述
其实HashMap本质上是数组与指针(引用)的结合。


HashMap的实现


树上月的文章中,我找到了HashMap背后的实现原理。

public V put(K key, V value) {
    //当key为null,调用putForNullKey方法,保存null与table第一个位置中,这是HashMap允许为null的原因
    if (key == null)
        return putForNullKey(value);
    //计算key的hash值
    int hash = hash(key.hashCode());                  ------(1)
    //计算key hash 值在 table 数组中的位置
    int i = indexFor(hash, table.length);             ------(2)
    //从i出开始迭代 e,找到 key 保存的位置
    for (Entry<K, V> e = table[i]; e != null; e = e.next) {
        Object k;
        //判断该条链上是否有hash值相同的(key相同)
        //若存在相同,则直接覆盖value,返回旧value
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;    //旧值 = 新值
            e.value = value;
            e.recordAccess(this);
            return oldValue;     //返回旧值
        }
    }
    //修改次数增加1
    modCount++;
    //将key、value添加至i位置处
    addEntry(hash, key, value, i);
    return null;
}

如果Key为null,则直接调用putForNullKey方法,HashMap允许null键和null值。

若不为null则计算Key的hash值,搜索在数组中的索引位置。如果有相同的Key就直接覆盖value值,这也就说明了Map中不能存放相同的Key。


使用HashMap



遍历HashMap的遍历方式跟ArrayList、HashSet不一样。

import java.util.*;

public class SetDemo {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("1", 123);
        map.put("2", 234);

        Iterator iter = map.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            Object key = entry.getKey();
            Object val = entry.getValue();
            System.out.println("Key:" + key + " value:" + val);
        }
    }
}

2017/10/20 21:10:32 @Author:云都小生

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值