爲什麼用集合?
想象一下,當你要做一個公司職員薪水管理系統的時候,不先考慮數據庫,這時候如果用數組的話,固然是可以的,但是數組很不方便,因爲數組的大小把握不了,當有員工的增加或者刪除的時候,可能會導致數組的大小不夠或者數組浪費。
當然可以用鏈表來解決,但是鏈表還不是最佳選擇,這就引出了集合。可以動態的添加和修改。
java 集合類
- List結構的集合類:ArrayList類、LinkedList類、Vector類、Stack類
- Map結構的集合類:HashMap類、HashTable類
- Set結構的集合類:HashSet類、TreeSet類
- Queue結構的集合:Queue接口
ArrayList
首先引入包
import java.util.*;
然後定義ArrayList對象
ArrayList a = new ArrayList();
a_size = a.size();//a_size = 0,此時的大小爲0
//向a中添加數據,類型是Object,也就是說可以添加任意類型的數據
Clerk clerk1 = new Clerk("song",50);
a.add(clerk1);//將元素加到列表的尾部,此時a的大小就是1了
Clerk clerk2 = new Clerk("wu",20);
a.add(clerk2);
//如何訪問a中的數據?
//Clerk temp = a.get(0);這句錯誤,因爲get函數返回的是Object類型。把一個子類交給一個父類,可以自動轉換,但是把一個父類交給一個子類就不行了,可以強制轉換
Clerk temp = (Clerk)a.get(0);//取出第一個數據,這裏和數組的下標差不多
//遍歷所有的數據
for(int i =0;i < a.size();i++){
Clerk temp = (Clerk)a.get(i);
//.....
}
a.add(clerk1);//再次放一次也可以!
//刪除元素
a.remove(1);
LinkedList
很多方法和ArrayList都差不多但是多了下列幾個:
LinkedList ll = new LinkedList();
ll.addFirst(a1);//把a1加在最前面
ll.addLast(a2);//把a2加在最後面
ll.remove(1);
Vector 向量
多數方法和上面類似,但是區別是,
Stack 棧
HashMap
HashMap hm = new HashMap();
hm.put("01",emp1);
hm.put("02",emp2);
hm.put("02",emp3);//此時,“02”對應的值更新了,Key值不能相同!
if(hm.containKey("02")){
Emp emp = (Emp)hm.get("01");
}
Iterator it = hm.keySet().iterator();
while(it.hasNext()){
String key = it.next().toString();
Emp emp = (Emp)hm.get(key);
}
HashMap 和HashTable區別
- HashTable是同步的,這個類中的一些方法保證了HashTable中的對象是線程安全的,而HashMap則是異步的,因此HashMap中的對象不是線程安全的,因爲同步的要求會影響執行的效率,所以如果你不需要線程安全的集合那麼使用HashMap是一個很好的選擇,這樣可以避免由於同步帶來的不必要的性能開銷,從而提高效率。
- HashMap可以讓你將一個空值作爲一個表的條目的key或velue,但是HashTable是不能放入空值的。
ArrayList 和 Vector的區別
- Vector是同步的,Arraylist是異步的。
- 從內部機制來講二者都是用數組來控制集合中的對象。如果長度增加超過了內部數組的長度,它們需要增加目前的長度來擴展內部數組的長度,Vector缺省情況下自動增長原來的一倍,ArrayList是原來的50%。
總結
- 如果考慮線程安全,考慮:Vector,HashTable
- 如果不要求線程安全:ArrayList、LinkedList、HashMap
- 如果要求鍵值對,則使用HashMap、HashTable
- 如果數據量很大,又要線程安全,則Vector
- 其實這些都可以用到java中的多態,這樣更加靈活,比如:
List l = new ArrayList();