java 集合中主要介面的介紹
集合-有時候被稱為容器, 就像一手牌(牌的結合),一個郵箱(郵件的集合),或者一個電話簿(姓名和電話對應的關係圖)
集合框架核心介面圖
·Collection對集合核心介面的說明,所有的集合都實現了Collection這個介面,java沒有類直接實現了Collection這個介面而是通過更加具體的子介面,比如Set and List
·Set 不能放重複元素新增重複的元素將毫無用處
·
List
有順序的集合,可以存放重複的元素
·Queue
先進先出的集合
FIFO (first-in-first-out)
·Map
用鍵值對的關係來儲存資料,鍵值不能重複,一個鍵只能對應一個值
·SortedSet,
SortedMap
分別是
Set和map的排序版本
Collection 介面:集合框架中的最頂的介面,集合中最抽象的一個介面
·
需要注意的方法:addAll
boolean addAll(Collection c)
將另外一個集合中的所有元素新增到這個集合中,
而如果用add()方法則是把集合C按照一個元素新增進去。
Set
介面:不能放重複的元素的集合。在java中有三種主要的實現
HashSet
, TreeSet
, and LinkedHashSet
·HashSet
效率最高,但是不能保證集合裡面的元素是按順序讀取的
·
TreeSet
通過所儲存的元素的值對元素進行排序,比HashSet
·
LinkedHashSet
通過集合裡面的元素插入的時候的順序進行排序
Eg1
import java.util.*;
publicclass TestSet {
publicstaticvoid main(String args[]) {
Set s = new HashSet();
String test[]={"java", "FindDups" ,"i" ,"came", "i", "saw", "i", "left"};
String a;
for (int i=0;i<test.length;i++){
a=test[i];
if (!s.add(a
System.out.println("Duplicate: " + a);
System.out.println(s.size()+" distinct words: "+s);
}
}
}
需要注意的一點是程式碼中一直引用的是 (Set
)這個介面而不是具體的實現類(HashSet
).這樣做的好處就是給你的程式帶來了很好的適應性。上面的例子中的輸出是沒有經過排序的,如果你希望進行排序,僅僅把hashset的實現換成treeset就好了
Eg2假設你想知道在一串字元中那些只是出現了一次,那些有重複,並且只是在最後列印結果
可以通過兩個set來實現
import java.util.*;
public class FindDups2 {
public static void main(String args[]) {
Set<String> uniques = new HashSet<String>();
Set<String> dups = new HashSet<String>();
for (String a : args)
if (!uniques.add(a))
dups.add(a);
//Destructive set-difference
uniques.removeAll(dups);
System.out.println("Unique words:" + uniques);
System.out.println("Duplicate words: " + dups);
}
}
Eg3
去掉重複的元素
Monster m=new Monster(i);
List c=new ArrayList();
c.add(m);
c.add(m);
HashSet noDups = new HashSet(c);
Iterator it=noDups.iterator();
while(it.hasNext()){
Monster mon=(Monster)it.next();
System.out.println();
System.out.println("new"+mon.toString());
}
List介面是一個有順序的集合,可以有重複的元素
如果兩個List 以相同的順序儲存相同的元素那這兩個list就是equal的
Queue
介面,先進先出的集合
FIFO (first-in-first-out)
import java.util.*;
publicclass Countdown {
publicstaticvoid main(String[] args)
throws InterruptedException {
int time = Integer.parseInt(args[0]);
Queue<Integer> queue = new LinkedList<Integer>();
for (int i = time; i >= 0; i--)
queue.add(i);
while(!queue.isEmpty()) {
System.out.println(queue.remove());
Thread.sleep(1000);
}
}
}
Map 介面用鍵值對的關係來儲存資料,鍵值不能重複,一個鍵只能對應一個值Map
的實現類:和set類似
Map
的基本方法:
(put
, get
, containsKey
, containsValue
, size
, and isEmpty
)
Eg1 輸入 java Freq if it is to be it is up to me to delegate
輸出 8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
import java.util.*;
publicclass Freq {
publicstaticvoid main(String args[]) {
Map<String, Integer>m =
new HashMap<String, Integer>();
// Initialize frequency table from command line
for (String a : args) {
Integer freq = m.get(a);
m.put(a, (freq == null ? 1 : freq + 1));
}
System.out.println(m.size() + " distinct words:");
System.out.println(m);
}
}
Object Ordering 物件的順序
一個 List l可以像下面那樣去排序
Collections.sort(l);
如果List 包含String元素,會按照字幕的順序進行排序。如果包含Date元素會按照日期的順序進行排序。這是因為String 和 Date 都實現了Comparable這個介面。Comparable介面提供了類的順序下面的表是總結了java的一些類實現了這個介面的順序
Classes Implementing Comparable |
|
Class |
Natural Ordering |
Byte |
Signed numerical |
Character |
UnSigned numerical |
Long |
Signed numerical |
Integer |
Signed numerical |
Short |
Signed numerical |
Double |
Signed numerical |
Float |
Signed numerical |
BigInteger |
Signed numerical |
BigDecimal |
Signed numerical |
Boolean |
Boolean.FALSE < Boolean.TRUE |
File |
System-dependent lexicographic on path name |
String |
Lexicographic |
|