1.集合框架
1.1集合框架概述
集合框架是为了表示和操作集合而规定的一种统一的标准的体系结构。最简单的集合有数组、列表和队列等。任何的集合框架一般包含对外的接口、接口的实现和集合运算的算法。
1.2.集合框架要满足的目标:
- 框架必须是高性能的。
- 框架允许不同类型的集合。
- 对一个集合的扩展和适应必须是简单的。
2.本次学习内容
List:ArrayList、LinkedList、Vector、Stack
Set:HashSet、TreeSet
Map:HashMap、TreeMap
Collections
Iterator
不同的遍历方式
Stream()(不要求掌握)
3.List
List集合代表一个有序、可重复的集合。集合中每个元素都有对应的元素索引。List默认按照元素的添加顺序来设置索引,可以通过索引来访问元素。
3.1ArrayList和LinkedList
ArrayList:List接口的可调整大小的数组实现。非线程同步。
LinkedList:双向列表实现的List和Deque接口。非线程同步。
ArrayList和LinkedList的区别:
ArrayList是数组实现,而LinkedList是双链表。在get()和set()方面ArrayList有优势,而在添加和删除上LinkedList有优势。
原因:拿增加操作来说(增加和删除差不多)ArrayList是数组,它是先将你要添加的位置的元素和后面的元素全部往后移,再往里面添加元素。而LinkedList是双链表,它只要将要插入位置的前一个数的后标和现存该位置的数的前标修改,再将插入的数的前后标对应上就可以了。这边画个图助于理解。
3.1.1.ArrayList中指定位置增加元素:
3.1.2.LinkedList指定位置增加元素
3.1.3.set、get
由于数组是连续的,而链表还有前后标,在查找的过程中数组会更快。
3.2Vector:
和ArrayList类似,但Vector是线程同步的。就是说Vector是线程安全的动态数组。
3.3Stack:
是Vector的一个子类,实现一个后进先出的堆栈。有自己扩展的方法,但Stack类比较少用。
4.Set
Set接口存储一组唯一的、无序的对象。
4.1HashSet:
HashSet是基于HashMap来实现的,HashSet是基于哈希算法进行存储元素的,因此拥有良好的存取和查找性能。
特点:
1.不能保证元素的顺序。
2.HashSet不是线程同步的,多线程操作需注意。
3.集合元素的值可以是null。
4.2TreeSet:
TreeSet是SortSet接口的实现类,TreeSet可以保证元素处于排序状态。TreeSet支持自然排序和自定义排序两种。
自然排序是调用集合元素的compareTo,然后元素进行升序排列,如果要按照自己编写的顺序进行,只需将元素类的compareTo重写即可。
自定义排序是自己实现Comparator接口来定制排序规则。
4.3Set和List的区别:
1.Set接口存储的是不重复的、无序的对象;而List接口存储的是可重复的、有序的对象。
2.Set检索效率低,但删除和插入效率高,且插入和删除不会引起位置的改变;而List可以动态增长,根据实际存储的长度自动增长List的长度。查找元素效率高,但插入删除效率低,因为List的插入删除操作会引起位置的改变。
5.Map
Map接口存储一组键值(key,value)对象,提供key->value的映射。key值不允许重复,可以是null。如果添加新的key-value时key已经存在,那么会覆盖掉原来的键值对象。
5.1HashMap和Hashtable的区别(类似ArrayList和Vector)
1.HashMap不是线程安全的,Hashtable是线程安全的。
2.HashMap的key和value值可以为null,而Hashtable不行。
6.如何选用集合类
| 条件 | 集合 |
|---|---|
| 线程安全 | Vector、Hashtable |
| 不要求线程安全 | ArrayList、LinkedList、HashMap |
| 要求键值对(双列) | Map |
| 不要求键值对(单列) | Collection |
| 选择单列但不要求元素唯一 | List |
| 选择单列要求元素唯一 | Set |
| 选择Set要求排序 | TreeSet |
| 选择Set不要求排序 | HashSet |
| 选择List增删多 | LinkedList |
| 选择List查询多 | ArrayList |
7.本次学习参考
1Java集合框架|菜鸟教程
2.jdk1.8中文文档
3.学习他人链接
4.若有错误,可以评论指出,本文章只是自己学习使用,无他用处。