参考资料:
1、《Java程序设计经典课堂》 -清华大学出版社
Java集合框架概述
1、Java中专门提供一套动态对象数组的操作类——集合框架。
2、集合框架实际上就是对常用数据结构的Java实现。
3、集合框架也可以理解成容器,容器主要指的是List、Map、Set和Queue等抽象数据结构。容器可以存储多个元素,这些元素通常是Java对象。针对上述抽象数据结构所定义的标准编程接口称为集合框架。
4、集合框架主要由一组精心设计的接口、类和隐含在其中的算法所组成,通过它们可以采用集合的方式完成Java对象的存储、获取、操作(排序、增删改查)以及转换等功能。使用集合框架,可以大大提高变成的效率和质量。
5、此外,还可以在集合框架的基础上完成入堆栈、队列和多线程安全访问等。
来看一下JAVA集合框架的简图,这样可以让我们对Java整个集合框架的体系有一个大致的认知。
1 Collection接口
Collection接口是所有集合类型的根接口。
Collection接口的定义如下图所示:
2 List接口及其实现类
2.1 概述
1、List接口也是Collection接口的子接口,它实现一种顺序表的数据结构(有时也称为序列)。在数据结构的逻辑结构类型中,它属于线性结构。
2、放在List集合的所有元素都有一个下标(下标从0开始),可以通过该下标实现随机访问集合中的元素。
3、List集合中允许存储重复的元素。
4、List接口的常用实现类有ArrayList和LinkedList。
2.2 List新增的接口方法
1、List接口继承了Collection接口的方法,还另外定义了一些顺序表操作的方法。通过这些方法,可以实现定位访问、查找、链式迭代和范围查看等。
2、List新增的接口方法如下图所示:
2.3 ArrayList类
1、ArrayList是最常用的实现类,它是通过数组实现的顺序表来存储集合对象,可以通过下标访问集合元素。
2、ArrayList实现了一个可变长的对象数组,其元素可以动态地添加和删除。
3、ArrayList的定位访问时间复杂度是O(1),但它添加和删除元素开销较大,时间复杂度为O(n)。因此,当一个集合要频繁随机访问,则应使用ArrayList。
2.3.1 ArrayList类的特点
1、ArrayList通过数组的顺序表来存储集合对象,通过下标可以实现高效的随机访问。但是ArrayList在执行添加或删除元素操作时需要移动大量元素,这就导致它在添加或删除元素时性能不佳。
2、ArrayList不是线程安全的,若在多线程环境下,需要在外部进行线程同步。
2.3.2 ArrayList类的应用场景
1、ArrayList通过数组的顺序表来存储集合对象,通过下标实现高效的随机访问。因此适用于大量随机访问的场景。
2、ArrayList在执行添加或删除元素操作时需要移动大量元素,这就导致它在添加或删除元素时性能不佳,因此不适用要频繁添加或删除元素的场景。
2.4 LinkedList类
1、LinkedList是以链表的形式来存储集合元素。它除了存储集合元素外,还需要维护节点之间的关联信息,因此LinkedList的存储开销要比ArrayList大。LinkedList是一种链式存储结构。
2、LinkedList虽然在存储开销方面大,但它带来的好处是LinkedList在删除和添加元素方面的开销大大降低,时间复杂度为0(1)。因此,若一个集合列表要频繁添加或删除元素,则应使用LinkedList。
3、由于LinkedList是以链表的形式来存储集合元素,它每次遍历集合元素时都得从头结点开始,导致它的访问效率没有ArrayList好,其时间复杂度为O(n)。
2.4.1 LinkedList类的特点
1、LinkedList是以链表的形式来存储集合元素,能够高效地添加或删除元素。
2、LinkedList每次遍历元素都得从头结点开始,导致它的访问效率较低。
2.4.2 LinkedList类应用场景
1、LinkedList是以链表的形式来存储集合元素,能够高效地添加或删除元素。因此适用于要频繁添加或删除元素的场景。
2、LinkedList每次遍历元素都得从头结点开始,导致它的访问效率较低,因此不适用要经常随机访问的场景。
2.5 关于List接口实现类的性能
1、当需要执行大量的随机访问操作时,应当使用ArrayList。
2、当需要频繁添加或删除元素时,应当使用LinkedList。
3 Set接口及其实现类
3.1 概述
1、Set接口集成Collection接口,它没有定义新的接口方法。
2、Set接口不允许集合中出现重复元素。
3、Set接口常用的实现类有HashSet,TreeSet、LinkedHashSet。
4、Set接口有几个常用的实现类,它们的层次关系如下图所示:
3.2 HashSet类和LinkedHashSet类
3.2.1 HashSet类
1、HashSet类是抽象类AbstractSet的子类,HashSet使用哈希方法存储元素,具有很好的性能,但元素没有顺序。
2、HashSet提供最快的访问速度。
3.2.2 LinkedHashSet类
1、LinkkedHashSet类是HashSet的子类。
2、该类与HashSet的不同之处是:LinkedHashSet以插入顺序保存元素,但也通过散列提供了快速访问的能力。
3、LinkedHashSet维护了一个双向链表,该链表定义了元素的插入顺序。
3.3 SortedSet接口与TreeSet类
3.3.1 SortedSet接口
1、SortedSet接口是有序对象的集合,其中的元素排序规则按照元素的自然顺序排列。
2、为了使得元素有序,要求插入到SortedSet集合中的元素必须是可以互相比较的。
3.3.2 TreeSet类
1、TreeSet是SortedSet接口的实现类,它使用红黑树存储元素并排序。
2、它基于元素的值对元素进行排序,因此TreeSet的操作效率没有HashSet高。
3.4 关于Set接口实现类的性能
1、HashSet的性能基本上总是比TreeSet好,特别是在添加和查询元素时,而这两个操作也是最重要的操作。
2、TreeSet存在的用途是它可以维持元素的顺序。因此,在需要一个排序好的Set集合时,应当使用TreeSet。
3、对于插入操作,LinkedHashSet比HashSet的代价更高,更耗费性能,这是由于LinkedHashSet要维护链表带来的开销。
4 Map接口及其实现类
4.1 概述
1、Map表示一种散列结构的数据结构(也称为哈希),该结构的基本思想是根据元素的关键字通过哈希函数直接计算出一个值,并将这个值作为该元素的存储地址。因此,哈希存储方法该的优点就是查找速度快,只要给出元素的关键字,就可以理解计算出元素的存储地址。
2、哈希存储方法只存储元素的数据,不存储元素之间的逻辑厝,因此哈希存储方法经常用于对数据进行快速查找和插入的场合。
3、Map是一个专门用来存储键值对的对象。在Map中存储的关键字和值都要求是对象,而且Map存储的关键字是唯一的,而值可以有重复的。
4、Map接口的常用实现类有HashMap、TreeMap、HashTable类。
5、Map接口常及其实现类的层次关系如下图所示:
4.2 Map的接口方法
4.3 Map接口的实现类
4.3.1 HashMap类
1、HashMap设计用来快速访问键值对,它里面的元素是没有顺序的。
2、HashMap不是线程安全的,适用于单线程环境。
3、它允许null作为键,也允许null作为值。
4.3.2 LinkedHashMap类
1、LinkedHashMap是HashMap的子类,它保持键的顺序与插入的顺序一致,但它的访问性能没有HashMap效率高。
4.3.3 TreeMap类
1、TreeMap保持键的有序状态,TreeMap类中的元素会按照键进行排序。
2、需要注意的地方是,如果key本身是自定义的对象,name对象所在的类就需要实现Comparable接口。
4.3.4 HashTable
1、HashTable实现了一种哈希表,可以实现HashMap一样的功能。
2、HashTable是Java早期版本提供的一个存放键值对的实现类。现在已不推荐使用。
3、HashTable是线程同步的,可在多线程环境下使用,但它的访问性能不如HashMap。
4、HashTable不允许键键为null,若将null作为键存入HashTable,会报错。
来源:CSDN
作者:举世武双
链接:https://blog.csdn.net/qq_33721382/article/details/103466447