第 13章
对象容器
– Collection类
– Map类简介 List界面
List界面是 java.util.Collection接口的子接口
Collection界面是 java.lang.Iterable子界面
在 Java SE的 API中找不到任何实作 Iterator的类别
– Iterator会根据实际的容器数据结构来迭代元素
– 而容器的数据结构实作方式对外界是隐藏的
package java.lang;
import java.util.Iterator;
public interface Iterable<T> {
Iterator<T> iterator();
}
简介 List界面
Collection界面继承了 Iterator界面
package java.util;
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
<T> T[] toArray(T[] a);
boolean add(E o);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);
int hashCode();
}
简介 List界面
每个加入 List中的元素是循序加入的,并可指定索引来存取元素
package java.util;
public interface List<E> extends Collection<E> {
....
boolean addAll(int index,Collection<? extends E> c);
E get(int index);
E set(int index,E element);
void add(int index,E element);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
List<E> subList(int fromIndex,int toIndex);
....
}
简介 List界面
List可以使用数组( Array)或是链结串行
( LinkedList)来实作这个特性
对于循序加入与存取,使用 ArrayList的效率比较好
对于经常变动元素排列顺序的需求,使用
LinkedList会比较好
ArrayList
使用数组结构实作 List数据结构
可以使用索引来快速指定对象的位置
于快速的随机取得对象来说,使用 ArrayList
可以得到较好的效能
若要从中间作移除或插入对象的动作,会需要搬动后段的数组元素以重新调整索引顺序,所以速度上就会慢的多
ArrayList
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.print("显示输入,");
for(int i = 0; i < list.size(); i++)
System.out.print(list.get(i) + " ");
System.out.println();
ArrayList
如果您的目的是要循序取出容器中所有的对象,则您可以 使用 Iterator
Iterator的实例是在 ArrayList中根据数组的结构而实作的,但您不用理会实作细节
Iterator iterator = list.iterator();
while(iterator.hasNext()) { //还有下一个元素吗?
//使用 next()取得下一个元素
System.out.print(iterator.next() + " ");
}
ArrayList
使用「增强的 for循环」( Enhanced
forloop)来直接遍访 List的所有元素
//使用 foreach来遍访 List中的元素
for(String s,list) {
System.out.print(s + " ");
}
LinkedList
如果经常从容器中作移除或插入对象的动作,使用 LinkedList会获得较好的效能
LinkedList使用链结串行 ( Linkedlist)实作了 List界面
addFirst(),addLast(),getFirst()、
getLast(),removeFirst( ),removeLast()

LinkedList
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();
}
LinkedList
private LinkedList<String> linkedList;
public StringQueue() {
linkedList = new LinkedList<String>();
}
public void put(String name) {
linkedList.addFirst(name);
}
public String get() {
return linkedList.removeLast();
}
public boolean isEmpty() {
return linkedList.isEmpty();
}
HashSet
实作了 java.util.Set界面,Set界面继承了
Collection界面
List容器中的对象允许重复,但 Set容器中的对象都是唯一的
Set容器有自己的一套排序规则
HashSet容器中的对象是否相同时,会先比较 hashCode()方法传回的值是否相同,如果相同,则再使用 equals()方法比较,如果两者都相同,则视为相同的对象
HashSet
Set<String> set = new HashSet<String>();
set.add("caterpillar");
set.add("momor");
set.add("bush");
//故意加入重复的对象
set.add("caterpillar");
//使用 Iterator显示对象
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
HashSet
Set<String> set = new LinkedHashSet<String>();
set.add("caterpillar");
set.add("momor");
set.add("bush");
//使用 enhanced for loop显示对象
for(String name,set) {
System.out.print(name + " ");
}
System.out.println();
TreeSet
TreeSet实作 Set界面与 java.util.SortedSet
界面
TreeSet是 JavaSE中唯一实作 SortedSet接口的类别
自动依字典顺序进行排列的动作
TreeSet
Set<String> set = new TreeSet<String>();
set.add("justin");
set.add("caterpillar");
set.add("momor");
//使用 enhanced for loop显示对象
for(String name,set) {
System.out.print(name + " ");
}
System.out.println();
TreeSet
自定义一个实作 Comparator接口的类别
public class CustomComparator<T> implements Comparator<T> {
public int compare(T o1,T o2) {
if (((T) o1).equals(o2))
return 0;
return ((Comparable<T>) o1).compareTo((T) o2) * -1;
}
}
Comparator<String> comparator =
new CustomComparator<String>();
Set<String> set =
new TreeSet<String>(comparator);
HashMap
Map的特性即「键 -值」( Key-Value)匹配
java.util.HashMap实作了 Map界面,
HashMap在内部实作使用哈希( Hash),
很快的时间内可以寻得「键 -值」匹配
HashMap
Map<String,String> map =
new HashMap<String,String>();
String key1 = "caterpillar";
String key2 = "justin";
map.put(key1,"caterpillar的讯息 ");
map.put(key2,"justin的讯息 ");
System.out.println(map.get(key1));
System.out.println(map.get(key2));
HashMap
可以使用 values()方法返回一个实作
Collection的对象,当中包括所有的「值」
对象
Map<String,String> map =
new HashMap<String,String>();
map.put("justin","justin的讯息 ");
map.put("momor","momor的讯息 ");
map.put("caterpillar","caterpillar的讯息 ");
Collection collection = map.values();
Iterator iterator = collection.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println();
HashMap
Map<String,String> map =
new LinkedHashMap<String,String>();
map.put("justin","justin的讯息 ");
map.put("momor","momor的讯息 ");
map.put("caterpillar","caterpillar的讯息 ");
for(String value,map.values()) {
System.out.println(value);
}
TreeMap
java.util.TreeMap实作 Map界面与
java.util.SortedMap界面
SortedMap提供相关的方法让您有序的取出对应位置的对象,像是 firstKey(),lastKey()
等方法
TreeMap是 JavaSE中唯一实作 SortedMap
接口的类别
TreeMap
Map<String,String> map =
new TreeMap<String,String>();
map.put("justin","justin的讯息 ");
map.put("momor","momor的讯息 ");
map.put("caterpillar","caterpillar的讯息 ");
for(String value,map.values()) {
System.out.println(value);
}
TreeMap
如果对对象有一套排列顺序,要定义一个实作 java.util.Comparator接口的对象
CustomComparator<String> comparator =
new CustomComparator<String>();
Map<String,String> map =
new TreeMap<String,String>(comparator);