集合框架分为两个家族:Collection(一组对象)和Map(一组映射关系、一组键值对)
①Collection:
List:是Collection的子接口。
List系列的集合:有序的、可重复的
List系列的常用集合:ArrayList、Vector、LinkedList、Stack(Vector的子类)
Set系列的集合:不可重复的
Set系列的集合,有有序的也有无序的。
HashSet无序的,底层是HashMap实现。
TreeSet按照元素的大小顺序遍历,底层是TreeMap实现。
LinkedHashSet按照元素的添加顺序遍历,底层是LinkedHashMap。
②Map:
Map: 用来存储键值对,映射关系的集合。所有的Map的key都不能重复。
键值对、映射关系的类型:Entry类型。
Entry接口是Map接口的内部接口。所有的Map的键值对的类型都实现了这个接口。
HashMap中的映射关系,是有一个内部类来实现Entry的接口,JDK1.7是一个叫做Entry的内部类实现Entry接口。
JDK1.8是一个叫做Node的内部类实现Entry接口。
TreeMap中的映射关系,是有一个内部类Entry来实现Entry的接口。
Map的实现类:
(1)HashMap:
依据key的hashCode()和equals()来保证key是否重复。
key如果重复,新的value会替换旧的value。
hashCode()决定了映射关系在table数组中的存储的位置,index = hash(key.hashCode()) & table.length-1
HashMap的底层实现:JDK1.7是数组+链表;JDK1.8是数组+链表/红黑树
(2)TreeMap
依据key的大小来保证key是否重复。key如果重复,新的value会替换旧的value。
(3)LinkedHashMap
依据key的hashCode()和equals()来保证key是否重复。key如果重复,新的value会替换旧的value。
LinkedHashMap是HashMap的子类,比HashMap多了添加顺序
ArrayList 和LinkedList的区别
1. ArrayList:动态数组,底层物理结构是数组
优点:根据【下标】访问的速度很快
缺点:需要开辟连续的存储空间,而且需要扩容(添加),移动元素(删除)等操作
2. LinkedList:底层物理结构是双向链表
优点:在增加、删除元素时,不需要移动元素,只需要修改前后元素的引用关系。
缺点:我们查找元素时,只能从first或last开始查找