了解了集合框架中定义的接口,接着要了解实现它们的标准类。一些类提供了完整的可以被使用的工具。另一些类是抽象的,可作为创建具体类集的起始点。集合框架中定义的类集合是非同步的,但也可获得同步版本。
实现List接口的类:
类 | 描述 |
---|---|
AbstractCollection | 抽象类,实现大多数 Collection 接口中的方法 |
AbstractList | 抽象类,继承AbstractCollection 并实现大多数 List 接口中的方法 |
AbstractSequentialList | 抽象类,继承AbstractList,该类集使用连续而不是随机的方式访问其元素 |
LinkedList | 通过继承AbstractSequentialList 来实现链接列表 |
ArrayList | 通过继承 AbstractList来实现动态数组 |
Vector | 可增长的动态数组,和ArrayList类似,支持同步特性 |
Stack | 继承 Vector,实现了栈的数据结构 |
实现List 接口的类图
1.ArrayList类
Arraylist 类继承 AbstractList 并实现 List接口。 ArrayList 支持可随需要增长的动态数组。在 Java 中,标准数组是定长的。在创建数组之后,它们不能被加成或缩短,这也就意味着必须事先知道数组可以容纳多少元素。但是,用户通常知道运行时才能知道需要多大的数组。 为了解决这个问题,集合框架定义了 ArrayList。
ArrayList能够动态地增加或减少其大小。 ArrayList的对象以一个初始大小被创建。当超过了它的大小时,可自动增大。当对象呗删除后,就可以自动缩小。
注意:动态数组也被从前版本遗留下来的类 Vector 所支持。 ArrayList 的性能比传统的 Vector 要好。
ArrayList的构造函数:
ArrayList();
ArrayList(Collection c);
ArrayList(int capacity);
其中 第一个构造函数建立一个空的数组列表。第二个构造函数建立一个数组列表,该数组列表由类集 c 中的元素初始化。 第三个构造函数建立一个数组列表,该数组有指定的初始容量(Capacity)。容量是用于存储元素的基本数组大小。当元素被追加到数组列表上时,容量会自动增加。
ArrayList类的使用
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList();
System.out.println("List 的初始大小:" + al.size());
al.add("A");
al.add("B");
al.add("C");
al.add("D");
al.add("E");
al.add("F");
al.add(1,"A2");
System.out.println("元素增加后的大小:" + al.size());
System.out.println("List 中的内容:"+ al);
al.remove("D");
al.remove(2);
System.out.println("删除元素后的大小:" + al.size());
System.out.println("内容" + al);
}
}
// List 的初始大小:0
// 元素增加后的大小:7
// List 中的内容:[A, A2, B, C, D, E, F]
// 删除元素后的大小:5
// 内容[A, A2, C, E, F]
使用了 toString() 方法默认转换显示类集的内容,toString()方法是从 AbstractCollection 继承下来的。尽管 它对简短的程序来说是足够了,然而很少使用这种方法显示类集中的内容 。通常自己提供输出程序。
从 ArrayList获取得到数组:
当时用 ArrayList 时,有时想要获取一个实际的数组,这个数组包含了列表的内容。可以通过调用方法 toArray() 来实现它。下面可能是想将类集转换为数组的原因:
- 对于一些操作,可以获得更快的处理速度。
- 为了给方法传递数组,而方法不必重载区接收类集。
- 为了将新的基于类集的程序与不认识的类集的老程序集成。
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add(new Double(10.3));
al.add(new Double(20.4));
al.add(new Double(30.5));
al.add(new Double(40.6));
al.add(new Double(50.7));
System.out.println("内容:"+ al);
Object a[] = al.toArray();
double sum = 0;
for (int i = 0; i < a.length; i++){
sum += ((Double)a[i]).doubleValue();
}
System.out.println("Sum :" + sum);
}
}
// 内容:[10.3, 20.4, 30.5, 40.6, 50.7]
// Sum :152.5
LinkedList类
LinkedLIst 类继承了 AbstractSequentialList并实现了接口 List。它提供了一个连接列表数据结构。它具有如下的两个数据结构:
LinkedList();
LinkedList(Collection c);
第一个构造函数建立一个空的连接列表。第二个构造函数建立一个连接列表,由类 c 中的元素初始化。
除了所继承的方法之外,LinkedList 类本身还定义了一些有用的方法,这些方法主要用于操作和访问列表。
使用 addFirst() 方法可以在列表头增加元素,使用 addLast()方法可以在列表的尾部增加元素。其形式如下:
void addFirst(Object obj);
void addLast(Object obj);
调用 getFirst()方法可以获得第一个元素。调用getLast()方法可以获得最后一个元素,其形式如下:
object getFirst();
object getLast();
为了删除第一个元素,可以使用 removeFirst() 方法,为了删除最后一个元素,可以调用 removeLast() 方法, 其形式如下:
Object removeFirst();
Object removeLast();
为了判断一个元素是否在列表中定义 了 contains() 方法,其形式如下:
boolean contains(Object elem);
LinkedList 操作
import java.util.*;
public class ArrayListDemo {
public static void main(String[] args) {
LinkedList ll = new LinkedList();
System.out.println("List 的初始大小:" + ll.size());
ll.add("A");
ll.add("B");
ll.add("C");
ll.add("D");
ll.add("E");
ll.add("F");
ll.add(0,"A2");
System.out.println("增加元素后的大小:" + ll.size());
System.out.println("List 中的内容:"+ll);
ll.remove("D");
ll.remove(2);
System.out.println("是否包含元素 C:"+ll.contains("C"));
System.out.println("是否包含元素 D:"+ll.contains("D"));
ArrayList al = new ArrayList(ll);
ll.clear();
System.out.println("List 是否为空:"+ll.isEmpty());
ll.addAll((al));
System.out.println("List 中的内容"+ll);
ll.addFirst("A3");
ll.addLast("A4");
System.out.println("List 中的内容"+ll);
}
}
// List 的初始大小:0
// 增加元素后的大小:7
// List 中的内容:[A2, A, B, C, D, E, F]
// 是否包含元素 C:true
// 是否包含元素 D:false
// List 是否为空:true
// List 中的内容[A2, A, C, E, F]