作为一个初学者,粗浅地总结一下对Container的理解。。。其中错误、不当之处,恳请纠正,先谢啦!
1 比较List, Map, Set
1) List, Set, Queue都继承了接口Collection,可以使用Collections工具类...sort(), reverse(), binarySearch()这几个方法只适用于List<?> list,不适用于Set
List的实现类有: Vector, LinkedList, ArrayList....
Queue的实现类有: LinkedList, PrioritiesQueue...
Map没有实现上述工具类的接口
Map的实现类有: HashMap, HashTable, TreeMap...
HashMap键和值都允许为NULL
HashTable键和值不允许为NULL
2) List有序、值可以重复,有index; 所以,查询比较快,读写比较慢
Set无序,值不能重复;所以查询比较慢,读写快;
Map是以key-value pair的形式存储数据;
3) PriorityQueue, Queue这些类都是有序排列的,FIFO(First in first out),可以理解成list-like
Properties是key-value pair存储,可以理解成map-like
TreeMap: 排序是以key自然升序来排列(缺省情况,即没有继承Comparator接口,没有重写Compare()方法时);
TreeSet: 以自然升序来排列(缺省情况,即没有继承Comparator接口,没有重写Compare()方法时);
TreeMap/TreeSet实例:
package com.ocjp.collection;
import java.util.*;
public class Piles {
public static void main(String[] args) {
TreeMap<String, String> tm = new TreeMap<String, String>();
TreeSet<String> ts = new TreeSet<String>();
String[] k = {"1", "b", "4", "3"};
String[] v = {"a", "d", "3", "b"};
for(int i=0; i<4; i++) {
tm.put(k[i], v[i]);
ts.add(v[i]);
}
//TreeMap排序是以key自然升序来排列;
System.out.print(tm.values() + " ");
Iterator it2 = ts.iterator();
//TreeSet以自然升序来排列;
while(it2.hasNext()) System.out.print(it2.next() + "-");
} }
TreeSet.subSet()方法:
package com.ocjp.collection;
import java.util.*;
public class Corner {
public static void main(String[] args) {
TreeSet<String> t1 = new TreeSet<String>();
TreeSet<String> t2 = new TreeSet<String>();
t1.add("b");
t1.add("7");
// t2的范围是[3,c);
// t2是t1的备份集合,修改t2同时也修改了t1;vice-versa;
t2 = (TreeSet)t1.subSet("5", "c");
try {
// t1增加了一个超出t2范围的值,t2自动将其忽略,不会抛异常;但t1已经接收了这个值;
t1.add("d");
t2.add("6");
// t2增加了一个超过范围的值,直接抛异常;
t2.add("3");
}
catch (Exception e) {
System.out.print("ex ");
}
System.out.println(t1 + " " + t2);
}
}
输出:
ex [6, 7, b, d] [6, 7, b]
import java.util.*;
class Priorities {
public static void main(String[] args) {
// PriorityQueue是类似于list的集合,但放入的元素,是按照自然序列排序的
// 内部的元素必须实现了Comparator<I>的compareTo();本例中,String已经重写了此方法;
// PriorityQueue 可以有重复元素;
// add(), offer()是增加元素的方法;
// peek(), poll()是获得元素的方法,但前者不移除当前元素,后者移除;
// 获取元素时,遵守FIFO原则(First in First out);
PriorityQueue toDo = new PriorityQueue();
toDo.add("dishes");
toDo.add("laundry");
toDo.add("bills");
toDo.offer("bills");
System.out.print(toDo.size() + " " + toDo.poll());
System.out.print(" " + toDo.peek() + " " + toDo.poll());
System.out.println(" " + toDo.poll() + " " + toDo.poll());
}
}
Output:
4 bills bills bills dishes laundry