1. java.util.Map接口常用方法
1.Map和Collection没有继承关系。
2. Map集合以key 和 value 的方式存取数据:键值对
key 和 value 都是引用数据类型
key 和 value 存储的都是对象的内存地址
V put(K key, V value) 向Map集合中添加键值对
V get(Object key) 通过key获取value
void clear() 清空Map集合
boolean containsKey(Object key) 判断Map中是否包含某个key
boolean containsValue(Object value) 判断Map中是否包含某个value
boolean isEmpty() 判断Map集合中元素个数是否为0
V remove(Object key) 通过key删除键值对
int size() 获取Map集合中键值对的个数。
Collection values() 获取Map集合中所有的value,返回一个Collection
Set keySet() 获取Map集合所有的key(所有的键是一个set集合)
Set<Map.Entry<K,V>> entrySet()
将Map集合转换成Set集合
假设现在有一个Map集合,如下所示:
map1集合对象
key value
1 zhangsan
2 lisi
3 wangwu
4 zhaoliu
set集合对象
1=zhangsan 【注意:Map集合通过entrySet()方法转换成的这个Set集合,Set集合中元素的类型是 Map.Entry<K,V>】
2=lisi 【Map.Entry和String一样,都是一种类型的名字,只不过:Map.Entry是静态内部类,是Map中的静态内部类】
3=wangwu
4=zhaoliu —> 这个东西是个什么?是 Map.Entry
2. Map集合的遍历
第一种:获取所有的key 通过遍历所有的key 来遍历value
第二种:将Map集合直接全部转化成Set集合,几个存储的类型是Map.Entry
for (Map.Entry<Integer, String> ss:entries){
System.out.println(ss.getKey()+">>"+ss.getValue());
}
3. HashMap 集合
1:HashMap集合底层是哈希表、散列表的数据结构
2:哈希表是一个怎样的数据结构
哈希表是一个数组和单向链表的结合体
数组:在查询方面效率较高,随机增删方面效率较低
单向链表:在随机增删方面效率较高,在查询方面效率很低
哈希表将以上两种数据结构融合在一起,充分发挥各自的优点
哈希表/散列表:一维数组,这个数组中的每一个元素是单向链表
Node<k,v>[] table; 数组和链表的结合体
3.哈希表集合的key部分的特点:
无序,不可重复
为什么无序?因为新增元素可能不在同一个单向链表
不可重复的保证?equals方法来保证HashMap集合的key不可重复
如果key重复了,value会覆盖。
4.放在HashMap集合key部分的元素其实放到了HashSet集合中,所以HashSet集合的元素也需要重写HashCode() 和 equals() 方法。
5.哈希表HashMap使用不当时无法发挥性能
假设所有的hashcode()方法返回固定的某个值,那么会造成底层的哈希变成纯单向链表。称为:散列分布不均匀
什么是散列均匀?
假设有100个元素,10个单向链表,那么每个单向链表上有10个节点,称为散列均匀的。
假设所有的hashcode()方法返回不一样的值,那么会造成底层的哈希变成一维数组。没有链表的概念了。散列分布不均匀。
6,HashMap集合的默认初始化容量是16,默认加载因子是0.75;当hashmap集合底层达到75%,数组开始扩容。
HashMap集合的初始化容量必须是2的倍数,这是官方推荐的
7.向Map集合中存以及向Map集合中取,都是先调用key的hashcode方法再调用equals方法。
put(k,v)举例:什么时候equals不会调用?
get(k)举例:什么时候equals不会调用?
k.hashcode方法返回哈希值,再通过hash算法转化成数组的下标,如果数组下标上没有存储任何值,则不再调用equals直接在此位置放入元素
如果一个类的equals方法重写了,则hashcode方法必须要重写
如果equals方法返回的是true则,hashcode方法返回值必须一样
4 结论
放在HashMap集合key部分,以及放在HashSet集合中的元素,要同时重写Hashcode方法和equals方法。
5 Hashtable
1.Hashtable 的key 和 value 都不可以为null 线程安全的 初始化容量11 默认加载因子0.75 原容量*2+1
2.HashMap的key 和 value 可以为null