Map集合学习第一天

这篇博客详细介绍了HashMap在Map集合中的作用,强调了Map中Key的唯一性和Value的可重复性。通过源码分析,解释了HashMap的初始化、扩容、元素添加过程,包括计算hash值和冲突解决策略。还提到了Node类实现Map.Entry接口,便于遍历。最后,讨论了Map的遍历方式和获取Key、Value的方法。
摘要由CSDN通过智能技术生成

前面学习HashSet的时候,已经说过了,HashSet的底层就是HashMap,但是前面的键值对<key,value>,其中key是增加的元素,而value是一个PRESENT。

中PRESENT这个就是一个静态final常量,类型为object类型

public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}

而现在学习的map集合,保存的数据是映射关系Key-Value,Map中的Key-Value可以是任意的引用类型数据,他们都会封装到HashMap$Node中。

Map中的key是不允许重复的,Map中的key可以为null,但是只能有一个,而value的话,可以为null,也可以设置多个。Map中的key常是String类型。

添加相同的key,会覆盖原来的值。

Key-Value之间是一一对应的关系,所以通过key,可以找到value值。

 

Map集合常用的方法有:

put(Key,Value).

get(key)

remove(key)   remove(Key,Value)    删除元素,可以根据键或者键值对来删除

size()  元素个数

isEmpty() 是否为空

clear()   清除全部元素

containskey(key) 查看键是否存在

由于Map不能直接new出来,所以用它子类HashMap来实现,实际上学习HashSet前面已经说了下,但是我估摸我也没说清楚,重新来

public class MapStudy {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("1","武当山");
        map.put("2","峨眉山");
        map.put("1","张三丰")
        map.put("3","松山");
        System.out.println(map);
    }
}

源码剖析:

Map map = new HashMap();这个操作调用构造器初始化加载因子LoadFactor(0.75)

public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}

然后再来操作 map.put("1","武当山");这个是添加值进去,如何添加的

public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}

进入put方法,传入key和value这两个值,也就是key=1,value=武当山。然后put里会返回一个putVal(hash(key), key, value, false, true);这个方法,这个方法里还有一个方法hash(key)。

我们添加数值进去,是通过计算hash值,然后再添加进去的。

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

而在这里的hash值不完全等于hashcode。因为这个hash值会这样取(h = key.hashCode()) ^ (h >>> 16)无符号右移16位^运算这个h = key.hashCode()。

然后返回这个hash值。然后再进去 putVal(hash(key), key, value, false, true)方法中

public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}

下面这个是核心代码。

Node<K,V>[] tab; Node<K,V> p; int n, i;这个定义的局部变量

现在的话,我们还没有创建出,元素放的地方。

if ((tab = table) == null || (n = tab.length) == 0)

n = (tab = resize()).length;

首先代码会进行if判断,我们这里开始的时候存放元素的地方就是空的(tab = table) == null,所以它会进去这里,n = (tab = r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值