黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

全面接觸Java集合框架 三四

系統(tǒng) 2166 0

2.List接口

  List 接口繼承了 Collection 接口以定義一個(gè)允許重復(fù)項(xiàng)的有序集合。該接口不但能夠?qū)α斜淼囊徊糠诌M(jìn)行處理,還添加了面向位置的操作。


  (1) 面向位置的操作包括插入某個(gè)元素或 Collection 的功能,還包括獲取、除去或更改元素的功能。在 List 中搜索元素可以從列表的頭部或尾部開始,如果找到元素,還將報(bào)告元素所在的位置 :

  void add(int index, Object element): 在指定位置index上添加元素element

  boolean addAll(int index, Collection c): 將集合c的所有元素添加到指定位置index

  Object get(int index): 返回List中指定位置的元素

  int indexOf(Object o): 返回第一個(gè)出現(xiàn)元素o的位置,否則返回-1

  int lastIndexOf(Object o) :返回最后一個(gè)出現(xiàn)元素o的位置,否則返回-1

  Object remove(int index) :刪除指定位置上的元素

  Object set(int index, Object element) :用元素element取代位置index上的元素,并且返回舊的元素

  (2) List 接口不但以位置序列迭代的遍歷整個(gè)列表,還能處理集合的子集:

   ListIterator listIterator() : 返回一個(gè)列表迭代器,用來訪問列表中的元素

   ListIterator listIterator(int index) : 返回一個(gè)列表迭代器,用來從指定位置index開始訪問列表中的元素

  List subList(int fromIndex, int toIndex) :返回從指定位置fromIndex(包含)到toIndex(不包含)范圍中各個(gè)元素的列表視圖

  “對(duì)子列表的更改(如 add()、remove() 和 set() 調(diào)用)對(duì)底層 List 也有影響。”

  2.1.ListIterator接口

  ListIterator 接口繼承 Iterator 接口以支持添加或更改底層集合中的元素,還支持雙向訪問。ListIterator沒有當(dāng)前位置,光標(biāo)位于調(diào)用previous和next方法返回的值之間。一個(gè)長(zhǎng)度為n的列表,有n+1個(gè)有效索引值:




  (1) void add(Object o): 將對(duì)象o添加到當(dāng)前位置的前面

   void set(Object o): 用對(duì)象o替代next或previous方法訪問的上一個(gè)元素。如果上次調(diào)用后列表結(jié)構(gòu)被修改了,那么將拋出IllegalStateException異常。

  (2) boolean hasPrevious(): 判斷向后迭代時(shí)是否有元素可訪問

   Object previous():返回上一個(gè)對(duì)象

   int nextIndex(): 返回下次調(diào)用next方法時(shí)將返回的元素的索引

   int previousIndex(): 返回下次調(diào)用previous方法時(shí)將返回的元素的索引

  “正常情況下,不用ListIterator改變某次遍歷集合元素的方向 — 向前或者向后。雖然在技術(shù)上可以實(shí)現(xiàn),但previous() 后立刻調(diào)用next(),返回的是同一個(gè)元素。把調(diào)用 next()和previous()的順序顛倒一下,結(jié)果相同。”

  “我們還需要稍微再解釋一下 add() 操作。添加一個(gè)元素會(huì)導(dǎo)致新元素立刻被添加到隱式光標(biāo)的前面。因此,添加元素后調(diào)用 previous() 會(huì)返回新元素,而調(diào)用 next() 則不起作用,返回添加操作之前的下一個(gè)元素。”

  2.2.AbstractList和AbstractSequentialList抽象類

  有兩個(gè)抽象的 List 實(shí)現(xiàn)類:AbstractList 和 AbstractSequentialList。像 AbstractSet 類一樣,它們覆蓋了 equals() 和 hashCode() 方法以確保兩個(gè)相等的集合返回相同的哈希碼。若兩個(gè)列表大小相等且包含順序相同的相同元素,則這兩個(gè)列表相等。這里的 hashCode() 實(shí)現(xiàn)在 List 接口定義中指定,而在這里實(shí)現(xiàn)。

  除了equals()和hashCode(),AbstractList和AbstractSequentialList實(shí)現(xiàn)了其余 List 方法的一部分。因?yàn)閿?shù)據(jù)的隨機(jī)訪問和順序訪問是分別實(shí)現(xiàn)的,使得具體列表實(shí)現(xiàn)的創(chuàng)建更為容易。需要定義的一套方法取決于您希望支持的行為。您永遠(yuǎn)不必親自提供的是 iterator方法的實(shí)現(xiàn)。

  2.3. LinkedList類和ArrayList類

  在“集合框架”中有兩種常規(guī)的 List 實(shí)現(xiàn):ArrayList 和 LinkedList。使用兩種 List 實(shí)現(xiàn)的哪一種取決于您特定的需要。如果要支持隨機(jī)訪問,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList 提供了可選的集合。但如果,您要頻繁的從列表的中間位置添加和除去元素,而只要順序的訪問列表元素,那么,LinkedList 實(shí)現(xiàn)更好。

  “ArrayList 和 LinkedList 都實(shí)現(xiàn) Cloneable 接口,都提供了兩個(gè)構(gòu)造函數(shù),一個(gè)無參的,一個(gè)接受另一個(gè)Collection”

  2.3.1. LinkedList類

  LinkedList類添加了一些處理列表兩端元素的方法。



  (1) void addFirst(Object o): 將對(duì)象o添加到列表的開頭

    void addLast(Object o):將對(duì)象o添加到列表的結(jié)尾

  (2) Object getFirst(): 返回列表開頭的元素

    Object getLast(): 返回列表結(jié)尾的元素

  (3) Object removeFirst(): 刪除并且返回列表開頭的元素

    Object removeLast():刪除并且返回列表結(jié)尾的元素

  (4) LinkedList(): 構(gòu)建一個(gè)空的鏈接列表

    LinkedList(Collection c): 構(gòu)建一個(gè)鏈接列表,并且添加集合c的所有元素

  “使用這些新方法,您就可以輕松的把 LinkedList 當(dāng)作一個(gè)堆棧、隊(duì)列或其它面向端點(diǎn)的 數(shù)據(jù)結(jié)構(gòu) 。”

  2.3.2. ArrayList類

  ArrayList類封裝了一個(gè)動(dòng)態(tài)再分配的Object[]數(shù)組。每個(gè)ArrayList對(duì)象有一個(gè)capacity。這個(gè)capacity表示存儲(chǔ)列表中元素的數(shù)組的容量。當(dāng)元素添加到ArrayList時(shí),它的capacity在常量時(shí)間內(nèi)自動(dòng)增加。

  在向一個(gè)ArrayList對(duì)象添加大量元素的程序中,可使用ensureCapacity方法增加capacity。這可以減少增加重分配的數(shù)量。

  (1) void ensureCapacity(int minCapacity): 將ArrayList對(duì)象容量增加minCapacity

  (2) void trimToSize(): 整理ArrayList對(duì)象容量為列表當(dāng)前大小。程序可使用這個(gè)操作減少ArrayList對(duì)象存儲(chǔ)空間。

  2.3.2.1. RandomAccess接口

  一個(gè)特征接口。該接口沒有任何方法,不過你可以使用該接口來測(cè)試某個(gè)集合是否支持有效的隨機(jī)訪問。ArrayList和Vector類用于實(shí)現(xiàn)該接口。

