今天學完IT十八掌第十一天java基礎課程:
學習內容:
Vector
-------------------------------------------
add("tom");
add(index,"tom");
remove(int index)
數組列表,查詢快,增刪慢。
|---ArrayList
|---Vector
鏈表 查詢較慢,增刪快
|---LinkList
Iterator it = list.iterator();
boolean it.hasNext( ) 判斷是否有下一個元素
Next() 取出一個元素
所以判斷是否有下一個元素,hasNext()
next()返回是Object類對象,注意類型轉換,
可以通過泛型解決,格式<E> 接在類名後指定類型
泛型是編譯時約束,
Set
----------------------------------
接口,繼承於Collection
實現類
HashSet
TreeSet
蜜蜂與熊的問題,重點搞懂,多線程生產消費。
--------------
HashSet:
---------------------------------
public int hashCode()
{
}
public boolean equals(Object obj)
{
}
注:
Set不能添加重複元素,判斷是否重複會先調用hashCode()方法判斷
再調用equals方法判斷,兩者都相同時,兩個對象算是重複的。
而與兩個對象是否同一對象無關。
也就是說Set判斷是否重複的範圍超出了同一對象的,不同對象只要
hashCode()和equals()返回相同也會判斷成重複。
remove中也是利用hashCode()和equals()方法來判斷重複的。
問題:兩個相同對象,hashCode()和equals()必定相同嗎?
所以必定重複?
答:不一定,在hashCode()中使用age++,使得兩個相同對象
調用兩次hashCode()方法的返回值不同,hashSet會認爲這兩個對象不重複,
hashSet也能添加這兩個相同對象,所以兩個相同對象不一定是重複的,hashSet
判斷是否重複首先判斷hashCode(),相同後再判斷equals()方法。
只有hashCode()和equals的值相同,纔會判斷兩個元素是重複的,而與是否是同一對象無關。
TreeSet
-------------------------------
有序的Set,底層採用二叉樹
存儲對象必須具備比較性,自定義比較器Comparator,重寫compare(p1 , p2)方法
或者實現Comparable接口重寫compareTo( p )方法。
comparator自定義比較器
Comparator<Person> comp = new Comparator<Person>( ) {
public int compare(p1 , p2)
{
}
};
//將比較器作爲參數傳遞給TreeSet,使得其按自定義的比較器規則進行排序。
TreeSet<Person> ts = new TreeSet<Person>(comp);
問題:TreeSet通過什麼樣的方式遍歷二叉樹,將需要添加的對象與集合中元素進行比較呢?
解答:由於TreeSet底層採用的是二叉數,每次遍歷時大數在右邊,小數在左邊。
從元素的中間數開始判斷(偶數的話去中間數的整數部分,比如2.5就取2位置上的數先比較),
如下圖的順序,很快就可以將對應元素插入到集合
問題:TreeSet怎麼判斷兩個元素是否重複。
通過比較器判斷,如果返回0,兩個元素則是重複的。
Map
-------------------------------------
HashMap
遇到的問題:
1,TreeSet使用比較器判斷是否重複時是如何取數據的,經驗證採用的是遍歷二叉樹。
2,HashSet和HashMap的區別與聯繫,HashSet底層採用的是HashMap,HashMap中的元素是key-value形式的。
需要幫助的問題
Map應用