合框架基本知识点总结
集合Collection
要用一个东西首先最重要的是,你为什么要用它,它有什么用,能解决什么问题。这三个问题其实是一个问题,现在来具体的说一下集合的作用。
- 支持泛型,泛型也就是我们常说的简单易用,灵活性高,还比较安全(指编译时检查类型安全)。
- 可变长度,集合和我们平时用的数组比起来,最大的特点就是长度是灵活可变的,会根据情况自动的扩张自己的容量。
- 操作性强且简单上手,集合本身是个接口,内置的方法可以让我们更容易操作其中的元素(添加啊,删除等,反正肯定比数组容易的),而且我们平时根本不需要去重写接口,Java内置的接口已经是非常好用了。
1. List
List也是一个接口,而且是Collection的子接口,继承List接口的类最大的特点就是:
- 元素有序排列。
- 元素可重复出现。
1.1 ArrayList
ArrayList,内部是一个动态的数组来存放元素,数组长度可变。
动态数组的本质是:一开始定义一个长度为10的数组,每当要到达上限的时候,先创建一个容量更大的数组,再把所有的元素转过去。
特点是:
- 查询效率高,可以直接通过get(i)的方法获取第i个元素,一步到位可以说是不能再快了,时间复杂度O(1)。
- 增删效率低,当ArrayList要往中间插入元素的时候,那就表示后面的元素都要往后移动一格,时间复杂度O(n)(如果是末尾插入则是O(1)),而且容量不够的时候还会创建新数组,耗时更长。
- 线程不安全,没有特地解决线程安全的类都会有的标准问题。
1.2 LinkedList
LinkedList,内部是一个链表来存放元素,链表肯定是长度可变,特点:
- 查询效率低,由于不支持随机访问(就是访问元素必须要从第一个开始一个个看),所以查询就相比ArrayList而言慢,时间复杂度O(n)。
- 增删效率高,其实也没有那么高,插入元素也一样要O(n)的复杂度,但是相比ArrayList它不用创建新数组,这相对一比就高了起来。
- 线程不安全,此条同上。
1.3 Vector
Vector,简单来说就是ArrayList的线程安全版,由于线程安全,特点也很明显了:
- 线程安全,当需要用到多线程的时候就可以用上它。
- 效率低,多线程自带副作用,由于每个方法都synchronized了,自然而然就会慢一点(对于Java而言,实现线程同步这一点本身就有性能消耗,不是说你Vector用单线程效率就和ArrayList一样)。
如果被问到为什么Vector的使用率低之类的问题,请直接回答因为线程同步效率低这一点。
1.4 总结
要注意的是,虽然我有在前面列出时间复杂度,但是实际上效率并不是一个只看时间复杂度就可以决定的东西。
List | 查询效率 | 增删效率 | 线程安全 |
ArrayList | 高 O(1) | 低 O(n)加扩容 | 不安全 |
LinkedList | 低 O(n) | 高 稳定O(n) | 不安全 |
Vector | 低 同步开销 | 低 同步开销 | 安全 |
2. Set
Set当然也是接口且是Collection的子接口,继承Set接口的类的特点:
- 元素无序排列。
- 元素不可重复。
- 没有get()方法,因为是无序存储。
实际上底层是是通过Map实现的。
2.1 HashSet
HashSet的底层是HashMap,实际上在存储的时候就是在hashMap中以<E, Object>的方式存储元素。Object就是我们熟知的那个Object类,里面啥都没;E则是泛型,在创建HashSet时指定。
- 没什么特点,主要是其底层是由HashMap实现,就是个只有一半的hashMap。其特点就基本上等同于hashMap的特点。
2.2 TreeSet
TreeSet的底层是TreeMap,同HashSet,TreeSet存储的时候也是在TreeMap中以<E, Object>的方式存储元素,E依然是泛型。
2.3 总结
Set的内容比较少,主要是Set的底层其实就是Map,基本上就是拥有Map中所有Key(键值)的特性,具体看Map部分。
3. Map
Map以键值对(key/Value)的方式存储元素,每个key可以对应一个Value,存储有对应关系的数据。
- Key不能重复,但是Value可以重复,以<String, Integer>为例,我可以同时存入<“111”, 111>, <“222” , 111>,但是不能同时存入<“111”, 111>,<“111”, 222>,这种情况下后者刷新前者。
- 拥有较好的的删改查询效率。
3.1 HashMap和HashTable
HashMap是通过Hash算法实现的存储结构,平时我们都用这个,底层是一个Hash表,在存储的时候键不能重复,重复的时候新的值会替换原有的值
- 查询速度极快,时间复杂度是O(1)。
- 线程不安全。
- 允许key或者Value为null。
HashTable简单来说就是HashMap的线程安全版,底层基本相同,在大部分方法中都用上了synchronized关键字。
- 线程安全。
- 不允许key或value为null。
- 虽然底层基本相同,不过由于线程同步效率较慢。
3.2 TreeMap
TreeMap是红黑二叉树的实现,底层就是一个红黑二叉树。
- 和HashMap相比,调用起来没有差别。
- 查询效率较好,时间复杂度是O(logn)。
- TreeMap的内部元素是有序的。
- 线程不安全。
参考材料
Java SE 核心 II【Collection 集合框架】 - 404boom - 博客园
https://www.cnblogs.com/cao-yin/p/9608250.html