Java集合類的區(qū)別

1. ArrayList信不、LinkedList、Vector辞州、set捞高、List的區(qū)別

  1. ArrayList蹦锋, Vector采用 數(shù)組存儲(chǔ)數(shù)據(jù)炕置,都繼承List荣挨,查找快,刪除插入效率低讹俊,原因:要改變插入或刪除元素后面的所有序號(hào);
    Vector線程安全煌抒,有synchronized鎖仍劈,因此效率較低;擴(kuò)容因子2寡壮;
    ArrayList線程不安全贩疙。擴(kuò)容因子1.5;
  2. LinkedList采用雙向鏈表實(shí)現(xiàn)况既,繼承List和Queue这溅,查找慢,插入刪除快棒仍;還可以 當(dāng)隊(duì)列使用悲靴;
  3. set和 List都 繼承Conllection;
    List有序莫其,用鏈表或數(shù)組實(shí)現(xiàn)癞尚;
    set無序且唯一,用 hash表實(shí)現(xiàn)乱陡;
  4. ArrayList和Vector采用數(shù)組浇揩,存在擴(kuò)容問題,將原來數(shù)組拷貝到新數(shù)據(jù)中憨颠,比較耗費(fèi)時(shí)間胳徽;
    LinkedList采用 鏈表形式,沒有 擴(kuò)容問題爽彤;對(duì)于增長較快的养盗,應(yīng)該采用 LinkedList;

2. String适篙、StringBuffer爪瓜、StringBuilder的區(qū)別

  1. String類型不可變;
    該類實(shí)際上采用char[]實(shí)現(xiàn)匙瘪,char[]不可變铆铆,所以說該類是不可變的蝶缀;
    String類不可變,每次操作都會(huì) 返回一個(gè)新數(shù)組對(duì)象(return new String(buf))薄货;
    StringBuffer翁都、StringBuilder是可變的;
    二者都繼承自AbstractStringBuilder谅猾、在該類中char[]沒有 用final修飾柄慰;
    每次操作返回該字符串本身(return this);
  2. StringBuffer線程安全税娜、StringBuilder線程不安全坐搔;
  3. 封裝類Integer、Character也是不可變的敬矩,因?yàn)?他們除了用final修飾本身概行,也用final修飾內(nèi)部的int和char基本類型的變量;
  4. 在進(jìn)行大量連接操作是弧岳,要使用StringBuffer凳忙、StringBuilder;
    因?yàn)镾tring在 進(jìn)行連接時(shí)也要?jiǎng)?chuàng)建StringBuilder對(duì)象調(diào)用append方法禽炬;

3. Map涧卵、Set、List腹尖、Queue柳恐、Stack的特點(diǎn)與用法

Map:鍵值對(duì)形式存儲(chǔ),key可以為null热幔,不可重復(fù)胎撤,會(huì)覆蓋;
Set:無序断凶,value可為 null伤提,不可重復(fù);
List:有序认烁,可為null肿男,可重復(fù);
Stack:可以但是沒有用LinkdeList實(shí)現(xiàn)却嗡,繼承了Vector舶沛,因此是用數(shù)組實(shí)現(xiàn)的,線程安全窗价。
Queue:LinkedList繼承了這個(gè)借口如庭,可以用LinkedList創(chuàng)建Queue;

4. HashMap和HashTable的區(qū)別

  1. HashMap線程不安全;
    HashTable線程安全撼港;
  2. HashMap允許key或者value為null坪它,而 HashTable不允許key或者value為null骤竹;
    二者都實(shí)現(xiàn)Map接口;
    HashMap的put()方法中:if(key==null){return putForNullKey(value)}
    HashTable的put()方法中:if(value==null){throw new NullpointerException()}
    且下面還要調(diào)用key.hashCode()往毡;
    因此key蒙揣、value均不能為null;
  3. 采用Collection.sychronbizedMap(HashMap)开瞭,可實(shí)現(xiàn) HashMap同步懒震,達(dá)到HashTable的效果。

