一.
凡是虚线框都是接口,我们真正在使用的时候,用的是接口中的子类,
List接口中,有一堆子类,是我们开发中常用的容器。ArrayList,LinkList,Vecter这三个算是开发中比较常用的。
(list下面有三个常用的对象)
具体的容器必须明确其特点,那么你才知道什么时候该用这容器。
1. vector
容器之所以能够进行区分,是因为容器的内部的数据结构不一样,现在vector内部用的就是一个数组。数组本身就是一种存储数据的方式,本身就是一种结构。这种结构的特点在于,每一个元素上都带着编号,而且是连续地存储。一开辟空间,很多的小格子就出来了。
vetor从1.0版本就出现了,这个接口1.2才出来(vetor是早就有了,但是称为List接口的子类接口是从1.2开始的),
在1.0的时候,用的集合就一个vetor,到1.2才有的集合框架,才加了各种数据结构进来,产生了一个体系。1.2的时候也把vetor纳入进来了,vetor是元老级别的,它1.2才实现了list,具备了list功能,并成为java集合框架中的成员。vetor是同步的,也就是说线程是安全的。
2. ArrayList
内部也是数组结构,而且是可变的,是不同步的。为什么会有ArrayList的出现,因为vetor的同步效率低。结构是一样的,为什么要出现两个,因为替代了vetor。如果是多线程怎么办?就采用vetor?(不是),我们要么给ArrayList加锁,要么采用其他方式。vetor几乎不用了。怎么加锁呢?把那些添加删除的方法放到同一个锁里面就可以了。
ArrayList中提高了一个大小可变数组,vetor中也提到了可增长的对象数组。什么叫长度可变的数组?原先我们学习的时候,数组是固定长度,集合怎么实现不断地往里面加元素呢?可变长度数组原理,创建一个新数组,将原来数组中的内容都复制到新数组中来。
vetor是一定延长,ArrayList是有一半的机率延长。vetor是既浪费空间,也浪费效率,ArrayList会比vetor强一些。
3. linkedList
链接列表简称链表。
集合中,只要不是vetor,都是非同步的,因为效率高。
链表什么特点呢?数组怎么存储元素呢?将空间切割成多个小方格,然后将元素存储进去。怎么存储进去的呢?数组一开辟空间,都有角标,依据角标来存储元素。
链表是这样的:前一个元素的格子,记住下一个元素的角标值。
链表结构要是删除某一个元素,只需要记住下下个元素的角标值就可以了。
为什么要数据结构,就是对数据操作不一样,操作特点有所不同。链表这种结构删除元素的速度很快。