淘先锋技术网

首页 1 2 3 4 5 6 7

大家知道,集合框架是为了表示和操作集合而规定的一种统一的标准的体系结构,学习集合知识有利于我们解决一系列例如保存数据与对象的问题。

常用的集合在系统中定义了两大接口,List和Set

这里我们就来讨论一下List 的定义以及一些常见的问题

List定义的是有序的并且数据可以重复的集合,我们先看一下下面这段代码:

import java.util.ArrayList;

import java.util.List;

publicclass ListTest{

publicstaticvoid main(String args[]){

ListTest lt=new ListTest();

List list=new ArrayList();

for(int i=0;i<5;i++){

list.add(i);

}

for(int i=0;i

System.out.println(list.get(i));

}

}

}

这段代码在Eclipse中是可以运行的,但是我们在cmd(命令提示符)中编译这段代码的时候就会发现,上面会显示这样一段文字

注: ListTest.java使用了未经检查或不安全的操作。

注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。

这说明我们在List定义的时候没有指定类型,而Eclipse在执行的时候自动为List指定了泛型,所以在编译的时候才不会出错,为了解决这样的错误,我们应该这样定义

List list=new ArrayList();

这里所说的有序并不是说在List定义好之后,里面的元素就已经排好顺序,而是按照List中插入元素的顺序。在List定义的时候,我们要使用List的实现类,上面一段代码已经展示了ArrayList的实现方法,这里的ArrayList就像我们所熟悉的数组,里面也包含了包括数组的插入,添加元素等等操作,需要注意的是,由于ArrayList采用的是线性操作,从性能的观点来看,在很多实现中,它们将执行高开销的线性搜索。

ArrarList中的构造方法里面写的一句话很有意思,()是构造一个初始容量为 10 的空列表。但是我们如果不对ArrayList中添加元素,如下:

import java.util.ArrayList;

import java.util.List;

publicclass ListTest{

publicstaticvoid main(String args[]){

List list=new ArrayList();

System.out.println(list.size());

}

}

我们会发现输出的list长度并不是10,而是0;这是由于size方法返回的是List中的元素的个数,而我们并没有对List中添加元素,所以长度为0。

为了解决ArrayList中的插入与删除操作所进行的时间复杂度较大的队列重新排序的操作,我们可以定义LinkedList来实现List方法,当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样,所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。

注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须保持外部同步。

所以,这样所实现的List是不能随即访问的,虽然提供了get()方法,但是这个方法是通过遍历结点来定位的,所以速度比较慢。