上一节讨论数组时,我们知道数据容器是用来存放数据的,那么既然数组就可以集中存储一批业务相关的数据,为什么jdk还要提供其它“集合”类?
我一直认为世界上任何一种技术或事物的产生一定是因为它解决了以前技术或事物没有或不能解决的问题,至少是对“前任”的改进。那么集合到底解决了什么问题?或改进了什么问题?
先了解一下数组:
特点:
- A:内存-预先开辟了一块连续的内存
- B:查询速度-因为内存连续,下标固定,所以查询速度极快,复杂度衡定
- C:插入、删除速度-因为内存连续,必须移动数据,才能空出位置或移处位置,以方便插入值或删除值
- D:无法扩展-因为内存预先连续分配,所以扩展时无法保证内存尾部刚好有足够的空闲内存可用,因此无法扩展,只能全部重新分配内存。
- E:数据游标-数据放入数组,并没有一个值记录当前数据存放到第几个位置,需要使用方自己维护。否则需要通过遍历找到数据尾部第一个空位置。
- F:数据可空-不能保证存储的数据为可空或非空
- G:数据重复-不能保证存储的数据是否重复与否
- H:性能-不能保证不同操作对应性能为最优情况
- I:安全-不能保证并发或并行操作数据安全
数组有自己的优点,也有自己的短板,新的集合相关类,就是为了解决上面所有问题中的部分,不同的集合类解决不同的问题。
数据容器种类及主要实现类:
集合关注点:
- A:是否允许空
- B:是否允许重复数据
- C:是否有序:(有序不是指是否排充,而是指取数据的顺序与存数据的顺序是否一样:如数据a[2]=1,那么a[2]取仍然是1,这就是有序。但a[2]=1,a[3]=0, a[4]=5并不影响数组是有序的)
- D:是否线程安全
Collection-集合根接口
Collection接口是所有集合类(Set/list/queue)的根接口。
它的主要功能有:
- 增:add/addAll
- 删:remove/removeAll/removeIf/clear
- 改:
- 查:iterat