Collection
|——List:列表
特點:
1, 有序(存儲元素的順序和取出元素的順序一致)
2, 該集合中的元素都有索引,所以可以通過索引(角標)來訪問元素。
3, 它可以存儲重複元素
常見子類對象:學習該對象的特有數據結構及相關特點
|——Vector:JDK1.0就存在了。底層是數組結構的。可變長度數組。
原理:一旦原數組長度不夠,會創建新數組,長度爲原來的2倍,將原數組的元素複製到新數組中,並將新元素添加到數組中
*Vector是同步的
|——ArrayList:底層是數組結構,也是支持長度可變數組的。是不同步的。
替代了Vector,因爲效率高,查詢效率高,但是增刪的效率很低
|——LinkedList:底層是鏈接列表結構,簡稱鏈表結構。是不同步的。這個結構的好處:對元素的增刪效率很高,查詢的效率很低
|——Set:集:中的方法和Collection一致,只要重點注意它的子類對象即可。取出元素只能使用迭代器。非同步的。
特點:
1,不包含重複元素。(最大的特點)
2,這個集合存入元素的順序和取出元素的順序不一定一致。(具體的容器對象數據結構不同,順序也有不同)
|——HashSet:底層數據結構是哈希表,不保證順序,是不同步的。
哈希表:提供數組的查詢效率而出現的
將要存儲的元素先通過哈希算法算出一個哈希值來標示存儲的位置,代表着元素。要找元素時,先將該元素通過哈希算法算出哈希值,再通過哈希值到哈希表中去查找
特點:
1, 不關係元素的順序
2, 提高了查詢效率
3, 不可能出現重複元素,因爲哈希值都不同,即使相同,會再次判斷兩個元素的equals內容是否相同。所以哈希表要保證元素的唯一性,必須要依賴於兩個方法。
1, hashCode
2, equals
|——TreeSet:可以給Set集合中的元素進行指定順序的排序
默認情況下,是通過元素的自然順序排的序
他保證元素唯一性的依據是看比較方法的返回結果是否是0,是0就視爲元素相同,不存。
自然順序:就是元素自身的具備的比較性實現了Comparable接口的compareTo方法
TreeSet排序的方式一:讓元素自身具備比較性,需要實現Comparable接口,覆蓋compareTo方法。這種比較方式成爲自然順序排序
如果元素自身不具備比較性或者具備的比較性(自然順序)不是所需要的。這時只能用第二種方式
TreeSet排序的方式二:讓容器自身具備比較性。容器一初始化就具備了比較功能。因爲容器是在對象構造時完成的。通過查閱,有一個構造方法TreeSet(comparator),在容器初始化時可以指定一個比較器。
需要實現Comparator接口,覆蓋compare方法即可。
所以這種方式稱爲比較器排序。
List接口中的特有方法
因爲該接口的特點是對元素有索引標示。
所以它的特有方法應該都是圍繞着索引定義的
1, 添加
voidadd(index,element);
booleanaddAll(index,collection);
2, 刪除
objectremove(index);獲取並刪除
3, 獲取
獲取元素:
Objectget(index);獲取
獲取元素索引:
intindexOf(object);
intlastIndexOf(object);
獲取子列表:
List subList(fromIndex,toIndex):獲取列表中的一部分,包含fromindex位置,不包含toIndex位置
4, 修改
Objectset(index,element):替換指定位置的元素,並返回被替換掉的元素。
List接口是可以對元素進行增刪改查操作的
*只有這個集合具備着增刪改查。具備的原因:因爲有索引。
當集合進行迭代時,在迭代的過程,如果用集合對象對元素進行了修改。
而迭代器是不知道的,所以在迭代的過程中就會發生不確定性。
爲了避免這種情況的發生,在迭代時,不要使用集合對象對迭代中的元素進行操作。
但是,我們還想在迭代的過程中對被迭代的元素進行更多的操作。該怎麼辦呢?
可以使用迭代器的方法,但是Iterator的方法很鬱悶,只有判斷hasNext,獲取next,刪除 remove三個方法
** 要想解決這個問題,list接口中提供了一個特有的迭代器。
這個迭代器就是ListItrator列表迭代器。就可以解決這個問題
介紹一下ListIterator
父類接口Iterator。
Add remove set next 它就可以實現在迭代過程中進行元素的增刪改查的動作
它還可以逆向遍歷 hasPrevious
*這個列表迭代器只能對List集合使用
枚舉
vector中早前的取元素操作,枚舉elements 只能取出vector中的元素
枚舉接口也是用來取出集合中的元素,枚舉最後被迭代器取代
Enumeration e=vector.elements();
while(e.hsaMoreElements())
{
System.out.println(e.nextElements());
}
鏈表特有方法
LinkedList
頭尾操作方法
addFirst();
addLast();
jdk1.6以後,變成
offerFirst()
offerLast()
getFirst():從頭部獲取元素,但不刪除。如果沒有元素,會拋出NoSuchElementException
getLast();
jdk1.6以後,變成
peekFirst();從頭部獲取元素,但不刪除。如果沒有元素,返回null
peekLast();
removeFirst():從頭部獲取元素,但刪除。如果沒有元素,會拋出NoSuchElementException
removeLast();
jdk1.6以後,變成
pollFirst():從頭部獲取元素,但刪除。如果沒有元素,會返回null
pollLast():
兩種常見的數據結構
1, 隊列:先進先出 FIFO first in first out
2, 堆棧:後進先出 LIFO last in first out
注意:
ArrayList判斷元素是否相同的equals方法
比如contains中就是依賴於equals方法
或者remove方法都是依賴於equals方法
尤其存儲自定義對象時,該對象一定要覆蓋equals方法,建立根據對象自身特點判斷相同的依據
equals就是用於比較對象的內容的
往哈希表中存儲自定義對象
必須覆蓋hashCode方法和equals方法
在eclipse中用alt+shift+s可以出現一個對話框 選擇Generale hashCode()and equals()
它就可以自己創建equals方法和hashCode方法
如果不知道對象到底要存儲到哪,就將hashCode equals toString全都覆蓋
不覆蓋也從Object類中繼承了,那還不如覆蓋,創建對象自身的判斷相同的依據
想讓Person對象具備比較大小的功能
就需要對Person對象進行功能的擴展
讓person去實現Compareble接口,讓Person具備自然順序,覆蓋compareTo方法
進行對象比較的時候,通常先比較主要條件,如果主要條件相同,在比較次要條件,如果按照人的年齡排序,再比較一次姓名
compareTo中
person p=(person)o;
if(this,age>p.age)
return 1;
if(this.age==p.age)
return this.name.compareTo(p.name);
return -1;
技巧性寫法
Person p=(Person)O;
Int temp=this.age-p.age;
return temp==0?this.name.compareTo(p.name):temp;
在Set集合中,其實有一個有序集合,就是HashSet的子類LinkedHashSet。
集合的掌握技巧:
明確具體幾何對象名稱的後綴:
如果後綴是List,都屬於List體系。通常都是非同步的。
如果後綴是Set,都屬於Set體系,通常也是非同步的。
這些體系中的其他子類對象,後綴不是所屬接口名的,一般都是同步的,比如Vector
這在常用子類對象中通用。
明確數據結構:
對於jdk1.2版本的子類對象。
後綴名是所屬的體系。前綴名就是數據結構的名稱
比如:
ArrayList:看到Array,就要明確是數組結構。查詢快。
LinkedList:看到Link,就要明確鏈表結構,就要想到addget remove 和first last結合的方法,增刪快。
HashSet:看到hash,就要明確是哈希表。查詢巨快,而且唯一性。
就要想到元素必須覆蓋hashCode方法和equals方法。
TreeSet:看到Tree,就要明確二叉樹,可以對元素排序。
就要想到兩種排序方式:
自然順序:Comparable接口,覆蓋compareTo(一個參數)java.lang
比較器:Comparator接口,覆蓋compare(兩個參數)java.util
判斷元素唯一性的依據就是比較方法的返回結果return 0;