1、来源:来自Java.util包中:分为三大类:Set、List、Queue、Map
2、Collection是集合List、Set、Queue的直接接口
Iterator:可以通过迭代器来遍历集合中的数据
Map:是映射表的基础接口
3、特性
3.1List——有序的Collection,有三个实现类:ArrayList、Vector、LinkedList
3.1.1 ArrayList——底层是数组实现,允许对元素进行快速随机访问,缺点是每个元素之间不能有间隔。当数组太小,就要将已经有的数组复制到新的存储空间中。当从中间插入或者删除元素时,需要对数组进行复制移动,代价较高。适合随机查找和遍历,不适合插入和删除。
3.1.2 Vector——数组实现,线程安全,某一时刻只有一个线程能够写Vector,访问效率慢
3.1.3 LinkedList——链表,适合数据的动态插入和删除;定义了list接口中没有定义的方法,专门用于操作表头和表尾元素,可以当做堆栈、队列和双向队列使用。
3.2 Set ——存储无序的元素,值不能重复(底层是根据对象的内存地址计算出序号-hashCode值来判断)(如果想要这些值相等那就要重写object的hashcode方法和equals方法)
3.2.1 HashSet——哈希表存放的是哈希值(通过hashCode方法判断,如果一样在对比equals方法返回true,则视为同一元素,如果为false则不是同一个元素),存储顺序不是按照存入时的顺序,而是按照哈希值来存取得。一个hashCode位置上可以存放多个元素。
3.2.2 TreeSet(二叉树)使用二叉树的原理对新add()的对象按照指定的顺序排序,每增加一个都会进行排序。Integer和String对象可以进行默认的TreeSet排序,而自定义的对象必须实现Comparable接口,并且覆盖相应的compareTo()函数,才可以使用。
3.2.3 LinkHashSet——继承于HashSet(所有的方法都与HashSet相同),基于LinkedHashMap来实现,
3.3 Map
3.3.1 HashMap(数组+链表+红黑树)只允许一条记录的键为null,允许多条记录值为null,非线程安全;如果需要线程安全可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap
HashMap根据hashCode值来存储数据,有很快的访问速度,遍历顺序是不确定的。
Java8为了降低时间复杂度O(n),在链表超过8个以后,会将链表转为红黑树,在这些位置查找为O(logN)
3.3.2ConcurrentHashMap 支持并发操作,由一个个Segment(继承自ReentrantLock加锁)分段锁组成
3.3.3HashTable(遗留类)继承自Dictionary类,线程安全,可用性不如上述两类
3.3.4TreeMap 实现SorteMap接口,能够把保存的数据根据键排序,默认升序,也可以指定排序的比较器,当Iterator遍历TreeMap时,得到的记录是排过序的。使用时key必须实现comparable接口或者在构造TreeMap传入自定义的Comparator,否则会抛出Java.lang.ClassCastException类型的异常。
4、区别:最常见的区别是ArrayList和LinkedList的区别?
1、底层数据结构(几乎所有的区别都可以从底层入手,会感觉了解的更加透彻)
ArrayList是数组,特性是支持随机访问
LinkedList是双向链表,不支持随机访问,使用下标访问一个元素
2、效率——前者时间复杂度是O(1),后者为O(n)