中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

石家莊視頻網(wǎng)站建設(shè)公司百度大數(shù)據(jù)平臺(tái)

石家莊視頻網(wǎng)站建設(shè)公司,百度大數(shù)據(jù)平臺(tái),建網(wǎng)站 技術(shù),旅行社營(yíng)業(yè)部管理辦法目錄1.Java 有哪些常用容器(集合)?2.Collection 和 Collections 有什么區(qū)別?3.List、Set、Map 之間的區(qū)別是什么?4.HashMap 的長(zhǎng)度為什么是 2 的 N 次方?源碼中是如何保證的?5.HashMap 和 Hasht…

目錄

  • 1.Java 有哪些常用容器(集合)?
  • 2.Collection 和 Collections 有什么區(qū)別?
  • 3.List、Set、Map 之間的區(qū)別是什么?
  • 4.HashMap 的長(zhǎng)度為什么是 2 的 N 次方?源碼中是如何保證的?
  • 5.HashMap 和 Hashtable 的異同有哪些?
  • 6.HashMap 與 ConcurrentHashMap 的異同有哪些?
  • 7.poll() 方法和 remove() 方法有什么異同?
  • 8.ArrayList 和 LinkedList 有什么區(qū)別?

1.Java 有哪些常用容器(集合)?

在這里插入圖片描述
(1)從上面的集合框架圖可以看到,Java 集合框架主要包括兩種類(lèi)型的容器,一種是集合(Collection),存儲(chǔ)一個(gè)元素集合,另一種是圖(Map),存儲(chǔ)鍵/值對(duì)映射。Collection 接口又有 3 種子類(lèi)型,List、SetQueue,再下面是一些抽象類(lèi),最后是具體實(shí)現(xiàn)類(lèi),常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

在這里插入圖片描述
(2)集合框架體系如下圖所示:
在這里插入圖片描述

2.Collection 和 Collections 有什么區(qū)別?

(1)Collection 是 JDK 中集合層次結(jié)構(gòu)中的最根本的接口,定義了集合類(lèi)的基本方法。Collection 接口在 Java 類(lèi)庫(kù)中有很多具體的實(shí)現(xiàn),其意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式。
(2)Collections 是一個(gè)包裝類(lèi),是 Collection 集合框架的工具類(lèi)。它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法,不能實(shí)例化,比如排序方法: Collections. sort(list)。

3.List、Set、Map 之間的區(qū)別是什么?

(1)List:有序集合,元素可重復(fù);
(2)Set:不重復(fù)集合,LinkedHashSet 按照插入排序,SortedSet 可排序,HashSet 無(wú)序;
(3)Map:鍵值對(duì)集合,存儲(chǔ)鍵、值和之間的映射;Key無(wú)序且唯一;value 不要求有序,允許重復(fù)。

4.HashMap 的長(zhǎng)度為什么是 2 的 N 次方?源碼中是如何保證的?

(1)為了能讓 HashMap 存數(shù)據(jù)和取數(shù)據(jù)的效率高,盡可能地減少 hash 值的碰撞,也就是說(shuō)盡量把數(shù)據(jù)均勻地分配,每個(gè)鏈表或者紅黑樹(shù)的長(zhǎng)度盡量相等。我們首先可能會(huì)想到通過(guò)取模操作來(lái)實(shí)現(xiàn)。取余 (%) 操作中如果除數(shù)是 2 的冪次,則等價(jià)于與其除數(shù)減一的與(&)操作,也就是說(shuō) hash % length == hash & (length - 1) 的前提是 length 是 2 的 N 次方。并且,采用二進(jìn)制位操作 & ,相對(duì)于 % 能夠提高運(yùn)算效率。
注:HashMap 的初始長(zhǎng)度是 16。

(2)在擴(kuò)容遷移的時(shí)候不需要再重新通過(guò)哈希定位新的位置了。擴(kuò)容后元素新的位置,要么在原腳標(biāo)位,要么在原腳標(biāo)位 + 擴(kuò)容長(zhǎng)度的位置
(3)HashMap 源碼中的 tableSizeFor(int cap) 可以保證其長(zhǎng)度永遠(yuǎn)是是 2 的 N 次方

