1. 程式人生 > >java 集合中主要介面的介紹

java 集合中主要介面的介紹

集合-有時候被稱為容器, 就像一手牌(牌的結合),一個郵箱(郵件的集合),或者一個電話簿(姓名和電話對應的關係圖)

集合框架核心介面圖

·Collection對集合核心介面的說明,所有的集合都實現了Collection這個介面,java沒有類直接實現了Collection這個介面而是通過更加具體的子介面,比如Set and List

·Set 不能放重複元素新增重複的元素將毫無用處

·List 有順序的集合,可以存放重複的元素

·Queue 先進先出的集合FIFO (first-in-first-out)

·Map用鍵值對的關係來儲存資料,鍵值不能重複,一個鍵只能對應一個值

·SortedSet,SortedMap分別是Setmap的排序版本

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