理论教育 Java程序设计:List接口

Java程序设计:List接口

时间:2023-10-18 理论教育 版权反馈
【摘要】:java.util.List接口继承自Collection接口。表9.2List接口的常用方法表9.2中列出了List集合中常用的一些方法。每个ArrayList对象都有一个成员capacity用来表示数组的容量。图9.3程序运行结果由于ArrayList集合是使用数组来实现的,所有的元素都是采用数组的形式进行保存的,因此,ArrayList具有数组的一些优点,如元素查找快,能够根据索引直接找到元素。

Java程序设计:List接口

java.util.List接口继承自Collection接口。List集合允许存储的元素出现重复,所有的元素按照添加的次序有序地进行存放,类似于数组。由于List集合中的所有元素是以线性方式进行存储的,因此可以通过索引直接访问List集合中指定索引位置的元素。

List作为Collection的子接口,不但继承了Collection接口中的全部方法,还增加了一些根据索引来操作集合中元素的方法,List接口的常用方法如表9.2所示。

表9.2 List接口的常用方法

表9.2中列出了List集合中常用的一些方法。需要注意的是,如果给定的索引值index不在集合的范围内,将抛出IndexOutOfBoundsException异常。

(1)当索引index < 0 || index >= size() ,get()、set()、remove()方法会抛出索引越界异常。因为这三种方法是对原集合元素进行读取和修改,元素的索引是从0开始,最后一个元素的索引值为size()-1,size()位置没有元素,因此无法取到size()。

(2)当索引index < 0 || index > size() ,add()、addAll()、listIterator()方法会抛出索引越界异常。

(3)当索引fromIndex < 0 || toIndex > size() || fromIndex > toIndex 时,subList()方法会抛出索引越界异常。

另外,如果尝试向集合中添加类型不符的元素或者向不能添加空元素的集合中添加空元素,可能会抛出NullPointerException或ClassCastException异常。

在了解了List接口的常用方法之后,下面来学习List接口的两个重要实现类:ArrayList和LinkedList。

1.ArrayList集合

ArrayList 是List接口的一个实现类,从类的命名可以看出,这个实现类存储集合元素是类似数组Array一样按序存储的。查看JDK中关于ArrayList类的实现,可以发现ArrayList实际就是用数组来实现的,其内部封装了一个动态再分配的Object数组。每个ArrayList对象都有一个成员capacity用来表示数组的容量。当存入的元素个数超过了预设数组的容量时,ArrayList会为其分配一个更大的数组来存储,从而实现长度的变化。

创建一个ArrayList集合的方法有:

1)public ArrayList()

无参构造方法,用于构造一个空集合。 ArrayList类中有一个静态常量private static final int DEFAULT_CAPACITY 用来设置初始容量,其默认值为10。

2)public ArrayList(int initialCapacity)

该方法可以用于构造一个初始容量为initialCapacity的空集合,其中initialCapacity为指定的集合初始容量。如果指定的容量为负数,会抛出IllegalArgumentException异常。

3)public ArrayList(Collection<? extends E> c)

该方法用于构造一个包含指定集合c中所有元素的集合,集合中元素的顺序与集合c中元素顺序一致。如果给定的集合c为空,将抛出NullPointerException异常。

【例9.2】编写一个存储String类型的ArrayList集合,并使用表9.2中的方法操作该集合。

在上述代码ArrayListDemo.java中,首先使用了无参构造方法创建了一个ArrayList集合temp,然后向temp集合添加了3个元素。之后,通过有参构造方法public ArrayList(Collection<?extends E> c)创建了一个新的集合list。然后,分别对list集合进行了添加、删除、替换以及遍历等操作。程序输出结果如图9.3所示。

图9.3 程序运行结果

由于ArrayList集合是使用数组来实现的,所有的元素都是采用数组的形式进行保存的,因此,ArrayList具有数组的一些优点,如元素查找快,能够根据索引直接找到元素。但ArrayList同样也会具有数组的缺点,如增加和删除指定索引位置的元素时效率很低下,因此ArrayList不适用于元素增删频繁的场合。

2.LinkedList

之前我们提到,ArrayList因为底层是采用数组来实现的,因此不适用于频繁的元素增删操作。因此Java的集合类中提供了一种采用链表来实现的集合类—— LinkedList。

查阅JDK中的源码可以发现,LinkedList的实现采用的是双向链表。所谓双向链表指的是链表中的每个元素都有一个next来表示下一个元素节点,有一个prev来表示上一个元素节点,这样所有的元素节点之间就形成了“链”。(www.daowen.com)

说明:

LinkedList在JDK 1.6及之前采用双向循环链表来实现,在JDK1.7及之后采用双向链表来实现。

元素节点的代码如下:

当需要插入一个新元素时,只需要修改元素节点中的next和prev即可。如果要在元素1和元素2之间添加新元素,则只需要在元素1的next和元素2的prev中保存新元素节点,新元素的next保存元素2,新元素的prev保存元素1,如图9.4所示。

图9.4 向双向链表中添加新元素

当需要删除一个新元素时,与新增元素类似,如要删除元素1和元素3之间的元素2,则只需要将元素1的next改为保存元素3,将元素3的prev改为保存元素1即可,如图9.5所示。

图9.5 从双向链表中删除元素

从图9.4和图9.5的添加和删除操作可以看出,对于链表而言,删除和新增元素只需要修改元素之间保存的节点关系即可,而不需要向数组那样进行大量的copy操作,大大提高了增删元素的效率。

LinkedList中针对双向链表的这种特点,新增了一些对集合的操作方法,如表9.3所示。

表9.3 LinkedList中的新方法

创建一个LinkedList集合的方法有:

1)public LinkedList ()

无参构造方法,用于构造一个空集合。

2)public LinkedList (Collection<? extends E> c)

该方法用于构造一个包含指定集合c中所有元素的集合,集合中元素的顺序与集合c中元素顺序一致。如果给定的集合c为空,将抛出NullPointerException异常。

注意:

LinkedList的构造方法中没有public LinkedList (int initialCapacity),因为链表是不需要设定初始容量的。

【例9.3】编写一个存储String类型的LinkedList集合,并对集合进行一些简单操作。

在上述代码LinkedListDemo.java中,首先使用了无参构造方法创建了一个ArrayList集合temp,然后向temp集合添加了3个元素。之后,通过有参构造方法public LinkedListDemo(Collection<? extends E> c)创建了一个LinkedList集合list。然后,分别对list集合进行了添加、删除、读取等操作。程序输出结果如图9.6所示。

图9.6 程序运行结果

从上述示例可以看出,LinkedList能够很方便地操作集合的头部和尾部元素,因此LinkedList很适合用来实现堆栈

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