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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 快速查找 list_面试官:小伙子,你连Java集合都讲不清楚,怎么就敢开口要8K呀?...

發(fā)布時(shí)間:2024/9/19 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 快速查找 list_面试官:小伙子,你连Java集合都讲不清楚,怎么就敢开口要8K呀?... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上回講完了Java基礎(chǔ),相信已經(jīng)收到PDF文檔的朋友開始給自己瘋狂填坑了。

推薦文章:《沒弄懂這些Java基礎(chǔ),簡歷上千萬別寫熟悉:異常+反射+注解+泛型》

注:私信【基礎(chǔ)】獲取高清大圖和完整PDF,還有更多Java進(jìn)階視頻資料!

本章在開始之前,先給大家講個(gè)小故事吧:

圖片來源于網(wǎng)絡(luò)

不是這個(gè)~

面試官:你好!請簡單介紹一下你自己

騷年:大佬您好!我在讀書的時(shí)候就十分仰慕您,您一直都是我的偶像,所以我職高剛畢業(yè)就迫不及待的學(xué)Java技術(shù),然后來您所在的公司應(yīng)聘,沒想到面試官就是您

面試官:等等,職...職高?

騷年:這都不重要,噢~我親愛的大佬,您知道嗎?我非常敬仰您,也羨慕您,羨慕您頭頂一毛不拔的那塊地,那是我一直向往的地方...

面試官(摸了摸從右邊蓋到左邊的頭發(fā)):咳咳...,咱回歸正題,額~這個(gè),剛找工作?

騷年:不完全是,學(xué)習(xí)期間實(shí)習(xí)過一段時(shí)間

面試官:嗯,先問問,對薪資有什么期望嗎?

騷年:額~我來算算,我一個(gè)月房租1200,一天抽兩包6塊錢的煙,中飯加晚飯一天20,還要喝飲料,用電、用水啥的,算下來8000塊,這樣,我就不賺錢了,就8K!

面試官:就8K?我們這邊最低都是28K,那行,了解一下你的技術(shù)水平吧,問:前段時(shí)間微博服務(wù)器崩潰,是怎么回事?

騷年:啊?

面試官:額~拿錯(cuò)了臺本,再來,說說Java集合!

騷年:這個(gè)我知道,List和Set

面試官:還有呢?

騷年:還有嗎?沒有了吧?

面試官:小伙子,你Java集合都說不全,怎么敢要8K啊?回家吧!

騷年:......

細(xì)說Java集合

私信【Java】獲取高清完整大圖

注:私信【基礎(chǔ)】獲取高清大圖和完整PDF,還有更多Java進(jìn)階視頻資料!

接口繼承關(guān)系和實(shí)現(xiàn)

集合類存放于 Java.util 包中,主要有 3 種:set(集)、list(列表包含 Queue)和 map(映射)。

1. Collection:Collection 是集合 List、Set、Queue 的最基本的接口

2. Iterator:迭代器,可以通過迭代器遍歷集合中的數(shù)據(jù)

3. Map:是映射表的基礎(chǔ)接口

List

Java 的 List 是非常常用的數(shù)據(jù)類型。List 是有序的 Collection。Java List 一共三個(gè)實(shí)現(xiàn)類:分別是 ArrayList、Vector 和 LinkedList。

1、ArrayList(數(shù)組)

ArrayList 是最常用的 List 實(shí)現(xiàn)類,內(nèi)部是通過數(shù)組實(shí)現(xiàn)的,它允許對元素進(jìn)行快速隨機(jī)訪問。數(shù)組的缺點(diǎn)是每個(gè)元素之間不能有間隔,當(dāng)數(shù)組大小不滿足時(shí)需要增加存儲(chǔ)能力,就要將已經(jīng)有數(shù)組的數(shù)據(jù)復(fù)制到新的存儲(chǔ)空間中。當(dāng)從 ArrayList 的中間位置插入或者刪除元素時(shí),需要對數(shù)組進(jìn)行復(fù)制、移動(dòng)、代價(jià)比較高。因此,它適合隨機(jī)查找和遍歷,不適合插入和刪除。

2、Vector(數(shù)組實(shí)現(xiàn)、線程同步)

Vector 與 ArrayList 一樣,也是通過數(shù)組實(shí)現(xiàn)的,不同的是它支持線程的同步,即某一時(shí)刻只有一個(gè)線程能夠?qū)?Vector,避免多線程同時(shí)寫而引起的不一致性,但實(shí)現(xiàn)同步需要很高的花費(fèi),因此,訪問它比訪問 ArrayList 慢。

3、LinkList(鏈表)

