持有对象
基本概念
java容器类类库的用途是保存对象,并将其划分为两个不同的概念:
1.Collection 一个独立元素序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与插入顺序相同)
2.Map 一组成对的键值对对象,允许使用键来查找值。
List
有两种类型的List:
1.基本的ArrayList,它长于随机访问元素,但是在List的中间插图和删除元素时较慢
2.LinkedList,他通过代价较低的在List中间进行插入和删除操作,提供了优化的顺序访问,在随机访问方面相对比较慢。
迭代器
迭代器是一个对象,它的工作是遍历并选择序列中的对象,通常被称为轻量级对象:创建它的代价小
Java的Iterator只能单向移动:
1.使用方法Iterator()要求容器返回一个Iterator,Iterator将准备好返回序列的第一个元素。
2.使用next()获得序列中的下一个元素
3.使用hasNext()检查序列中是否还有元素
4.使用remove()将迭代器新进返回的元素删除
Set
Set不保存重复的元素
import java.util.*;
public class SetOfInteger {
public static void main(String[] args){
Random rand =new Random(47);
Set<Integer> inset=new HashSet<Integer>();
for(int i=0;i<10000;i++)
inset.add(rand.nextInt(30));
System.out.println(inset);
}
}
其输出顺序没有任何规律,如果想对结果排序,一种方法是使用TreeSet来代替HashSet
SortedSet<Integer> inset =new TreeSet<Integer>();
Map
将对象映射到其他对象的能力是一种解决编程问题的杀手锏
import java.util.*;
public class Statistics {
public static void main(String[] args){
Random rand = new Random(47);
Map<Integer,Integer> m=new HashMap<Integer,Integer>();
for(int i=0;i<10000;i++){
int r=rand.nextInt(20);
Integer freq=m.get(r);
m.put(r,freq==null? 1:freq+1);
}
System.out.println(m);
}
}
Queue
队列是一个典型的先进先出(FIFO)的容器,即从容器的一端放入事物,从另一端取出,并且事物放入容器与取出的顺序是相同的。
队列常被当作一种可靠的将对象从程序的某个区域传输到另一个区域的途径。
LinkedList提供了方法以支持队列的行为,并且实现了Queue接口。
import java.util.*;
public class QueueDemo {
public static void printQ(Queue queue){
while(queue.peek()!=null)
System.out.print(queue.remove()+" ");
System.out.println();
}
public static void main(String[] args){
Queue<Integer> queue=new LinkedList<Integer>();
Random rand=new Random(47);
for(int i=0;i<10;i++)
queue.offer(rand.nextInt(i+10));
printQ(queue);
Queue<Character> qc=new LinkedList<Character>();
for(char c:"Brontosaurus".toCharArray())
qc.offer(c);
printQ(qc);
}
}
Collection和Iterator
Collection是描述所有序列容器的共性的根接口,即因为要表示其他若干个接口的共性而出现的接口。
生成Iterator是将队列与消费队列的方法连接在一起耦合度最小的方式,并且与实现Collection相比,它在序列类上所施加的约束也少得多。
参考书《Java编程思想》