轉自:http://blog.csdn.net/zhengtingt108/archive/2009/07/15/4350614.aspx
Java中的集合類
集合框架中的接口
1) Collection:集合層次中的根接口,JDK沒有提供這個接口直接的實現類。
2) Set:不能包含重複的元素。SortedSet是一個按照升序排列元素的Set。
3) List:是一個有序的集合,可以包含重複的元素。提供了按索引訪問的方式。
4) Map:包含了key-value對。Map不能包含重複的key。SortedMap是一個按照升序排列key的Map。
集合框架中的實現類:實現list接口的ArrayList 類和LinkedList類;實現Map接口的HashMap類;實現SortedMap的TreeMap類;實現Set接口的HashSet類和LinkednHashSet類;實現SortedSet接口的TreeSet類。
ArrayList
1) ArrayList:可以將其看作是能夠自動增長容量的數組。
2) 利用ArrayList的toArray()返回一個數組。
3) Arrays.asList()返回一個列表。
4) 迭代器(Iterator) 提供了一種通用的方式來訪問集合中的元素。
迭代器(Iterator)的作用:可以爲那些本身沒有提供獲取元素方法的集合類提供獲取元素的途徑,同時可以可以通過一個通用的方法來打印集合類對象中的元素。如可以定義以下方法,此時當要打印任何集合類對象中的元素時,只需調用此通用方法即可。
public static void printElements(Collection c)
{
Iterator i=c.iterator();
while(i.hasNext())
{
System.out.println(i.next());
}
}
Collections類
1) 排序:Collections.sort()
(1)自然排尋(natural ordering );
(2)實現比較器(Comparator)接口。
2) 取最大和最小的元素:Collections.max()、Collections.min()。
3) 在已排序的List中搜索指定的元素:Collectons.binarySearch()。
對於Collections.sort()方法,如果要對類對象進行排序,此類必須實現Comparable接口,覆蓋compareTo()方法,此和Arrays.sort()方法實現Comparable接口一致。如果要事先比較器,則可以在類中利用內部類來定義比較器。
class Student implements Comparable
{
int num;
String name;
Student(int num,String name)
{
this.num=num;
this.name=name;
}
static class StuentComparator implements Comparator//內部類實現比較器
{
public int compare(Object o1,Object o2)
{
Student s1=(Student)o1;
Student s2=(Student)o2;
int result=s1.num>s2.num?1:(s1.num==s2.num?0:-1);
if(0==result)
{
result=s1.name.compareTo(s2.name);
}
return result;
}
}
public String toString()
{
return "number="+num+",name="+name;
}
public int compareTo(Object o)
{
Student s=(Student)o;
int result=num>s.num?1:(num==s.num?0:-1);
if(0==result)
{
result=name.compareTo(s.name);
}
return result;
}
}
在main中使用:
ArrayList al=new ArrayList();
al.add(new Student(1,"zhangshan"));
al.add(new Student(1,"libole"));
al.add(new Student(3,"liuliu"));
al.add(new Student(2,"wangwu"));
Collections.sort(al,new Student.StuentComparator());
此時可以利用StuentComparator比較器中的比較方法來實現ArrayList al中對Student類的排序。
LinkedList
1) LinkedList是採用雙向循環鏈表實現的。
2) 利用LinkedList實現棧(stack)、隊列(queue)、雙向隊列(double-ended queue )。
ArrayList和LinkedList的比較
1) ArrayList底層採用數組完成,而LinkedList則是以一般的雙向鏈表(double-linked list)完成,其內每個對象除了數據本身外,還有兩個引用,分別指向前一個元素和後一個元素。
2) 如果經常在List的開始處增加元素,或者在List中進行插入和刪除操作,則應該使用LinkedList,否則的話,使用ArrayList將更加快速。
HashSet
1) 實現Set接口的hash table(哈希表),依靠HashMap來實現的。
2) 應該爲要存放到散列表的各個對象定義hashCode()和equals()。
如用以下代碼增加兩個相同的對象,此時HashSet認爲增加的兩個號爲2且名字同爲”lisi”的對象不同,因爲其主要是依靠hashCode來判斷,由於是用兩個new來創建對象,其hashCode不同。故要讓HashSet能夠認識到這是兩個相同的對象,要重寫hashCode()和equals()方法。
HashSet hs=new HashSet();
hs.add(new Student(1,"zhangshan"));
hs.add(new Student(2,"lisi"));
hs.add(new Student(2,"lisi"));
此時只需在Student類中增加以下方法即可:
public int hashCode()
{
return num*name.hashCode();//對於name,可以直接調用String類的hashCode()類。
}
public boolean equals(Object o)
{
Student st=(Student)o;
return (num==st.num)&&name.equals(st.name);
}
TreeSet
1) TreeSet是依靠TreeMap來實現的。
2) TreeSet是一個有序集合,TreeSet中元素將按照升序排列,缺省是按照自然順序進行排列,意味着TreeSet中元素要實現Comparable接口。
3) 可以在構造TreeSet對象時,傳遞實現了Comparator接口的比較器對象。
HashSet和TreeSet的比較
HashSet是基於Hash算法實現的,其性能通常都優於TreeSet。通常都應該使用HashSet,在需要排序的功能時,才使用TreeSet。
HashMap
1) HashMap對key進行散列。
2) keySet()可以得到key值,values()可以得到key對應的值,entrySet()則可以得到key--值對。
TreeMap
TreeMap按照key進行排序。
HashMap和TreeMap的比較
和Set類似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的時候,才使用TreeMap。