LinkedList 是用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的,很適合數(shù)據(jù)的動(dòng)態(tài)插入和刪除,隨機(jī)訪問和遍歷速度比較慢。另外,他還提供了 List 接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當(dāng)作堆棧、隊(duì)列和雙向隊(duì)列使用。

Set

Set 注重獨(dú)一無二的性質(zhì),該體系集合用于存儲(chǔ)無序(存入和取出的順序不一定相同)元素,值不能重復(fù)。對象的相等性本質(zhì)是對象 hashCode 值(java 是依據(jù)對象的內(nèi)存地址計(jì)算出的此序號)判斷的,如果想要讓兩個(gè)不同的對象視為相等的,就必須覆蓋 Object 的 hashCode 方法和 equals 方法。

1、HashSet(Hash 表)

哈希表邊存放的是哈希值。HashSet 存儲(chǔ)元素的順序并不是按照存入時(shí)的順序(和 List 顯然不同) 而是按照哈希值來存的所以取數(shù)據(jù)也是按照哈希值取得。元素的哈希值是通過元素的hashcode 方法來獲取的, HashSet 首先判斷兩個(gè)元素的哈希值,如果哈希值一樣,接著會(huì)比較equals 方法 如果 equls 結(jié)果為 true ,HashSet 就視為同一個(gè)元素。如果 equals 為 false 就不是同一個(gè)元素。

哈希值相同 equals 為 false 的元素是怎么存儲(chǔ)呢,就是在同樣的哈希值下順延(可以認(rèn)為哈希值相同的元素放在一個(gè)哈希桶中)。也就是哈希一樣的存一列。如圖 1 表示 hashCode 值不相同的情況;圖 2 表示 hashCode 值相同,但 equals 不相同的情況。

HashSet 通過 hashCode 值來確定元素在內(nèi)存中的位置。一個(gè) hashCode 位置上可以存放多個(gè)元素。

