目录
Map集合的特点:
- 1、Map和Collection没有继承关系。他俩是并列关系
- 2、Map集合以key和value的方式存储数据:键值对。key和value都是引用数据类型。
- 3、key和value都是存储对象的内存地址。会封装到HashMap$Node对象中。
- 4、为了方便程序员遍历,还会创建EntrySet集合,该集合的类型是Entry,Entry是一个接口。Map也实现Entry接口,EntrySet集合只是一个引用,指向了Node对象,因此可以访问key和value。因为 Entry提供了重要的方法 getKey(); getValue(); 需要向上向下转型为Map.Entry
- 5、key起到主导的地位,value是key的一个附属品。
- 6、Map中的key不允许重复,value可以重复,如果key重复,新的value就会覆盖原来的value
- 7、Map中得到key可以为null,但只能有一个,value可以有多个
- 8、key和value之间存在单向一对一关系,即通过制定的key总能找到对应value
- 9、 Map集合的key,就是一个Set集合。
- 往Set集合中放数据,实际上放到了Map集合的key部分。
- Map集合的value,就是一个Collection集合
Map接口中常用方法:
- V put(K key, V value); //向Map集合中添加键值对
- V remove(Object key); //通过key删除键值对
- V get(Object key); //通过key获取value
- int size(); //获取Map集合中键值对的个数
- void clear(); //清空Map集合
- boolean containsKey(Object key); //判断Map中是否包含某某个key
- boolean containsValue(Object value); //判断Map中是否包含某个value
- boolean isEmpty(); //判断Map集合中元素个数是否是0个
- Set<K> keySet(); //获取Map集合所有的key(所有的键是一个set集合)
- Collection<V> values(); // 获取Map集合中所有的value,返回一个Collection
- Set<Map.Entry<K,V>> entrySet(); // 将Map集合转换成Set集合
Map.put(k,v)实现原理:
- 1、先将k,v封装到Node对象当中。
- 2、底层会调用k的hashCode()方法得出hash值,然后通过哈希函数/哈希算法,将hash值转换为数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上了。如果说下标对应的位置上有链表,此时会拿着k和链表上每一个节点中的k进行equals,如果所有的equals方法返回都是false,那么这个新节点将被添加到链表的末尾。如果其中有一个equals返回了true,那么这个节点的value将会被覆盖。
V = map.get(k)实现原理:
- 先调用k的hashCode()方法得出哈希值,通过哈希算法转换成数组下标,通过数组下标快速定位到某个位置上,如果这个位置上什么也没有,返回null,如果这个位置上有单项链表,那么会拿着参数k和单向链表上的每个节点中的k进行equals,如果所有equals方法返回false,那么get方法返回null,只要其中有一个节点的k和参数k,equals的时候返回true,那么此时这个节点的value就是我们要找的value,get方法最终返回这个要找的value。