java集合

java里的集合(Collection)是java里面非常重要的一個概念货矮。剛開始看java數(shù)組的時候出于先入為主的影響责蝠,總是難免會以為是JS里面的Array,區(qū)別也就在于java里面的數(shù)組里的每一項都是單一類型的(畢竟是強類型語言)躲因。然而java里面的數(shù)組長度是不可變的棘伴,也就不可能出現(xiàn)JS里面類似push,shift等直接改變數(shù)組長度的操作了摩骨,可是前后端交互時我們通過ajax拿到的數(shù)據(jù)分明就是一個數(shù)組通贞,長度也不是固定的。沒錯恼五,實際上JS里面的數(shù)組在java里面更像是ArrayList昌罩,它繼承List,而List又繼承了本文的主角Collection灾馒。

什么是集合茎用,下面是java文檔的原文

A collections framework is a unified architecture for representing and > manipulating collections. All collections frameworks contain the following:

  • Interfaces: These are abstract data types that represent collections. Interfaces allow collections to be manipulated independently of the details of their representation. In object-oriented languages, interfaces generally form a hierarchy.
  • Implementations: These are the concrete implementations of the collection interfaces. In essence, they are reusable data structures.
  • Algorithms: These are the methods that perform useful computations, such as searching and sorting, on objects that implement collection interfaces. The algorithms are said to be polymorphic: that is, the same method can be used on many different implementations of the appropriate collection interface. In essence, algorithms are reusable functionality.

最核心的集合如下圖所示


Two interface trees, one starting with Collection and including Set, SortedSet, List, and Queue, and the other starting with Map and including SortedMap.

List

數(shù)組(Array)

在集合類中,List是最基礎(chǔ)的一種集合:它是一種有序列表睬罗。在數(shù)據(jù)結(jié)構(gòu)里面轨功,我們有兩種表示有序集合的結(jié)構(gòu)。

數(shù)組(Array)

數(shù)組是一種聚合數(shù)據(jù)類型容达,它是將具有相同類型的若干變量有序地組織在一起的集合古涧。數(shù)組可以說是最基本的數(shù)據(jù)結(jié)構(gòu),在各種編程語言中都有對應(yīng)花盐。一個數(shù)組可以分解為多個數(shù)組元素羡滑,按照數(shù)據(jù)元素的類型,數(shù)組可以分為整型數(shù)組算芯、字符型數(shù)組柒昏、浮點型數(shù)組、指針數(shù)組和結(jié)構(gòu)數(shù)組等也祠。數(shù)組還可以有一維昙楚、二維以及多維等表現(xiàn)形式。

鏈表( Linked List)

鏈表是一種數(shù)據(jù)元素按照鏈?zhǔn)酱鎯Y(jié)構(gòu)進行存儲的數(shù)據(jù)結(jié)構(gòu)诈嘿,這種存儲結(jié)構(gòu)具有在物理上存在非連續(xù)的特點堪旧。鏈表由一系列數(shù)據(jù)結(jié)點構(gòu)成削葱,每個數(shù)據(jù)結(jié)點包括數(shù)據(jù)域和指針域兩部分。其中淳梦,指針域保存了數(shù)據(jù)結(jié)構(gòu)中下一個元素存放的地址析砸。鏈表結(jié)構(gòu)中數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序來實現(xiàn)的。

java針對這兩種結(jié)構(gòu)實現(xiàn)了ArrayListLinkedList 爆袍,通過名字我們也很容易知道對應(yīng)的種類首繁,下面是主要的區(qū)別。

ArrayList LinkedList
獲取指定元素 速度很快 需要從頭開始查找元素
添加元素到末尾 速度很快 速度很快
在指定位置添加/刪除 需要移動元素 不需要移動元素
內(nèi)存占用 較大

在需要索引值來定位的地方使用ArrayList要更合理陨囊,所以實際開發(fā)中ArrayList使用的場合要比LinkedList多一些弦疮。
另外,要使用foreach的方式去遍歷

  for (String s : list) {
            System.out.println(s);
        }

如果采用下面的方法蜘醋,在遍歷非ArrayList的時候胁塞,索引越大,遍歷越慢压语。

        for (int i=0; i<list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }

Map

