JAVA學習【7】集合框架與Arraylist、Linkedlist、HashSet的基本用法

參考: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集合框架裏的映射接口和類進行簡單介紹。

發佈了43 篇原創文章 · 獲贊 50 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章