1. Collection类
Collection结构可持有各自独立的对象。在JAVA SE中,Collection包括了List与Set,List是实现java.util.List接口的相关类,可依对象被放置至容器中的顺序来排列对象。Set是实现java.util.Set接口的相关类,不接受重复的对象并可拥有自己的一套排序规则。
1.1简介List接口
java.util.ArrayList类实现了java.util.List接口,所以要先认识下List接口。List接口是java.util.Collection接口的子接口,而Collection接口则是java.lang.Iterable的子接口。Iterable接口要求实现求实现一个iterator()方法。
Collection接口继承了Iterator接口,定义了加入元素,删除元素,元素长度等方法。
Collection在删除元素及取得元素上的定义比较通用,List接口则又增加了根据索引取得对象的方法,这说明了List数据结构的特性,每个加入List中的元素是循序加入的,并可指定索引来存取元素。
List可以使用数组(Array)或是链接串行(Linked List)来实现这个特性。前者的实现就是java.util.ArrayList,后者是java.util.LinkedList.对于循序加入与存取,使用ArrayList的效率比较高,对于经常变动排列顺序的需求,使用LinkedList比较好。
1.2 ArrayList
ArrayList使用数组来实现List的数据结构。对于快速随机取得对象来说,使用ArrayList可以取得比较好的效率。但由于使用数组实现,若要从中间做删除或是插入对象就比较困难。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ArrayListDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<String> list = new ArrayList<String>();
System.out.println("输入名称(使用quit结束)");
while (true) {
System.out.print("#");
String input = scanner.next();
if (input.equals("quit"))
break;
list.add(input);
}
System.out.println("显示输入:");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i) + "");
}
}
}
在J2SE 5.0以后新增加了泛型功能,使用对象容器时可以声称将存储的对象类型。这样,对象在存入容器会被限定为所声称的类型。编译器可以在编译时会协助进行类型的检查,而取出对象时也不至于失去原来的类型信息,这可以避免类型转换的问题。
ArrayList中的方法:size()方法可以返回当前的ArrayList的长度,使用get()方法可以返回指定索引处的对象,使用toArray()方法可以将ArrayList中的对象转换为对象数组。
可以使用get()方法指定索引值来取出对象,然后如果您的目的是想循序取出容易中所有的对象,则可以使用Iterator。如:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class IteratorDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<String> list = new ArrayList<String>();
System.out.println("输入名称(输入quit时结束)");
while (true) {
System.out.println("#");
String input = scanner.next();
if (input.equals("quit"))
break;
list.add(input);
}
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next() + " ");
}
}
}
Iterator()方法会返回一个Iterator对象,这个对象提供了遍访容器元素的方法。hasNext()方法测试Iterator中是否还有对象,如果有,可以使用next()方法取出,不用理会Iterator如何实现,事实上在JAVA SE的API上是找不到实现Iterator的类。
1.3 LinkedList
如果经常在容器中做删除或是插入操作,则使用java.util.LinkedList会获得好的效果。像addFirst(),addLast(),getFirst(),getLast(),removeFirst(),removeLast()等.适合用来实现堆栈(stack)与队列(queue)
下面使用LinkedList实现一个先进后出的堆栈类,这个堆栈类存String对象。
import java.util.LinkedList;
public class StringStack {
private LinkedList<String> linkedList;
public StringStack() {
linkedList = new LinkedList<String>();
}
public void push(String name) {
linkedList.addFirst(name);
}
public String top() {
return linkedList.getFirst();
}
public String pop() {
return linkedList.removeFirst();
}
public boolean isEmpty() {
return linkedList.isEmpty();
}
}
下面是调用主程序:
import java.util.Scanner;
public class StringStackDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StringStack stack = new StringStack();
System.out.println("输入名称(使用quit结束)");
while (true) {
System.out.println("#");
String input = scanner.next();
if (input.equals("quit"))
break;
stack.push(input);
}
System.out.println("显示输入:");
while (!stack.isEmpty()) {
System.out.println(stack.pop() + " ");
}
System.out.println();
}
}
对于先进先出的队列,也可以使用LinkedList来实现。
如下:
package queue;
import java.util.LinkedList;
public class StringQueue {
LinkedList<String> linkedList = new LinkedList<String>();
public void put(String name) {
linkedList.addFirst(name);
}
public String get() {
return linkedList.removeLast();
}
public boolean isEmpt() {
return linkedList.isEmpty();
}
}
主程序:
package queue;
import java.util.Scanner;
public class QueueDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StringQueue queue = new StringQueue();
System.out.println("输入名称(使用quit结束)");
while (true) {
System.out.println("#");
String input = scanner.next();
if (input.equals("quit")) {
break;
}
queue.put(input);
}
System.out.println("显示输入");
while (!queue.isEmpt()) {
System.out.println(queue.get() + " ");
}
System.out.println();
}
}