集合框架的內容太多太複雜,一旦不用就很容易忘記,於是我打算記錄下來一些我的學習過程,在多多看API開發文檔來提高自己的能力 。個人的理解或者哪裏錯了,希望各位大哥可以指出來,大家一起學習
每種編程語言中都有集合,最初的Java版本包含幾種集合類:Vector、Stack、HashTable和Array。隨着集合的廣泛使用,Java1.2提出了囊括所有集合接口、實現和算法的集合框架。在保證線程安全的情況下使用泛型和併發集合類,Java已經經歷了很久。它還包括在Java併發包中,阻塞接口以及它們的實現。集合框架的部分特點如下:
(1)使用核心集合類降低開發成本,而非實現我們自己的集合類。
(2)隨着使用經過嚴格測試的集合框架類,代碼質量會得到提高。
(3)通過使用JDK附帶的集合類,可以降低代碼維護成本。
(4)複用性和可操作性!
(5)用來存儲對象,如果對象的個數不確定
(6)集合的長度是可變的,很靈活
(7)集合是依賴對象而生的,所以就對基本數據類型"不感興趣",所以集合中不可以存儲基本數據類型值(但是實際是可以放的,存在自動拆箱和裝箱功能)
List<Integer> list = new ArrayList<Integer>();
list.add(1);
//打印結果爲1
System.out.println(list.get(0));
------------------------------------------------------------------------------------------------------------------------------------
集合的一些好用的小技巧
需要數據唯一嗎?
需要:set()
需要制定順序嗎:
需要:treeSet
不需要:HashSet
但是想要一個和存儲一致的順序:LinkedHashSet
不需要:List()(有序)
需要頻繁增刪嗎?
需要:LinkedList
不需要:ArrayList
ps:有序指的是插入的順序
------------------------------------------------------------------------------------------------------------------------------------
如何記錄每一個容器的結構和所屬體系呢?
看名字!
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
後綴名就是該集合所屬的體系
前綴名就是該集合的數據結構
看到 array(ArrayList,):就要想到數組,就要想到查詢快,有角標
看到 Link( LinkedList , LinkedHashSet , LinkedHashMap )
: 就要想到鏈表,就要想到增刪快,就要想到
增:add() ;
返回index位置的元素 :get(int index) ;
移除第一個或者最後一個元素 : remove+frist last();
看到hash( HashSet , HashMap ): 就要想到哈希表,就要想到唯一性,就要想到覆蓋hashcode()方法和equals()方法
ps:覆蓋它們的好處是利於查找,減少循環次數,提高效率,這兩者的關係爲:equals()相等的兩個對象,hashcode()一定相等,equals()不相等的兩個對象,有可能hashcode()不相等,也有可能相等。hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。詳細可以看這裏:http://www.360doc.com/content/14/0527/09/15113968_381327452.shtml
看到 tree ( treeSet , TreeMap ) : 就要想到二叉樹,就要想到排序,就要想到實現兩個接口Comparable,Comparator
ps:TreeSet是依靠TreeMap來實現的。TreeSet是一個有序的set。它實現了Comparable.用於比較排序。。詳細可以看連接
:http://blog.csdn.net/dreamwbt/article/details/53185592
http://www.cnblogs.com/ningvsban/archive/2013/05/06/3062535.html
========================================================================
Map:一次添加一對元素。Collection 一次添加一個元素。
Map也稱爲雙列集合,Collection集合稱爲單列集合。
其實map集合中存儲的就是鍵值對。
map集合中必須保證鍵的唯一性。
常用方法:
1,添加。
value put(key,value):返回前一個和key關聯的值,如果沒有返回null.
2,刪除。
void clear():清空map集合。
value remove(key):根據指定的key翻出這個鍵值對。
3,判斷。
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
4,獲取。
value get(key):通過鍵獲取值,如果沒有該鍵返回null。
當然可以通過返回null,來判斷是否包含指定鍵。
int size(): 獲取鍵值對的個數。
Map常用的子類:
|--Hashtable :內部結構是哈希表,是同步的。不允許null作爲鍵,null作爲值。
|--Properties:用來存儲鍵值對型的配置文件的信息,可以和IO技術相結合。
|--HashMap : 內部結構是哈希表,不是同步的。允許null作爲鍵,null作爲值。
|--TreeMap : 內部結構是二叉樹,不是同步的。可以對Map集合中的鍵進行排序。
ps:
同步設計到線程的問題,列入a線程調用Hashtable的size方法(還沒調用完)
這時B線程也來調用size方法的話,就要排隊等候,因爲a正在調用
如果是非同步的話,a,b可以在同一時間對Hashtable的一個方法