java基礎學習-集合

集合就是將若干用途、性質相同或者相近的“數據”組合而成一個整體

java集合可分爲以下兩大類:

Collection:Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements),實現它的有ListSet。List 是一個有序的集合,可以包含重複的元素。提供了按索引訪問的方式,Set  不能包含重複的元素。
Map :包含了key-value對。Map不能包含重複的key。

List

特點:可重複、有序,擁有實現類  ArrayList與LinkedList

1)ArrayList

a)用法 List(接口)去new 具體用法源碼
b)集合中存放的依然是對象的引用而不是對象本身。
c)ArrayList底層採用數組實現,當使用不帶參數的構造方法生成ArrayList對象時,實際上會在底層生成一個長度爲10的Object類型數組。
d)如果增加的元素個數超過了10個,那麼ArrayList底層會新生成一個數組,長度爲原數組的1.5倍+1,然後將原數組的內容複製到新數組當中,並且後續增加的內容都會放到新數組當中。當新數組無法容納增加的元素時,重複該過程。 
e)對於ArrayList元素的刪除操作,需要將被刪除元素的後續元素向前移動,代價比較高。

2)LinkedList

a)LinkedList底層採用雙向鏈表實現
b)鏈表介紹鏈表可以擁有 pre  next兩個屬性,有單向鏈表,雙向鏈表,循環鏈表

3)關於ArrayList與LinkedList的比較分析

a)ArrayList底層採用數組實現,LinkedList底層採用雙向鏈表實現。
b)當執行插入或者刪除操作時,採用LinkedList比較好。ArrayList改變一個需要動到整個List
c)當執行搜索操作時,採用ArrayList比較好。LinkedList查詢需要從第一個開始
d)當向ArrayList添加一個對象時,實際上就是將該對象放置到了ArrayList底層所維護的數組當中;當向LinkedList中添加一個對象時,實際上LinkedList內部會生成一個
Entry對象,該Entry對象的結構爲: 
Entry { Entry previous; 
  Object element; 
  Entry next; 

其中的Object類型的元素element就是我們向LinkedList 中所添加的元素,然後Entry又構造好了向前與向後的引用previous、next,最後將生成的這個Entry對象加入到了鏈表當中。換句話說,LinkedList中所維護的是一個個的Entry對象。

Set

特點:無重複、無序。擁有實現類HashSet、LinkedHashSet、TreeSet、SortedSet

1) HashSet 無序

a) 底層是使用HashMap實現的。當使用add方法將對象添加到Set當中時,實際上是將該對象作爲底層所維護的Map對象的key,而value則都是同一個Object對象
b) 當使用HashSet時,hashCode()方法就會得到調用,判斷已經存儲在集合中的對象的hash  code值是否與增加的對象的hash  code值一致;如果不一致,直接加進去;如果一致,再進行equals方法的比較,equals方法如果返回true,表示對象已經加進去了,就不會再增加新的對象,否則加進去。
c) 如果我們重寫equals方法,那麼也要重寫hashCode方法,反之亦然。
d) 如果是兩個對象加入set,除非引用自同一個對象,否則就是兩個,如 add(new People(“cmy”))執行兩次加兩個,但是String例外,是比較字符串 ,new String(‘a’)加幾次也只有一個。

2) LinkedHashSet

優點是按照插入順序排列,速度略慢, Hash的實現上添加了Linked的支持

3) SortedSet 

 具體看繼承者TreeSet的介紹,父子關係

4) TreeSet

實現排序需要將排序Comparator 帶入實例化構造函數
實現時 正序返回正,一樣返回0,負數倒序
TreeSet set = new TreeSet(new PersonComparator());
class PersonComparator implements Comparator{
	public int compare(Object arg0, Object arg1)	{
		Person p1 = (Person) arg0;
		Person p2 = (Person) arg1;
		return p2.score - p1.score;
	}
}

Map

接口,-HashMap、SortedMap、TreeMap
Map的keySet()方法會返回key的集合,因爲Map的鍵是不能重複的,因此keySet()方法的返回類型是Set;而Map的值是可以重複的,因此values()方法的返回類型是Collection,可以容納重複的元素。

1)HashMap

HashMap類使用散列表實現Map接口。
底層維護一個數組,我們向HashMap中所放置的對象實際上是存儲在該數組當中這允許一些基本操作如get()和put()的運行時間保持恆定,即便對大型集合,也是這樣的。我們向HashMap中所放置的對象實際上是存儲在該Entry數組當中; 
當向HashMap中put一對鍵值時,它會根據key的hashCode值計算出一個位置,該位置就是此對象準備往數組中存放的位置。 
如果該位置沒有對象存在,就將此對象直接放進數組當中;如果該位置已經有對象存在了,則順着此存在的對象的鏈開始尋找(Entry類有一個Entry類型的next成員變量,指向了該對象的下一個對象),如果此鏈上有對象的話,再去使用equals方法進行比較,如果對此鏈上的某個對象的equals方法比較爲false,則將該對象放到數組當中,然後將數組中該位置以前存在的那個對象鏈接到此對象的後面。

2)SortedMap

SortedMap接口擴展了Map,它確保了各項按關鍵字升序排序

3)TreeMap 

繼承SortedMap

4)Map的遍歷

方式一:
Set set = map.keySet();
 for(Iterator iter = set.iterator(); iter.hasNext();){
   String key = (String)iter.next();
   String value = (String)map.get(key);
  }
方式二:
Set set = map.entrySet();
  for(Iterator iter = set.iterator(); iter.hasNext();){
   Map.Entry entry = (Map.Entry)iter.next();
   String key = (String)entry.getKey();
   String value = (String)entry.getValue();
   System.out.println(key +" :" + value);
  }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章