一、Java集合框架結構圖:
Collection,List,Set都是接口。
Collection是集合裏最基本的接口,它裏面定義了一個集合最基本功能,如元素的添加,移除,集合大小等的方法。它有兩個子類List和Set。
List:有序的,允許元素重複(因爲有索引)。
Set:無序(存入和取出的順序不一定一致),不允許元素重複。
迭代器:
迭代器就是用於把集合裏的元素一個一個的取出的東西。
在Collection接口裏就定義了iterator()方法,用於獲取一個迭代器。獲取的該迭代器只有三個方法hasNext(),next(),remove()。List接口裏也定義了一個特殊的迭代器ListIterator(),它包含了一些特殊的方法(不僅能取出元素,同時還能對List增刪改查)
————————————————————————————————————————————————————————
二、List:ArrayList,LinkedList,Vector
1)ArrayList:
它的底層數據結構是數組,線程不同步。查詢速度很快,但若有很多元素,增刪元素會比較慢,因爲增刪一個元素,其他元素都得移動一個索引。(牽一髮而動全身)
2)LinkedList:
它的底層數據結構是鏈表,所以查詢很慢,但增刪很快。
3)Vector:
它和ArrayList的數據結構都是數組,但它是線程同步的。
只要理解了他們幾個底層的數據結構,那麼就好理解他們各自的優點和缺點等特點了。
三、Set:HashSet,TreeSet:
1)HashSet:
它的數據結構是哈希表,線程是非同步的。
2)TreeSet:
它的數據結構是二叉樹, 不同於HashSet的是他會自動爲元素自然排序。
四、幾個練習:
1)練習一:去除某ArrayList集合中重複的元素。
package Test528;
import java.util.*;
/**
* 功能:去除某ArrayList集合中重複的元素。
* 定義函數 singleEmement(ArrayList al)。
* 原理:把原來集合裏的元素通過迭代器取出來,並放入一個新的集合容器裏。同時每次放入的時候
* 判斷新容器裏是否已經含有該元素,若有,則不放入。
* @author Administrator
*
*/
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("A");
al.add("B");
al.add("B");
al.add("B");
al.add("F");
al.add("C");
al.add("C");
System.out.println(al);
ArrayList newAl = singleEmement(al);
System.out.println(newAl);
}
//定義實現該功能的函數
public static ArrayList singleEmement(ArrayList al)
{
ArrayList newAl = new ArrayList<String>();
Iterator it = al.iterator();
while(it.hasNext())
{
Object obj = it.next();
if(!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
}
2)練習二:使用LinkedList模擬一個堆棧數據結構。
package Test531;
import java.util.LinkedList;
/**
* 使用LinkedList模擬一個隊列數據結構(先進先出)
* @author Administrator
*
*/
public class MyQueue {
private LinkedList link;
//通過構造函數,只要有類就新建LinkedList對象。
MyQueue()
{
link = new LinkedList();
}
//自定義MyQueue裏的myAdd()方法,其實是封裝了link裏方法。
public void myAdd(Object obj)
{
link.add(obj);
}
//自定義myGet()方法,其實是封裝了link的getFirst()方法。
public Object myGet()
{
return link.getFirst();
}
public boolean myIsEmp()
{
return link.isEmpty();
}
}
package Test531;
public class MyDuiLieTest {
/**
* @param args
*/
public static void main(String[] args) {
MyQueue dl = new MyQueue();
dl.myAdd("wang1");
dl.myAdd("wang2");
dl.myAdd("wang3");
dl.myAdd("wang4");
System.out.println(dl.myIsEmp());
System.out.println(dl.myGet());
}
}
其實編碼本身沒什麼難度,關鍵是通過封裝別人的方法,來自定義自己的方法這種思想要深刻理解。