5. HashMap和ConcurrentHashMap的區(qū)別

  1. HashMap采用鏈?zhǔn)絟ash實(shí)現(xiàn):通過key的hashcode計(jì)算存在哪一個(gè)位置嗤详,不同的hashcode計(jì)算出相同的位置時(shí)个扰,在該位置以鏈表存儲(chǔ);
  2. HashMap擴(kuò)容問題:每次為原來的兩倍葱色,新建entry數(shù)組將原來的復(fù)制過來递宅,復(fù)制的過程中根基key的hashcode重新計(jì)算存儲(chǔ)位置;
    在數(shù)據(jù)量大時(shí)比較耗費(fèi)資源冬筒,所以在初始化時(shí)盡量選擇適當(dāng)?shù)闹担?/li>
  3. 解決地址沖突:
    保證每次擴(kuò)容都為2的n次方恐锣;
    負(fù)載因子取一個(gè)平衡值茅主;越大利用率越高舞痰,越容易沖突;
  4. ConcurrentHashMap:
    在多線程環(huán)境下诀姚,使用HashMap進(jìn)行put操作時(shí)存在丟失數(shù)據(jù)的情況响牛,為了避免這種bug的隱患,強(qiáng)烈建議使用ConcurrentHashMap代替HashMap赫段;
  • 1.7實(shí)現(xiàn):分段鎖呀打,提高并發(fā)編程效率;
    將一個(gè)segment數(shù)組分成一個(gè)個(gè)小的HashTable糯笙,每個(gè)segment對(duì)象就相當(dāng)于一個(gè)HashMap贬丛。一個(gè)線程鎖定一個(gè)段,而不是對(duì)整個(gè)map加鎖给涕;
  • 1.8實(shí)現(xiàn):放棄了Segment臃腫的設(shè)計(jì)豺憔,取而代之的是采用Node + CAS + Synchronized來保證并發(fā)安全進(jìn)行實(shí)現(xiàn);

6. TreeMap够庙、HashMap恭应、LinkedHashMap的區(qū)別

  1. TreeMap用紅黑樹實(shí)現(xiàn),查詢時(shí)間復(fù)雜度是 o(logn)耘眨;
    LinkedHashMap用哈希表加雙向循環(huán)列表實(shí)現(xiàn) 昼榛,通過key查詢value時(shí)間復(fù)雜度是o(1),解決TreeMap的不足剔难。
  2. LinkedHashMap可以通過設(shè)置accessOrder來確定是否使用LRU算法胆屿;
  3. LinkedHashMap實(shí)現(xiàn)原理:
    第一個(gè)entry的時(shí)候奥喻,賦值給head;以后每一個(gè)entry就和已經(jīng)建立好的循環(huán)鏈表加入自己莺掠,然后按照hashmap的規(guī)則存到數(shù)組中衫嵌。這樣查找和遍歷就相互分開了。

7. collection包結(jié)構(gòu)彻秆,與Collections的區(qū)別

  1. Collection叫類集楔绞,包含了:List、Set唇兑、Queue酒朵、BeanCOntext 4個(gè)結(jié)構(gòu)的接口;
    對(duì)List接口的標(biāo)準(zhǔn)實(shí)現(xiàn)有: abstractList扎附、Vector蔫耽、LinkedList、ArrayList留夜、copyOnnwriteArrayList匙铡;
    對(duì)Set的接口被AbstractSet實(shí)現(xiàn),其他標(biāo)準(zhǔn)實(shí)現(xiàn)繼承AbstractSet碍粥;有:hashSet鳖眼、copyonwriteArraySet、TreeSet嚼摩、ConcurrentSkipArraySet钦讳;
  2. collections是集合類的一個(gè)幫助類,提供了一系列靜態(tài)方法對(duì)集合進(jìn)行排序枕面,搜索線程安全等操作愿卒;
    (Collections.sort(),Collections.Copy()潮秘,Colections.sysnchronizedList()琼开,Collections.sysnchronizedMap()等)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枕荞,隨后出現(xiàn)的幾起案子柜候,更是在濱河造成了極大的恐慌,老刑警劉巖买猖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件改橘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡玉控,警方通過查閱死者的電腦和手機(jī)飞主,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碌识,你說我怎么就攤上這事碾篡。” “怎么了筏餐?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵开泽,是天一觀的道長。 經(jīng)常有香客問我魁瞪,道長穆律,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任导俘,我火速辦了婚禮峦耘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旅薄。我一直安慰自己辅髓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布少梁。 她就那樣靜靜地躺著洛口,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凯沪。 梳的紋絲不亂的頭發(fā)上第焰,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音著洼,去河邊找鬼樟遣。 笑死而叼,一個(gè)胖子當(dāng)著我的面吹牛身笤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葵陵,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼液荸,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了脱篙?” 一聲冷哼從身側(cè)響起娇钱,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绊困,沒想到半個(gè)月后文搂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秤朗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年煤蹭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硝皂,死狀恐怖常挚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稽物,我是刑警寧澤奄毡,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贝或,受9級(jí)特大地震影響吼过,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咪奖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一那先、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赡艰,春花似錦售淡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至料身,卻和暖如春汤纸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芹血。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工贮泞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幔烛。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓啃擦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饿悬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子令蛉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容