- 上面的图不全,还有一些抽象的容器没有写出来—->实现具体容器时的抽象类(实现和继承)
- 面试特别爱问(高频中的高频)—->牵扯到数据结构、算法、组织结构、高并发(各维度不同)
- 从线程使用角度学习
- 容器的全貌(讲上图背住—->图中有容器的结构信息):
- 两大类:Collection和Map
- 集合Collection可以不管元素是什么结构都可以将元素一个一个往里面扔(链表、跳表、树、……)
- 映射Map可以将元素一对一对往里扔(这就是与集合的区别)—->Map是Collection的一个特殊的变种,一个对象看成是一对对象(一整个对象Entry)
- 容器就是装一个一个对象的集合
- 数组也算是容器(最常用)
- 从数据结构来讲,物理上**的数据存储结构只有两种:连续(数组)与非连续(链表—->一个引用指向下一个节点)**
- 逻辑结构:树的数组和链表实现—->数组和链表还能结合在一起使用形成一些非常复杂的数据结构,逻辑结构可以有很多
- 物理结构就只有两种—->一种是链表,一种是数组
- 逻辑结构就非常非常多了
- java中容器严格来讲只有一种,但是java区分得比较明确—->一个是Map(一对一对的),一个是Collection(一个一个的)
- 在Collection中又分三大类(之前只分两大类:List和Set):
- List
- Set
- 🌟Queue(后来加入的接口)—->专门为高并发准备的接口,对于高并发最重要的接口
- 队列是一队一队的,从队列中取数据的时候和List以及Set都不一样,List(或数组)可以取到其中的一个,Set中是唯一的、无序的,Set是不会有重复元素的
- Queue主要实现了一个队列的逻辑:有进有出,一端进另一端出,先进先出
- Queue实现了很多的多线程访问的方法—->put、take阻塞式地放进去、阻塞式地取出来
- 面试题:为什么有List了,可以从头上取,从尾巴上放,那还要有队列?
- 队列最主要地原因是为了实现任务的装载的取和存
- 阻塞队列:初衷就是为了给线程池做准备的,给高并发做准备的
- 之前的普通容器是普通的、为了装东西做准备的,而队列在很大程度上是为了高并发准备的,实现了很多在高并发情况下才需要的方法
- 说Queue和List的区别时主要聊高并发和普通装东西的容器的区别,Queue实现的是高并发用的一些方法
- Deque为双端队列,两端都能存取