ist为继承自collection接口的接口,list里存储的值的类型通过list<object>泛型来声明;存值时调用ArrayList类的add方法,删除时调用用remove方法。
list的很多方法与set很相似,但在存储结构上有区别,set的存储特点为无序和互异,相反的,list的存储特点为有序和存异。
综上可知List接口的特点就是:
1、 List中存储的数据是有序的;
2、 List中存储的数据可以重复的。
3、 List接口中可以有null值;
为什么 List 中的元素 “有序”、“可以重复”呢?
首先,List 的数据结构就是一个序列,存储内容时直接在内存中开辟一块连续的空间,然后将空间地址与索引对应。
以下篇幅讲述List接口的的相关知识:
一、List接口的API和源码解析:
1、List在Java8的API中的描述是这样的:
图1:
List接口继承子Collection接口,Collection接口又继承自Iterable。因此List接口实际上继承了Collection和Iterable两个接口。到目前为止List的实现类主要有如上截图的一些。
2、 List接口的源码解析:
图2:
List接口中主要是提供了一些对索引进行操作的方法。在Collection基础上进行扩展。
二、关于List接口的实现类理解:
1、List接口常用实现类功能特性比较描述:
List ADT(Abstruct Data Type: 抽象数据类型)有两种比较常用的实现方式。ArrayList提供了List ADT的一种可增长的数组实现。使用ArrayList的优点在于:对get和 set 的调用花费常数时间。其缺点就是新项的插入和原有项的删除的代价是比较昂贵的。除非变动是在ArrayList的末尾进行的。LinkedList类则提供了List ADT的双链表 实现。使用LinkedList的优点在于,新项的插入和删除花费常数时间,这里假如已知变动项的位置。这就意味着在表的前端就行插入和删除都是常数时间操作。由此, LinkedList还提供了addFirst(),removeFirst(),addLast()和removeLast()以及getFirst()和geytLast()等有效添加,删除和访问表两端的项。使用LinkedList的缺点是:它不容易 作索引,因此对get的调用是昂贵的,除非调用非常接近表的端点(如果对get的调用是对接近表的后部的项进行,那么搜索的进行可以从表的后部开始)
2、实例演示List实现类ArrayList和LinkedLista:
例子1:在一个ArrayList的前端插入500000条数据作为测试:
/**
* 测试ArrayList集合数据插入和删除时间对比
*/
@Test
public void arrayListADT(){
//获得当前时间时间
long t1 = System.currentTimeMillis();
//声明一个ArrayList
List<Integer> alist = new ArrayList<Integer>();
//获得随机数生成对象
Random rand = new Random();
//随机生成500000条数据并插入数组ArrayList中
for(int i = 0; i < 500000; i++){
//这里测试的是:每条数据都往表的前端插入
alist.add(0, rand.nextInt(500));
}
//获得执行完数据添加后的时间
long t2 = System.currentTimeMillis();
//执行前端插入50万条数据花费的时间
System.out.println("插入500000条数据花费的时间为: "+(t2-t1)+"ms");
//最终输出的结果为: 插入500000条数据花费的时间为: 30079ms
}
代码的执行耗时大概是30079ms,这是很可怕的。
例子2:在一个LinkedList的前端他插入500000条数据作为测试:
/**
* 测试LinkedList集合数据插入和删除时间对比
*/
@Test
public void linkedListADT(){
//获得当前时间时间
long t1 = System.currentTimeMillis();
//声明一个ArrayList
List<Integer> llist = new LinkedList<Integer>();
//获得随机数生成对象
Random rand = new Random();
//随机生成500000条数据并插入数组ArrayList中
for(int i = 0; i < 500000; i++){
//这里测试的是:每条数据都往表的前端插入
llist.add(0, rand.nextInt(500));
}
//获得执行完数据添加后的时间
long t2 = System.currentTimeMillis();
//执行前端插入50万条数据花费的时间
System.out.println("插入500000条数据花费的时间为: "+(t2-t1)+"ms");
}
然而耗时仅仅只用了33ms.zhege 差距差不多就是1000倍数关系了。
三、总结:
List的实现类ArrayList和LinkedList各有千秋再开发使用的过程中应该结合实际情况酌情使用有助于代码的高效。