3.Set接口

  Set 接口繼承 Collection 接口,而且它不允許集合中存在重復(fù)項(xiàng),每個(gè)具體的 Set 實(shí)現(xiàn)類依賴添加的對(duì)象的 equals()方法來檢查獨(dú)一性。Set接口沒有引入新方法,所以Set就是一個(gè)Collection,只不過其行為不同。


  3.1. Hash表

  Hash表是一種 數(shù)據(jù)結(jié)構(gòu) ,用來查找對(duì)象。Hash表為每個(gè)對(duì)象計(jì)算出一個(gè)整數(shù),稱為Hash Code(哈希碼)。Hash表是個(gè)鏈接式列表的陣列。每個(gè)列表稱為一個(gè)buckets(哈希表元)。對(duì)象位置的計(jì)算 index = HashCode % buckets (HashCode為對(duì)象哈希碼,buckets為哈希表元總數(shù))。

  當(dāng)你添加元素時(shí),有時(shí)你會(huì)遇到已經(jīng)填充了元素的哈希表元,這種情況稱為Hash Collisions(哈希沖突)。這時(shí),你必須判斷該元素是否已經(jīng)存在于該哈希表中。

  如果哈希碼是合理地隨機(jī)分布的,并且哈希表元的數(shù)量足夠大,那么哈希沖突的數(shù)量就會(huì)減少。同時(shí),你也可以通過設(shè)定一個(gè)初始的哈希表元數(shù)量來更好地控制哈希表的運(yùn)行。初始哈希表元的數(shù)量為 buckets = size * 150% + 1 (size為預(yù)期元素的數(shù)量)。

  如果哈希表中的元素放得太滿,就必須進(jìn)行rehashing(再哈希)。再哈希使哈希表元數(shù)增倍,并將原有的對(duì)象重新導(dǎo)入新的哈希表元中,而原始的哈希表元被刪除。load factor(加載因子)決定何時(shí)要對(duì)哈希表進(jìn)行再哈希。在Java編程語言中,加載因子默認(rèn)值為0.75,默認(rèn)哈希表元為101。

  3.2. Comparable接口和Comparator接口

  在“集合框架”中有兩種比較接口:Comparable接口和Comparator接口。像String和Integer等Java內(nèi)建類實(shí)現(xiàn)Comparable接口以提供一定排序方式,但這樣只能實(shí)現(xiàn)該接口一次。對(duì)于那些沒有實(shí)現(xiàn)Comparable接口的類、或者自定義的類,您可以通過Comparator接口來定義您自己的比較方式。

  3.2.1. Comparable接口

  在java.lang包中,Comparable接口適用于一個(gè)類有自然順序的時(shí)候。假定對(duì)象集合是同一類型,該接口允許您把集合排序成自然順序。



  (1) int compareTo(Object o): 比較當(dāng)前實(shí)例對(duì)象與對(duì)象o,如果位于對(duì)象o之前,返回負(fù)值,如果兩個(gè)對(duì)象在排序中位置相同,則返回0,如果位于對(duì)象o后面,則返回正值

  在 Java 2 SDK版本1.4中有二十四個(gè)類實(shí)現(xiàn)Comparable接口。下表展示了8種基本類型的自然排序。雖然一些類共享同一種自然排序,但只有相互可比的類才能排序。

