Collection(单列集合)与MAP(双列集合)
Collection框架图
lambda表达式实现foreach循环遍历
ArrayList扩容机制
LinkList
HashSet
HashSet扩容
LinkedHashSet
MAP
Map的遍历
- 键找值:通过map提供的map.keySet()方法获取到Map集合中的所有键,然后通过循环通过key找到所有的value
- 键值对:通过map提供的map.entrySet方法,将map的键值对封装成一个,放入到Set集合当中,通过遍历集合来遍历Set
- Lambda表达式:通过Lambda表达式来遍历集合map
HashMap的底层实现原理
HashMap的源码的几个参数
- loadFactor:负载因子,默认大小为0.75,表述hashMap的填充度
- threshold:容纳键值对的临界值,当超过临界值时需要扩容,计算公式map的数组长度*loadFactor
- size:map中键值对的数量
- Ini_capacity:初始容量,默认为16
HashMap底层实现是数组+链表++红黑树(JDK1.8后),其中当链表的长度大于8并且数组长度大于64时,链表转化成红黑树(性能优化,增加查找速度;),当红黑树节点小于6时,红黑树变为链表。
HaspMap是线程不安全的,如果存在线程安全问题应该使用ConCurrentHashMap;
HashCode
HashMap中通过对Key的hashCode()运算得到该键值对存放的下标,对于同一个key通过hashCode运算得到的值是相同的,然后经过equals()对比,没有相同的就插入到链表中。但是对于自定义的对象(HashMap<Student,String>),当两个对象的内容相同时,hashCode对他们两个运算不会得到相同的hash值,因为他们两个地址不同,这就需要再自定义类中重写hashCode()和equals()方法。