參考:http://blog.csdn.net/liulin_good/article/details/6213815
具有相同性質的一類東西稱爲集合,JAVA中集合是一些具有相同數據類型的數據。
集合框架是爲表示和操作集合而規定的一種統一的標準的體系結構,JAVA中集合框架是存儲、查找、排序這些相同類型數據的接口、類及其方法。
因此,JAVA集合框架的用法與數組相似,不過方法更多,針對不同問題可以採用不同的數據結構存儲元素,元素的查找等操作效率更高,類的使用也更加方便。
JAVA集合框架定義的主要接口有Collection、List、Set,性質如下:
其他Queue、Deque、SortedSet等接口此處不詳細說明。
Map是JAVA定義的映射接口,用於存儲鍵-值對,也包含在集合框架中。
上表中,“無序”指元素沒有以輸入的順序存放,元素插入(add)的順序與輸出的順序不一致,“有序”指存放順序與插入順序一致。
接口:
Collection接口是List、Set的父接口,不允許存在NULL元素,擴展了Iterable接口,定義了iterator()方法,實現該接口或子接口的類可以採用iterator()和for-each(加強型for)遍歷元素。
List接口,與數組相似採用以0開始的索引存放元素,get(int index)獲得元素,set(int index, obj)元素幅值。
Set接口,不允許存在重複的元素。
類:
ArrayList類,實現了List接口,採用數組形式存放元素,將元素存儲在連續空間中,插入刪除元素麻煩,當數組長度不夠時,將原數組複製到一個更長的數組中,實現存儲長度動態增減。特點:查詢快,增刪慢,線程不安全,輕量級,有序,最常用。
LinkedList類,實現了List、Deque、Queue接口,採用鏈表實現, 又一個個存儲節點鏈接起來, 適合插入刪除元素等操作,查詢元素等操作只能一個節點一個節點順序遍歷。
HashSet類,實現了Set接口,採用哈希表實現,不允許元素重複,若add相同元素,後者將覆蓋前者。
TreeSet類,實現了Set接口,採用二叉樹實現,能夠快速訪問大量有序數據。
用法演示:
ArrayList類
import java.util.*;
public class Main{
public static void main(String[] args){
ArrayList<String> al = new ArrayList<String>();
al.add("abc");
al.add("abc");
al.add("def");
al.add("ghi");
System.out.println(al.size());
System.out.println(al);
System.out.println(al.get(2));
System.out.println(al.indexOf("ghi"));
al.set(1, "jkl");
System.out.println(al);
al.remove(1);
System.out.println(al);
al.remove("ghi");
System.out.println(al);
System.out.println("ArrayList轉換成數組:");
String[] str = new String[al.size()];
str = al.toArray(str);
for(String s:str)
System.out.println(s);
}
}
運行結果:
4
[abc, abc, def, ghi]
def
3
[abc, jkl, def, ghi]
[abc, def, ghi]
[abc, def]
ArrayList轉換成數組:
abc
def
LinkedList類
LinkedList類實現了List、Deque、Queue接口,訪問List定義的add()等方法與上面ArrayList類相同,
import java.util.*;
public class Main{
public static void main(String[] args){
LinkedList<String> ll = new LinkedList<String>();
//現棧
ll.push("a");
ll.push("a");
ll.push("b");
ll.push("c");
System.out.println(ll.pop());
System.out.println(ll.pop());
System.out.println(ll.pop());
System.out.println(ll.pop());
System.out.println(ll);
//雙向列表
ll.add("Q");
ll.add("W");
ll.addLast("E");
ll.addFirst("R");
System.out.println(ll);
ll.removeFirst();
System.out.println(ll);
ll.removeLast();
System.out.println(ll);
}
}
運行結果:
c
b
a
a
[]
[R, Q, W, E]
[Q, W, E]
[Q, W]
HashSet類
HashSet類無序且元素唯一。
import java.util.*;
public class Main{
public static void main(String[] args){
HashSet<String> hs = new HashSet<String>();
hs.add("A");
hs.add("A");
hs.add("a");
hs.add("B");
hs.add("D");
hs.add("C");
System.out.println(hs);
}
}
運行結果:
[A, a, B, C, D]
TreeSet類
TreeSet類有序且元素唯一,Integer和String都有有默認排序方式,其他類型必須實現Comparable接口,並且重寫compareTo()方法。
Integer和String的默認排序方式都是比較ASCii碼值。
import java.util.*;
public class Main{
public static void main(String[] args){
TreeSet<String> ts = new TreeSet<String>();
ts.add("A");
ts.add("A");
ts.add("a");
ts.add("1");
ts.add("D");
ts.add("C");
System.out.println(ts);
}
}
運行結果:
[1, A, C, D, a]
在很多情況下,需要遍歷集合所有元素,一般採用Iterator或者for-each(加強型for循環),示例如下:
import java.util.*;
public class Main{
public static void main(String[] args){
TreeSet<String> ts = new TreeSet<String>();
ts.add("A");
ts.add("B");
ts.add("D");
ts.add("C");
Iterator<String> it = ts.iterator();
while(it.hasNext()){
String element = it.next();
System.out.println(element);
}
for(String s:ts)
System.out.println(s);;
}
}
JAVA集合框架類的具體實現和採用的數據結構詳見JAVA源代碼。
下一篇對JAVA集合框架裏的映射接口和類進行簡單介紹。