集合框架的概述:


一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象


的操作,就要对对象进行存储。另一方面,使用 Array 存储对象方面具有 一些弊


,而 Java 集合就像一种容器,可以 动态地 把多个对象的引用放入容器中。



集合的两个体系:



集合类主要通过实现Collection和Map接口的实现类来体现,由这两个接口可以得出两个体系:



Collection:单列集合,存储的是一个一个的对象


Map:键值对集合,存储的是一个一个的键值对



/------Collection接口:单列集合,存储的都是一个一个的对象 /----List接口,存储无序的,可重复的(动态数组) /----ArrayList:主要实现类,线程不安全的,效率高,底层使用Object[] elementData类 型存储 /----LinkedList:底层使用双向链表存储,对于频繁的插入和删除操作效率比ArrayList高 /----Vector:作为List接口的古老实现类,线程安全,效率较低,



/----HashMap 主要实现类,线程不安全,效率高,可以存储null的key和value
      /----LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历
               原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个添加对象,对于频繁的遍历操作,此类执行效率高于HashMap
/----TreeMap:保证排序遍历
              底层使用红黑树
/----Hashtable 古老实现类 线程安全,效率低
       /----properties  常用来处理配置文件,key和value都是String

各个体系细节总结:

1.list接口:主要实现类是ArrayList,其次还有LinkedList,Vector



/----ArrayList:主要实现类,线程不安全的,效率高,底层使用Object[] elementData类型存储 /----LinkedList:底层使用双向链表存储,对于频繁的插入和删除操作效率比ArrayList高 /----Vector:作为List接口的古老实现类,线程安全,效率较低,



主要关注点:各个类的初始化源码,

                                       添加元素的方式和细节

                                        以及扩容机制



elementData初始化为{};第一次调用添加操作,底层才创建了长度为10的数组,并将元素添加 后续的添加和扩容操作无变化 小结:jdk7中的对象创建类似于饿汉式,jdk8中类似于懒汉式,延迟数组创建,节省内存



新要添加的元素导致底层数组容量不够,则扩容,扩容为原来的1.5倍 同时需要将原有的数组中的数据复制到新的数组中。



                  额外注意:增强for循环,和list额外定义的方法

2.set接口:主要实现类为HashSet,其次还有LinkedHashSet,TreeSet



/----Set接口,存储无序的,不可重复的数据



/-----HashSet:Set接口的主要实现类,线程不安全,可以存储null值 /-----LinkedHashSet:作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历 /-----TreeSet:可以按照添加对象的指定属性,进行排序



主要关注点:set没有定义额外的方法、不可重复实现的原理,理解无序性

                                          TreeSet排序的两种方法



添加元素的过程:以HashSet为例: 当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法 来得到该对象的 hashCode 值,然后根据 hashCode 值,通过某种散列函数决定该对象 在 HashSet 底层数组中的存储位置。(这个散列函数会与底层数组的长度相计算得到在 数组中的下标,并且这种散列函数计算还尽可能保证能均匀存储元素,越是散列分布, 该散列函数设计的越好) 如果两个元素的hashCode()值相等,会再继续调用equals方法,如果equals方法结果 为true,添加失败;如果为false,那么会保存该元素,但是该数组的位置已经有元素了, 那么会通过链表的方式继续链接。 如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相 等,hashSet 将会把它们存储在不同的位置,但依然可以添加成功。



因此,必须重写自定义类中的equals方法和hashCode方法

3.Map体系:主要实现类为HashMap,其次还有LinkedHashMap,TreeMap,Hashtable



Map:双列数据,存储key-value对的数据 /----HashMap 主要实现类,线程不安全,效率高,可以存储null的key和value /----LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历 原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个添加对象,对于频繁的遍历操作,此类执行效率高于HashMap /----TreeMap:保证排序遍历 底层使用红黑树 /----Hashtable 古老实现类 线程安全,效率低 /----properties 常用来处理配置文件,key和value都是String HashMap底层:数组+链表 jdk7以前 数组+链表+红黑树 jdk8



主要关注:



1.HashMap的底层实现原理 2.HashMap和Hashtable的区别 3.CurrentHashMap和Hashtable的异同



其他问题:

1.关注各个接口定义的常用方法

2.遍历各个集合的操作

3.底层源码的实现逻辑

4.集合提供的工具类