/*** Returns a power of two size for the given target capacity.*/
static final int tableSizeFor(int cap) {int n = cap - 1;n |= n >>> 1;n |= n >>> 2;n |= n >>> 4;n |= n >>> 8;n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

具體分析可參考這篇文章。

5.HashMap 和 Hashtable 的異同有哪些?

(1)出現(xiàn)的版本不一樣,Hashtable 出現(xiàn)于 Java 發(fā)布的第一版本 JDK 1.0,HashMap 出現(xiàn)于 JDK 1.2。
(2)都實(shí)現(xiàn)了 Map、Cloneable、Serializable(當(dāng)前 JDK 版本 1.8)。
(3)HashMap 繼承的是 AbstractMap,并且 AbstractMap 也實(shí)現(xiàn)了 Map 接口。Hashtable 繼承Dictionary。
(4)Hashtable 中大部分 public 修飾普通方法都是 synchronized 字段修飾的,是線程安全的,HashMap 是非線程安全的。
(5)Hashtable 的 key 不能為 null,value 也不能為 null,這個(gè)可以從 Hashtable 源碼中的 put 方法看到,判斷如果 value 為 null 就直接拋出空指針異常,在 put 方法中計(jì)算 key 的 hash 值之前并沒(méi)有判斷 key 為 null 的情況,那說(shuō)明,這時(shí)候如果 key 為空,照樣會(huì)拋出空指針異常。
(6)HashMap 的 key 和 value 都可以為 null。在計(jì)算 hash 值的時(shí)候,有判斷,如果 key==null ,則其 hash=0 ;至于 value 是否為 null,根本沒(méi)有判斷過(guò)。
(7)Hashtable 直接使用對(duì)象的 hash 值。hash 值是 JDK 根據(jù)對(duì)象的地址或者字符串或者數(shù)字算出來(lái)的 int 類(lèi)型的數(shù)值。然后再使用除留余數(shù)法來(lái)獲得最終的位置。然而除法運(yùn)算是非常耗費(fèi)時(shí)間的,效率很低。HashMap 為了提高計(jì)算效率,將哈希表的大小固定為了 2 的冪,這樣在取模預(yù)算時(shí),不需要做除法,只需要做位運(yùn)算。位運(yùn)算比除法的效率要高很多。
(8)Hashtable、HashMap 都使用了 Iterator。而由于歷史原因,Hashtable 還使用了 Enumeration 的方式。
(9)默認(rèn)情況下,初始容量不同,Hashtable 的初始長(zhǎng)度是 11,之后每次擴(kuò)充容量變?yōu)橹暗?2 * n+1(n 為上一次的長(zhǎng)度)而 HashMap 的初始長(zhǎng)度為 16,之后每次擴(kuò)充變?yōu)樵瓉?lái)的兩倍。

具體細(xì)節(jié)可參考這篇文章。

6.HashMap 與 ConcurrentHashMap 的異同有哪些?

(1)都是 key-value 形式的存儲(chǔ)數(shù)據(jù);
(2)HashMap 是線程不安全的,ConcurrentHashMap 是 JUC 下的線程安全的;
(3)HashMap 底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組 + 鏈表(JDK 1.8 之前)。JDK 1.8 之后是數(shù)組 + 鏈表 + 紅黑樹(shù)。當(dāng)鏈表中元素個(gè)數(shù)達(dá)到 8 的時(shí)候,鏈表的查詢速度不如紅黑樹(shù)快,鏈表會(huì)轉(zhuǎn)為紅黑樹(shù),紅黑樹(shù)查詢速度快;
(4)HashMap 初始數(shù)組大小為 16(默認(rèn)),當(dāng)出現(xiàn)擴(kuò)容的時(shí)候,變?yōu)樵瓉?lái)的兩倍;
(5)ConcurrentHashMap 在 JDK 1.8 之前是采用分段鎖來(lái)現(xiàn)實(shí)的 Segment + HashEntry,
(6)Segment 數(shù)組大小默認(rèn)是 16,2 的 n 次方;JDK 1.8 之后,采用 Node + CAS + Synchronized 來(lái)保證并發(fā)安全進(jìn)行實(shí)現(xiàn)。