排序
BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short 按數(shù)字大小排序
Character 按 Unicode 值的數(shù)字大小排序
String 按字符串中字符 Unicode 值排序


  利用Comparable接口創(chuàng)建您自己的類的排序順序,只是實(shí)現(xiàn)compareTo()方法的問題。通常就是依賴幾個(gè)數(shù)據(jù)成員的自然排序。同時(shí)類也應(yīng)該覆蓋equals()和hashCode()以確保兩個(gè)相等的對(duì)象返回同一個(gè)哈希碼。

  3.2.2. Comparator接口

  若一個(gè)類不能用于實(shí)現(xiàn)java.lang.Comparable,或者您不喜歡缺省的Comparable行為并想提供自己的排序順序(可能多種排序方式),你可以實(shí)現(xiàn)Comparator接口,從而定義一個(gè)比較器。




  (1)int compare(Object o1, Object o2): 對(duì)兩個(gè)對(duì)象o1和o2進(jìn)行比較,如果o1位于o2的前面,則返回負(fù)值,如果在排序順序中認(rèn)為o1和o2是相同的,返回0,如果o1位于o2的后面,則返回正值

  “與Comparable相似,0返回值不表示元素相等。一個(gè)0返回值只是表示兩個(gè)對(duì)象排在同一位置。由Comparator用戶決定如何處理。如果兩個(gè)不相等的元素比較的結(jié)果為零,您首先應(yīng)該確信那就是您要的結(jié)果,然后記錄行為。”

  (2)boolean equals(Object obj): 指示對(duì)象obj是否和比較器相等。

  “該方法覆寫Object的equals()方法,檢查的是Comparator實(shí)現(xiàn)的等同性,不是處于比較狀態(tài)下的對(duì)象。”

?

全面接觸Java集合框架 三四


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論