上面我們說了前后端交互的時候java一般會以ArrayList的結(jié)構(gòu)去返回值啸罢,那形如

{
    a:1,
    b:2
}

的結(jié)構(gòu)也就是Map 了,Map主要有三種實現(xiàn) HashMap, TreeMap, 和 LinkedHashMap胎食。

HashMap

性能最高的map扰才,由于采用的是散列(Hash)的數(shù)據(jù)結(jié)構(gòu),是用空間換時間的方式厕怜,效率高衩匣,但是不能保證順序。


image.png

我們可以看到遍歷的順序不能保證酣倾。

TreeMap

使用紅黑樹(red-black tree)的數(shù)據(jù)結(jié)構(gòu)儲存key舵揭,比hashmap要慢,在不自定義實現(xiàn)Comparable的情況下會以自然順序排序(類似1->2->3 a->b->c)

LinkedMap

內(nèi)部使用鏈表(linked list)的數(shù)據(jù)結(jié)構(gòu)儲存key躁锡,在不自定義實現(xiàn)Comparable的情況下會以元素添加的順序排序午绳。上面那個例子會以“apple”,“pear”映之,“banana”的順序返回拦焚。

Set

Map用于存儲key-value的映射,對于充當(dāng)key的對象杠输,是不能重復(fù)的赎败,并且,不但需要正確覆寫equals()方法蠢甲,還要正確覆寫hashCode()方法僵刮。

如果我們只需要存儲不重復(fù)的key,并不需要存儲映射的value,那么就可以使用Set搞糕。

Map類似勇吊,Set實現(xiàn)了HashSet, TreeSet, 和 LinkedHashSet,基本都是在對應(yīng)map類上的一些封裝窍仰,這里就不再贅述了汉规。


另外,js現(xiàn)在也有了Map和Set驹吮,mdn上的描述如下

Map 對象保存鍵值對针史,并且能夠記住鍵的原始插入順序。任何值(對象或者原始值) 都可以作為一個鍵或一個值碟狞。

Set對象是值的集合啄枕,你可以按照插入的順序迭代它的元素。 Set中的元素只會出現(xiàn)一次族沃,即 Set 中的元素是唯一的射亏。

相信看了上面的知識,會很容易就知道js Map和Set的數(shù)據(jù)結(jié)構(gòu)是哪一種了竭业。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市及舍,隨后出現(xiàn)的幾起案子未辆,更是在濱河造成了極大的恐慌,老刑警劉巖锯玛,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咐柜,死亡現(xiàn)場離奇詭異,居然都是意外死亡攘残,警方通過查閱死者的電腦和手機拙友,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歼郭,“玉大人遗契,你說我怎么就攤上這事〔≡” “怎么了牍蜂?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泰涂。 經(jīng)常有香客問我鲫竞,道長,這世上最難降的妖魔是什么逼蒙? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任从绘,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僵井。我一直安慰自己陕截,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布驹沿。 她就那樣靜靜地躺著艘策,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渊季。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天驯妄,我揣著相機與錄音青扔,去河邊找鬼。 笑死凛剥,一個胖子當(dāng)著我的面吹牛犁珠,可吹牛的內(nèi)容都是我干的犁享。 我是一名探鬼主播豹休,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼窑眯,長吁一口氣:“原來是場噩夢啊……” “哼磅甩!你這毒婦竟也來了卷要?” 一聲冷哼從身側(cè)響起僧叉,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隘道,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后激捏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體远舅,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暮刃。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖步势,靈堂內(nèi)的尸體忽然破棺而出坏瘩,到底是詐尸還是另有隱情,我是刑警寧澤柱锹,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布禁熏,位于F島的核電站瞧毙,受9級特大地震影響宙彪,放射性物質(zhì)發(fā)生泄漏您访。R本人自食惡果不足惜剪决,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一渗鬼、第九天 我趴在偏房一處隱蔽的房頂上張望差牛。 院中可真熱鬧偏化,春花似錦、人聲如沸镐侯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苟翻。三九已至韵卤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崇猫,已是汗流浹背沈条。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诅炉,地道東北人拍鲤。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓贴谎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親季稳。 傳聞我的和親對象是個殘疾皇子擅这,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355