具體細(xì)節(jié)可參考這篇文章

7.poll() 方法和 remove() 方法有什么異同?

(1)相同點(diǎn):poll() 和 remove() 都是從隊(duì)列中取出一個(gè)元素
(2)不同點(diǎn):poll() 在獲取元素失敗的時(shí)候會(huì)返回空,但 remove() 失敗的時(shí)候會(huì)拋出異常。

8.ArrayList 和 LinkedList 有什么區(qū)別?

(1)底層數(shù)據(jù)結(jié)構(gòu)
ArrayList 是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的,在一片連續(xù)的內(nèi)存空間中存儲(chǔ)數(shù)據(jù)。
LinkedList 是基于鏈表實(shí)現(xiàn)的,數(shù)據(jù)可以存儲(chǔ)在分散的內(nèi)存空間中。

(2)讀取、插入、刪除操作
由于底層數(shù)據(jù)結(jié)構(gòu)的不同,讀取、插入、刪除操作的性能也會(huì)有所不同。
① 在讀取方面 ArrayList 的性能比 LinkedList 高,ArrayList 支持通過(guò)索引訪問(wèn)(也稱隨機(jī)訪問(wèn)),可以在 O(1) 的時(shí)間復(fù)雜度內(nèi)進(jìn)行隨機(jī)讀取。而 LinkedList 需要從頭開(kāi)始遍歷直到找到目標(biāo)元素為止,其時(shí)間復(fù)雜度為 O(n)。
② 對(duì)于插入、刪除操作,一般來(lái)說(shuō),LinkedList 的性能要比 ArrayList 高。ArrayList 在插入和刪除元素時(shí),可能需要進(jìn)行元素移動(dòng)甚至擴(kuò)容操作;而 LinkedList 只需找到要插入的位置并實(shí)例化對(duì)象,然后修改節(jié)點(diǎn)指針即可。不過(guò)需要注意的是如果 ArrayList 使用尾插法并指定初始容量,這可以極大地提升性能,甚至超過(guò) LinkedList。

(3)遍歷操作
ArrayList 和 LinkedList 常見(jiàn)的遍歷方式有 3 種:for(結(jié)合 get(i) 方法)、foreach、iterator。
① 在數(shù)據(jù)量比較小時(shí),不同遍歷方式的性能差別不大。
② 但是在數(shù)據(jù)量比較大時(shí):
對(duì)于 ArrayList 來(lái)說(shuō),3 種遍歷方式差距不是很大,其中 for 循環(huán)的效率最高,因?yàn)椴捎弥苯拥南聵?biāo)運(yùn)算。對(duì)于 LinkedList 來(lái)說(shuō),迭代器效率最高,因?yàn)槠湎喈?dāng)于維護(hù)一個(gè)當(dāng)前狀態(tài)指針,遍歷只需要掃描一遍雙向鏈表即可,而 for 效率最低,因?yàn)樾枰獟呙?n 遍鏈表。不難看出,兩種 List 中,foreach 的效率都比迭代器略低,因?yàn)槠涞讓泳褪怯傻鲗?shí)現(xiàn)的,只不過(guò)為了方便書(shū)寫(xiě),做了簡(jiǎn)單的封裝。

具體細(xì)節(jié)可參考 ArrayList 和 LinkedList 的三種遍歷方式 這篇文章。

(4)內(nèi)存空間利用率
一般來(lái)說(shuō),存儲(chǔ)相同類(lèi)型、相同大小的數(shù)據(jù)時(shí),LinkedList 比 ArrayList 更占內(nèi)存,其內(nèi)存空間利用率更低,因?yàn)?LinkedList 為每一個(gè)節(jié)點(diǎn)存儲(chǔ)了兩個(gè)引用節(jié)點(diǎn),一個(gè)指向前一個(gè)元素,另一個(gè)指向下一個(gè)元素。不過(guò)有時(shí)在 ArrayList 列表的結(jié)尾預(yù)留一定的容量空間,這也會(huì)造成一定的內(nèi)存空間的浪費(fèi)。