2、TreeSet(二叉樹)

  • TreeSet()是使用二叉樹的原理對新 add()的對象按照指定的順序排序(升序、降序),每增加一個(gè)對象都會(huì)進(jìn)行排序,將對象插入的二叉樹指定的位置。
  • Integer 和 String 對象都可以進(jìn)行默認(rèn)的 TreeSet 排序,而自定義類的對象是不可以的,自己定義的類必須實(shí)現(xiàn) Comparable 接口,并且覆寫相應(yīng)的 compareTo()函數(shù),才可以正常使用。
  • 在覆寫 compare()函數(shù)時(shí),要返回相應(yīng)的值才能使 TreeSet 按照一定的規(guī)則來排序。
  • 比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分別返回負(fù)整數(shù)、零或正整數(shù)。
  • 3、LinkHashSet(HashSet+LinkedHashMap)

    對于 LinkedHashSet 而言,它繼承與 HashSet、又基于 LinkedHashMap 來實(shí)現(xiàn)的。LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素,它繼承與 HashSet,其所有的方法操作上又與 HashSet 相同,因此 LinkedHashSet 的實(shí)現(xiàn)上非常簡單,只提供了四個(gè)構(gòu)造方法,并通過傳遞一個(gè)標(biāo)識參數(shù),調(diào)用父類的構(gòu)造器,底層構(gòu)造一個(gè) LinkedHashMap 來實(shí)現(xiàn),在相關(guān)操作上與父類 HashSet 的操作相同,直接調(diào)用父類 HashSet 的方法即可。

    Map

    1、HashMap(數(shù)組+鏈表+紅黑樹)

    HashMap 根據(jù)鍵的 hashCode 值存儲(chǔ)數(shù)據(jù),大多數(shù)情況下可以直接定位到它的值,因而具有很快的訪問速度,但遍歷順序卻是不確定的。 HashMap 最多只允許一條記錄的鍵為 null,允許多條記錄的值為 null。HashMap 非線程安全,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫 HashMap,可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要滿足線程安全,可以用 Collections 的 synchronizedMap 方法使HashMap 具有線程安全的能力,或者使用 ConcurrentHashMap。我們用下面這張圖來介紹HashMap 的結(jié)構(gòu)。

    (1)JAVA7 實(shí)現(xiàn)

    大方向上,HashMap 里面是一個(gè)數(shù)組,然后數(shù)組中每個(gè)元素是一個(gè)單向鏈表。上圖中,每個(gè)綠色

    的實(shí)體是嵌套類 Entry 的實(shí)例,Entry 包含四個(gè)屬性:key, value, hash 值和用于單向鏈表的 next。

  • capacity:當(dāng)前數(shù)組容量,始終保持 2^n,可以擴(kuò)容,擴(kuò)容后數(shù)組大小為當(dāng)前的 2 倍。
  • loadFactor:負(fù)載因子,默認(rèn)為 0.75。
  • threshold:擴(kuò)容的閾值,等于 capacity * loadFactor。
  • (2)JAVA8 實(shí)現(xiàn)

    Java8 對 HashMap 進(jìn)行了一些修改,最大的不同就是利用了紅黑樹,所以其由數(shù)組+鏈表+紅黑樹組成。

    根據(jù) Java7 HashMap 的介紹,我們知道,查找的時(shí)候,根據(jù) hash 值我們能夠快速定位到數(shù)組的具體下標(biāo),但是之后的話,需要順著鏈表一個(gè)個(gè)比較下去才能找到我們需要的,時(shí)間復(fù)雜度取決于鏈表的長度,為 O(n)。為了降低這部分的開銷,在 Java8 中,當(dāng)鏈表中的元素超過了 8 個(gè)以后,會(huì)將鏈表轉(zhuǎn)換為紅黑樹,在這些位置進(jìn)行查找的時(shí)候可以降低時(shí)間復(fù)雜度為 O(logN)。

    2、ConcurrentHashMap

    (1)Segment 段

    ConcurrentHashMap 和 HashMap 思路是差不多的,但是因?yàn)樗С植l(fā)操作,所以要復(fù)雜一些。整個(gè) ConcurrentHashMap 由一個(gè)個(gè) Segment 組成,Segment 代表”部分“或”一段“的意思,所以很多地方都會(huì)將其描述為分段鎖。注意,行文中,我很多地方用了“槽”來代表一個(gè)segment。

    (2)線程安全(Segment 繼承 ReentrantLock 加鎖)

    簡單理解就是,ConcurrentHashMap 是一個(gè) Segment 數(shù)組,Segment 通過繼承ReentrantLock 來進(jìn)行加鎖,所以每次需要加鎖的操作鎖住的是一個(gè) segment,這樣只要保證每個(gè) Segment 是線程安全的,也就實(shí)現(xiàn)了全局的線程安全。

    (3)并行度(默認(rèn) 16)

    concurrencyLevel:并行級別、并發(fā)數(shù)、Segment 數(shù),怎么翻譯不重要,理解它。默認(rèn)是 16,也就是說 ConcurrentHashMap 有 16 個(gè) Segments,所以理論上,這個(gè)時(shí)候,最多可以同時(shí)支持 16 個(gè)線程并發(fā)寫,只要它們的操作分別分布在不同的 Segment 上。這個(gè)值可以在初始化的時(shí)候設(shè)置為其他值,但是一旦初始化以后,它是不可以擴(kuò)容的。再具體到每個(gè) Segment 內(nèi)部,其實(shí)每個(gè) Segment 很像之前介紹的 HashMap,不過它要保證線程安全,所以處理起來要麻煩些。

    (4)Java8 實(shí)現(xiàn) (引入了紅黑樹)

    Java8 對 ConcurrentHashMap 進(jìn)行了比較大的改動(dòng),Java8 也引入了紅黑樹。

    3、HashTable(線程安全)

    Hashtable 是遺留類,很多映射的常用功能與 HashMap 類似,不同的是它承自 Dictionary 類,并且是線程安全的,任一時(shí)間只有一個(gè)線程能寫 Hashtable,并發(fā)性不如 ConcurrentHashMap,因?yàn)镃oncurrentHashMap 引入了分段鎖。Hashtable 不建議在新代碼中使用,不需要線程安全的場合可以用 HashMap 替換,需要線程安全的場合可以用 ConcurrentHashMap 替換。

    4、TreeMap(可排序)

    TreeMap 實(shí)現(xiàn) SortedMap 接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用 Iterator 遍歷 TreeMap 時(shí),得到的記錄是排過序的。如果使用排序的映射,建議使用 TreeMap。在使用 TreeMap 時(shí),key 必須實(shí)現(xiàn) Comparable 接口或者在構(gòu)造 TreeMap 傳入自定義的Comparator,否則會(huì)在運(yùn)行時(shí)拋出 java.lang.ClassCastException 類型的異常。

    5、LinkHashMap(記錄插入順序)

    LinkedHashMap 是 HashMap 的一個(gè)子類,保存了記錄的插入順序,在用 Iterator 遍LinkedHashMap 時(shí),先得到的記錄肯定是先插入的,也可以在構(gòu)造時(shí)帶參數(shù),按照訪問次序排序。

    看完了記得收藏和轉(zhuǎn)發(fā)哦~

    下一章我將分享大篇干貨“JVM”,關(guān)注我上車別跟丟!

    總結(jié)

    以上是生活随笔為你收集整理的java 快速查找 list_面试官:小伙子,你连Java集合都讲不清楚,怎么就敢开口要8K呀?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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