List、Set

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;

發佈了30 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章