(5)擴(kuò)容問(wèn)題
ArrayList 使用動(dòng)態(tài)數(shù)組實(shí)現(xiàn),無(wú)參構(gòu)造函數(shù)中默認(rèn)初始化長(zhǎng)度為 10,當(dāng)需要擴(kuò)容時(shí)會(huì)將原數(shù)組中的元素重新拷貝到長(zhǎng)度為原數(shù)組的 1.5 倍的新數(shù)組中,擴(kuò)容代價(jià)比較高;LinkedList 通過(guò)鏈表實(shí)現(xiàn),所以不存在擴(kuò)容問(wèn)題,新增元素直接放到集合尾部,并修改相應(yīng)的指針節(jié)點(diǎn)即可。

http://www.risenshineclean.com/news/27039.html

相關(guān)文章:

  • 怎么用服務(wù)器ip做網(wǎng)站百家號(hào)優(yōu)化
  • 武漢房?jī)r(jià)深圳市seo網(wǎng)絡(luò)推廣哪家好
  • 大連網(wǎng)站建設(shè)設(shè)計(jì)上海牛巨微seo優(yōu)化
  • php做電影網(wǎng)站有哪些網(wǎng)絡(luò)營(yíng)銷(xiāo)以什么為中心
  • 網(wǎng)站建設(shè)衤金手指下拉10搜索引擎優(yōu)化的具體措施
  • 臨沂哪里做網(wǎng)站比較好seo是什么專(zhuān)業(yè)的課程
  • 網(wǎng)站黨組織規(guī)范化建設(shè)開(kāi)展情況網(wǎng)站怎么做出來(lái)的
  • 愛(ài)做奈官方網(wǎng)站優(yōu)化公司哪家好
  • 怎樣做百度網(wǎng)站推廣百度6大核心部門(mén)
  • visual studio做網(wǎng)站哪個(gè)公司做網(wǎng)站推廣最好
  • 網(wǎng)站關(guān)鍵詞可以添加嗎seo關(guān)鍵詞外包
  • 獵頭公司應(yīng)堅(jiān)持的原則有超級(jí)優(yōu)化空間
  • 東莞建站seo怎么收費(fèi)的
  • 網(wǎng)站中flash怎么做的游戲推廣怎么做引流
  • 做網(wǎng)站什么商品好軟文網(wǎng)站模板
  • 河田鎮(zhèn)建設(shè)局網(wǎng)站百度知道app
  • 建設(shè)部網(wǎng)站四庫(kù)一平臺(tái)best網(wǎng)絡(luò)推廣平臺(tái)
  • 在公司做網(wǎng)站是什么職位網(wǎng)頁(yè)搜索
  • 二手房在哪個(gè)網(wǎng)站做合同互聯(lián)網(wǎng)營(yíng)銷(xiāo)師培訓(xùn)大綱
  • 敦煌網(wǎng)站銷(xiāo)售員怎么做濰坊今日頭條新聞
  • pb 做網(wǎng)站網(wǎng)站排名怎么優(yōu)化
  • 橙子建站驗(yàn)證碼是詐騙嗎長(zhǎng)沙靠譜seo優(yōu)化
  • 網(wǎng)站建設(shè)方案新聞鄭州網(wǎng)絡(luò)營(yíng)銷(xiāo)公司
  • wordpress停用react如何做谷歌seo推廣
  • c 手機(jī)網(wǎng)站開(kāi)發(fā)模板國(guó)家衛(wèi)生健康委
  • 信息系統(tǒng)軟件有哪些優(yōu)化的概念
  • 外貿(mào)公司網(wǎng)站模板免費(fèi)阿里云搜索引擎網(wǎng)址
  • 做網(wǎng)站用的圖標(biāo)必應(yīng)搜索引擎入口官網(wǎng)
  • 成都專(zhuān)業(yè)做游戲網(wǎng)站個(gè)人網(wǎng)頁(yè)在線制作
  • 濱州 網(wǎng)站建設(shè)互聯(lián)網(wǎng)運(yùn)營(yíng)培訓(xùn)課程