日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java集合——数组列表(ArrayList)+散列集(HashSet)

發(fā)布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java集合——数组列表(ArrayList)+散列集(HashSet) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【0】README

0.1) 本文描述+源代碼均 轉(zhuǎn)自 core java volume 1, 旨在理解 java集合——數(shù)組列表(ArrayList)+散列集(HashSet) 的相關(guān)知識;
0.2) 散列集HashSet 涉及到 hashCode()方法 和 hash 碼, 詳情參見: http://blog.csdn.net/pacosonswjtu/article/details/50312917
0.3) for full source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/SetTest.java


【1】數(shù)組列表(ArrayList)

1.1) List接口用于描述一個有序集合, 并且集合中每個元素的位置十分重要;
1.2)有兩種訪問元素 的協(xié)議:

  • 1.2.1)一種是用迭代器;
  • 1.2.2)另一種是使用 get 和 set方法隨機(jī)的訪問每個元素;
  • 1.2.3)后者不適用于鏈表, 但對數(shù)組卻很有用。集合類庫提供了一種大家熟悉的ArrayList 類, 這個類也實現(xiàn)了 List接口。

1.3) ArrayList 封裝了一個動態(tài)再分配的對象數(shù)組;

Annotation)

  • A1)對于有經(jīng)驗的 coder 來說, 在需要動態(tài)數(shù)組的時候, 可能會使用 Vector類;
  • A2)為什么要用 ArrayList 取代 Vector呢? 因為, Vector 類的所有方法都是同步的(可以由兩個線程安全的訪問一個 Vector對象);但是, 如果由一個線程訪問 Vector, 代碼需要在同步操作上 耗費大量的時間;(干貨——ArrayList非同步訪問,而Vector同步訪問)
  • A3)而ArryaList 不是同步 的, 所以, 建議在不需要同步時 使用 ArrayList, 而不要使用 Vector;

【2】散列集(HashSet)

2.1)如果不在意元素的順序,可以有幾種能夠快速查找元素的數(shù)據(jù)結(jié)構(gòu)。 其缺點是無法控制元素出現(xiàn)的次序。 它們將按照有利于其操作目的的原則組織數(shù)據(jù);
2.2)散列表定義: 有一種眾所周知的數(shù)據(jù)結(jié)構(gòu), 可以快速查找所需要的對象;

  • 2.2.1)散列碼:散列表為每個對象計算一個整數(shù), 稱為散列碼;
  • 2.2.2)散列碼是由對象的實例域產(chǎn)生 的一個整數(shù)。 更準(zhǔn)確的說, 具有不同數(shù)據(jù)域的對象將產(chǎn)生不同的散列碼, 下表列出了幾個散列碼的實例, 它們是由String 類 的hashCode 方法產(chǎn)生的;

    2.3)如果自定義類, 就要負(fù)責(zé)實現(xiàn)這個類 的 hashCode 方法。
    Attention)

  • A1)自己實現(xiàn)的 hashCode方法要與 equals 方法兼容, 即 如果a.equals(b) 為 true, a 與b 必須具有相同的散列碼;(干貨, 兩個對象的equals 方法結(jié)果===它們的 hashCode 方法的結(jié)果)

  • A2)現(xiàn)在, 最重要的問題是 散列碼要能夠快速計算出來, 并且這個計算只與要散列 的對象狀態(tài)有關(guān), 與散列表的其他對象無關(guān);

2.4)在java中, 散列表用鏈表數(shù)組實現(xiàn): (C語言應(yīng)該講過鏈表數(shù)組,我們不累述)

  • 2.4.1)每個列表就被稱為桶: 要想找到表中對象 的位置, 就要先計算它的散列碼, 然后與桶的總數(shù)取余, 所得到的結(jié)果就是保存這個元素的桶的索引;
  • 2.4.2)如何設(shè)置桶數(shù)?
    • 2.4.2.1) 通常,將桶數(shù)設(shè)置為預(yù)計元素個數(shù)的 75%~150%;有些研究人員認(rèn)為:盡管沒有確鑿的證據(jù), 但最好還是將桶數(shù)設(shè)置為一個素數(shù), 以防止鍵的集聚;
    • 2.4.2.2)標(biāo)準(zhǔn)類庫使用的桶數(shù)是2的冪,默認(rèn)值為16;(為表大小提供的任何值都將被自動轉(zhuǎn)換為2的下一個冪);
  • 2.4.3)再散列:如果散列表太滿, 就需要再散列;如果要對散列表再散列, 就需要創(chuàng)建一個桶數(shù)更多的表,并將所有元素插入到這個新表中, 丟棄原來的表;
    • 2.4.3.1)裝填因子: 它決定何時對散列表進(jìn)行再散列, 一般設(shè)置為 0.75;

2.5)散列表可以用于實現(xiàn)幾個重要的數(shù)據(jù)結(jié)構(gòu):

  • 2.5.1)其中最簡單的是 set類型。 set是沒有重復(fù)元素的集合。set 的 add 方法首先在 集中查找要添加的元素, 如果不存在,就將這個對象添加進(jìn)去; (干貨——add方法的執(zhí)行原理)

2.6)java 集合提供了 一個 HashSet類, 它實現(xiàn)了基于 散列表的集;可以用 add 方法添加元素,還有contains 方法被重新定義, 用來快速查看是否某個元素已經(jīng)出現(xiàn)在集合中了;

  • 2.6.1)散列集迭代器將依次訪問所有的桶。 由于散列將元素分散到表的各個位置上, 所以訪問他們的順序幾乎是隨機(jī)的。 只有不關(guān)心集合中元素順序的時候才應(yīng)該使用 HashSet (干貨)
  • 2.6.2)看個荔枝: 這個程序?qū)⒆x取輸入的所有單詞, 并且將它們添加到散列集中。 然后遍歷散列集中的不同單詞, 最后打印出單詞數(shù)量;

Warning)在更改集中元素的時候要格外小心。 因為如果元素的散列碼發(fā)生了改變, 元素在數(shù)據(jù)結(jié)構(gòu)中的位置也會發(fā)生相應(yīng)變化的;


API java.util.HashSet<E> 1.2 HashSet() :構(gòu)造一個空散列集; HashSet(Collection< ? extends E> elements) :構(gòu)造一個空散列集, 并將集合中的元素添加到這個散列集中; HashSet(int initialCapacity)::構(gòu)造一個空散列集;且具有執(zhí)行容量(桶數(shù)) HashSet(int initialCapacity, float loadFactor):構(gòu)造一個具有指定容量和裝填因子(0.0~1.0)的空散列集;API java.lang.Object 1.0 int hashCode() : 返回這個對象的散列碼。散列碼可以是任何整數(shù)(正負(fù)數(shù))。equals 和 hashCode 的定義必須兼容, 即 如果 x.equals(y) 為true, x.hashCode()必須等于 y.hashCode();

總結(jié)

以上是生活随笔為你收集整理的java集合——数组列表(ArrayList)+散列集(HashSet)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。