1.集合的主要体系及分支
1.1Collection集合及实现类
1.概述:首先Collection是属于单列集合的顶层接口,表示为一组对象。其类型为引用数据类型,具体创建对象,通过多态的形式进行。
2.主要常用方法(E这种是指泛型类型,可以为任何引用类型):
3.Collection集合的遍历(Iterator迭代器,集合的专用遍历方式)
概述:
2.List集合(List是带有索引的,所以多注意索引越界等问题)
1.概述:有序集合,且允许有重复的元素,使用者可以精确的控制每个元素的插入位置,并且可以快速访问。
特点:有序(存储与取出顺序一致),且元素可以重复。
2.常用方法:
*3.List的列表迭代器(Listlterator)
用法:可以按照任意方向进行遍历,并在迭代期间修改列表,并获取列表中迭代器的位置,是list集合特有的迭代器。
常用方法:
当使用倒叙遍历时,是需要注意先进行一遍正向顺序;或者直接通过Collection工具类中的reverse()的方法进行倒叙,再输出。
4.并发修改异常(ConcurrentModificationException)
主要产生原因:通过内部类的形式,当通过hasNext()这个方法时,遍历集合中加以判断并添加时会发生并发异常,是因为list.add()会导致实际的修改集合和预期的修改集合不对等而触发并发修改异常。
因为:当你使用list的add方法时候,只会添加实际修改集合的值,而预期的修改集合值不会增加,而hasNext()的使用是需要预期和实际进行判断的。
如何避免这种异常出现:?
1.使用列表迭代器的方法进行添加,因为add不会导致实际与预期的不对等。
2.通过for循环进行遍历。
2.1 List的实现类
1.ArrayList(底层数据结构属于数组实现,增删慢,查询快);
2.LinkedList(底层数据结构属于双链表,查询慢,增删快);
常用方法:
3.Set集合
特点:集合是无序的(存储与取出顺序不一致),且不允许有重复元素,没有索引值,因此不能使用普通for遍历。
3.1HashSet(Set的实现类)
1.哈希值
概述:哈希值是JDK通过对象的地址或者字符串或者数字算出来的int类型的值。
特点:同一个对象的哈希值是相同的,且在默认情况下不同对象的哈希值是不同的。
2.数据结构之哈希表
3.怎么HashSet集合的元素唯一性?(重中之重)
4.LinkedHashSet集合(HashSet的子类)
LinkedHashSet集合元素是有序的。
3.2TreeSet集合(Set的实现类)
特点:可以通过自然排序或者特定的比较器(主要用于Comparable接口来进行)来进行排序;
自然排序Comparable:
String类实现类自然排序Comparable接口,则可以直接调用用来判断字符串之间的大小,而当一个类的对象之间需要比较时,是需要实现自然排序Comparable接口,重写其中compareTo的方法。(TreetSet可以通过匿名内部类的方法来进行重写自然排序方法)。
4.集合的高频面试题
1、Arraylist 与 LinkedList 异同
1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;
3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。
4. 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。
5. 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。
2、ArrayList 与 Vector 区别
Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。
Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。
集合框架底层数据结构总结
1.Collection
1. List
Arraylist: Object数组
Vector: Object数组
LinkedList: 双向循环链表
2. Set
HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素。
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)。