集合框架的繼承體系
Java2中包含了6個集合接口,這些接口的通用目的實現類,以及一個集合實用類Collections,共同組成了集合框架的核心.
6個集合接口如下:
Collection及其以下的List,Set,以及Set下的SortedSet
Map及其以下的SortedMap
鏈表的通用實現
ArrayList:線程不安全的動態數組類,批量查詢速度快,單個查找速度慢.
Vector:線程安全的動態數組類,效率比ArrayList低下.
LinkedList:動態鏈表類,適于在隊列首尾頻繁增刪成員的場合.
鏈表的創建
List<Member> ls=new ArrayList<Member>();// 1.5版本及以上
List ls=new ArrayList();// 1.5版本以下
之所以將ls類型指定為List<Member>而不是ArrayList<Member>是因為 如果情況變化, ArrayList需要修改成Vector或LinkedList時無須修改其它代碼,僅修改實例類型即可.
向List中添加元素
添加單個元素
ls.add(new Member("Andy",21));
從別的鏈表中添加多個元素
List<Member> ls2=new ArrayList<Member>();
ls2.add(new Member("Felex",21));
ls2.add(new Member("Gates",23));
ls.addAll(ls2);
注意:
1.5及其以上版本中,添加的元素必須和定義時一致,如ls的類型是List<Member>,那么向其中添加的元素必須是Member或其子類.
1.5以下版本中,對添加的元素不作檢查,只要是Object即可,如果是基本類型則需裝箱成類類型.如ls.add(new Integer(8));
刪除鏈表中元素
ls.remove(member); // 直接刪除對象,member=new Member("Edin",28)
ls.remove(2); // 刪除第三個元素
ls.clear(); // 將已有數據全部清除
對鏈表進行遍歷
1) 1.5中獨有的遍歷方法,代碼最短,使用最方便
for(Member member:ls){
// member就是依次取出的每個元素
}
2) 常規方法,多用于需要取得下標的場合,各版本均適用
for(int i=0;i<ls.size();i++){
Member member=ls.get(i);// member就是依次取出的每個元素, 1.5及其以上版本適用, ls.size()為鏈表長度
Member member=(Member)ls.get(i);// 1.5以下版本適用
}
3) 使用Iterator對鏈表進行遍歷的方法,各版本均適用
for(Iterator it=ls.iterator();it.hasNext();){
Member member=(Member)it.next();
}
鏈表的其它常用的方法
ls.contains(Object o);// 返回鏈表中是否包含某元素
ls.indexOf(Object o);// 返回對象o是鏈表中的第幾號元素
isEmpty();// 返回鏈表中是否有元素
對鏈表進行排序
1)讓List中元素必須已經實現Comparable接口:
public class Member implements Comparable {
private String name;
private int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
public int compareTo(Object obj) {
Member another = (Member) obj;
return this.name.compareTo(another.name);// 按名稱排序,如果是this.age-another.age則按年齡排序
}
public String toString(){
return "Member name="+name+" age="+age;
}
}
2)排序過程
List<Member> ls=new ArrayList<Member>();
ls.add(new Member("Felex",21));
ls.add(new Member("Gates",23));
ls.add(new Member("Andy",21));
ls.add(new Member("Bill",23));
ls.add(new Member("Cindy",24));
ls.add(new Member("Dell",27));
Collections.sort(ls);
for(Member member:ls){
System.out.println(member);
}
輸出:
Member name=Andy age=21
Member name=Bill age=23
Member name=Cindy age=24
Member name=Dell age=27
Member name=Felex age=21
Member name=Gates age=23
// 如果需要逆序可以使用Collections.reverse(ls);
鏈表與數組之間的轉換
1) List轉換成數組
List<String> ls=new ArrayList<String>();
ls.add("Felex");
ls.add("Gates");
ls.add("Andy");
ls.add("Bill");
ls.add("Cindy");
ls.add("Dell");
Object[] arr=ls.toArray();
for(Object obj:arr){
System.out.println((Object)obj);
}
輸出為:
Felex
Gates
Andy
Bill
Cindy
Dell
2) 數組轉換成List
String[] arr={"Andy","Bill","Cindy","Dell"};
List<String> ls=Arrays.asList(arr);
for(String str:ls){
System.out.println(str);
}
輸出:
Andy
Bill
Cindy
Dell