上一篇介绍了类集的概念、框架的主要接口以及保存单值集合的最大父接口:Collection接口。
接下来介绍一下 Collection 的其中一个子接口:List。
一、List 接口
概念:List 是 Collection 的子接口,List 接口可以存放任意的数据,里面的内容是允许重复的。
接口的定义如下:
public interface List<E> extends Collection<E>
List 接口大量的扩充了 Collection 接口的操作,功能要比 Collection 接口强大很多。
下面表格是 List 接口扩展的方法:
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public void add (int index, E element) | 普通 | 在指定位置增加元素 |
2 | public boolean addAll(int index, Collection<? extends E> c) | 普通 | 在指定位置增加一组元素 |
3 | E get (int index) | 普通 | 返回指定位置的元素 |
4 | public int indexOf (Object o) | 普通 | 查找指定元素的位置 |
5 | public int lastIndexOf (Object o) | 普通 | 从后向前查找指定元素的位置 |
6 | public ListIterator<E> listIterator() | 普通 | 为 ListIterator 接口实例化 |
7 | public E remove (int index) | 普通 | 按指定的位置删除元素 |
8 | public List<E> subList(int fromIndex, int toIndex) | 普通 | 取出集合中的子集合 |
9 | public E set (int index, E element) | 普通 | 替换指定位置的元素 |
注意:要想使用接口,肯定要使用对象的多态性进行实例化的操作,对于 List 接口本身也是一样的。
1.1 List 接口的常用子类 —— ArrayList
ArrayList 是 List 接口的子类,可以直接通过对象的多态性,为 List 接口进行实例化。
此类的定义如下:
public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,Serializable
AbstractList 类的定义如下:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
示例代码 一:向集合中增加元素
import java.util.ArrayList;
import java.util.List;
import java.util.Collection;
public class ArrayListDemo01 {
public static void main(String[] args) {
List<String> allList = null;
Collection<String> allCollection = null;
allList = new ArrayList<String>(); //指定操作泛型为String
allCollection = new ArrayList<String>(); //指定一个集合
allList.add("Hello"); //此方法由Collection接口而来
// allList.add("World"); //默认情况下是往后加入数据
allList.add(0,"World"); //在第一个位置上添加新的内容
System.out.println(allList);
allCollection.add("AAA");
allCollection.add("www.baidu.com");
allList.addAll(allCollection);
// allList.addAll(0,allCollection); //在指定位置上增加数据
System.out.println(allList);
}
}
输出结果如下:
[World, Hello]
[World, Hello, AAA, www.baidu.com]
既然可以增加数据,那么就可以删除数据。
List 中存在两种删除:1、根据对象内容;2、根据对象的编号。
示例代码二:删除元素
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo02 {
public static void main(String[] args) {
List<String> allList = null;
allList = new ArrayList<String>(); //指定操作泛型为String
allList.add("Hello"); //此方法由Collection接口而来
allList.add("Hello"); //此方法由Collection接口而来
allList.add(0,"World"); //在第一个位置上添加新的内容,此方法为List扩展的方法
allList.add("BBB");
allList.add("www.baidu.com");
System.out.println(allList);
allList.remove(0); //删除指定位置的元素
allList.remove("Hello"); //删除指定内容的元素,只删除最先扫描到的元素,此方法由Collevtion接口继承而来
System.out.println(allList);
}
}
输出结果如下:
[World, Hello, Hello, BBB, www.baidu.com]
[Hello, BBB, www.baidu.com]
集合中的内容可以添加,可以删除,实际上最重要的就是输出。
在 List 接口中提供了 get() 方法,利用此方法就可以完成输出。可以通过循环完成输出,循环的次数有 size() 方法取得。此输出方式是 List 接口所独有的,而其他接口是没有的,尤其是 Collection 中是没有根据索引取出内容的操作。集合中还有以下的几个操作:
◇ 判断集合是否为空:boolean isEmpty();
◇ 截取部分集合:List<E> subList(int fromIndex, int toIndex),List 接口扩充;
◇ 查找指定的对象是否存在:int indexOf(Object o),如果查找到则返回位置,否则返回 -1;
◇ 查找是否存在:boolean contains(Object o);
示例代码三:
import java.util.*;
public class ArrayListDemo03 {
public static void main(String[] args) {
List<String> allList = null;
allList = new ArrayList<String>(); //指定操作泛型为String
System.out.println("集合操作前是否为空:" + allList.isEmpty());
allList.add("Hello"); //此方法由Collection接口而来
allList.add(0,"World"); //在第一个位置上添加新的内容,此方法为List扩展的方法
allList.add("CCC");
allList.add("www.baidu.com");
System.out.println(allList.contains("Hello")?"\"Hello\"字符串存在!":"\"Hello\"字符串不存在!");
System.out.print("指定数组类型:");
String str [] = allList.toArray(new String[]{}); //指定好类型
for (int i = 0; i < str.length; i++) {
System.out.print(str[i] + "、");
}
System.out.print("\n返回对象数组:");
Object obj [] = allList.toArray(); //返回Object类型
for (int i = 0; i < obj.length; i++) {
System.out.print((String)obj[i] + "、"); //进行向下转型
}
List<String> allSub = allList.subList(2, 3); //字符串截取
System.out.print("集合截取:");
for (int i = 0; i < allSub.size(); i++) {
System.out.print(allSub.get(i));
}
System.out.println("\nCCC字符串的位置:" + allList.indexOf("CCC"));
System.out.println("集合操作后是否为空:" + allList.isEmpty());
}
}
输出结果如下:
集合操作前是否为空:true
"Hello"字符串存在!
指定数组类型:World、Hello、CCC、www.baidu.com、
返回对象数组:World、Hello、CCC、www.baidu.com、集合截取:CCC
CCC字符串的位置:2
集合操作后是否为空:false
以上的操作都是使用 ArrayList 子类完成的。
二、旧的子类:Vector
在 List 接口中还有一个子类:Vector,Vector 类属于一个挽救的子类,从整个 Java 的集合发展来看,Vector 算是一个元老级的类,在 JDK 1.0 的时候就已经存在此类。但是到了 Java 2(JDK 1.2)之后重点强调了集合框架的概念,所以先后定义了很多的新接口(如:List等),但是考虑到一大部分的人已经习惯了使用 Vector 类,所以 Java 的设计者,就让 Vector 类多实现了一个 List 接口,这才将其保留下来。但是因为其是 List 的子类,所以 Vector 类的使用与之前的并没有太大的区别。
Vector 类的定义如下:
public class Vector<E> extends AbstractList<E> implements List<E> RandomAccess,Cloneable,Serializable
因为 Vector 类本身属于旧的类,所以在类中也提供了很多重复的方法:
◇ 增加元素:public void addElement(E obj),此方法是最早的增加元素的操作,之后此方法的功能与 add() 方法是一样的。
示例代码:
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
Vector<String> allList = null;
allList = new Vector<String>(); //指定操作泛型为String
allList.addElement("Hello"); //此方法由Collection接口而来
allList.addElement("World"); //在第一个位置上添加新的内容
allList.addElement("www.baidu.com"); //默认情况下向最后加入
for (int i = 0; i < allList.size(); i++) {
System.out.print(allList.get(i) + "、");
}
}
}
三、子类的差异:ArrayList 与 Vector 的区别
下列表格列出了两个子类之间的区别:
No. | 比较点 | ArrayList | Vector |
---|---|---|---|
1 | 推出时间 | JDK 1.2 之后推出,属于新的操作类 | JDK 1.0 时推出,属于旧的操作类 |
2 | 性能 | 采用异步处理方式,性能更高 | 采用同步处理方式,性能较低 |
3 | 线程安全 | 属于非线程安全的操作类 | 属于线程安全的操作类 |
4 | 输出 | 只能使用 Iterator、foreach 输出 | 可以使用 Iterator、foreach、Enumeration 输出 |
(以上是对 List 接口的一些介绍,在后面的文章中将会逐个介绍其他的子接口。)
希望此篇文章对大家在学习上有所帮助,若有不对之处也请指出!