List

List

有序集合泊愧,可以精確控制列表中每個(gè)元素的插入位置伊磺。通過整數(shù)索引獲取列表中的元素。List允許出現(xiàn)重復(fù)的值 删咱, 并可以精確控制列表中每個(gè)元素的插入位置屑埋,通過整數(shù)索引獲取列表中的元素。

方法名 說明
add(E e) 增加單個(gè)數(shù)據(jù)
addAll(Collection<? extends E> c) 將一個(gè) Collection 集合的數(shù)據(jù)添加到現(xiàn)在的集合中
remove(Object o) 刪除指定的元素
contains(Object o) 判斷集合是否包含指定的元素
size() 得到集合的數(shù)據(jù)總數(shù)
isEmpty() 判斷集合是否有數(shù)據(jù)
get(int index) 通過索引獲取對(duì)應(yīng)的數(shù)據(jù)元素
set(int index, E element) 通過索引和新的元素替換原有內(nèi)容
clear() 清空數(shù)據(jù)
toArray() 將List轉(zhuǎn)為對(duì)象數(shù)組

ArrayList

ArrayList 是List 接口的大小可變數(shù)組的實(shí)現(xiàn)痰滋。實(shí)現(xiàn)了所有可選列表操作摘能, 并允許包括null 在內(nèi)的所有元素续崖。除了實(shí)現(xiàn)List 接口外, 此類還提供一些方法來操作內(nèi)部用來存儲(chǔ)列表的數(shù)組的大型鸥恪( 此類大致上等同于 vector 類严望, 但 vector 是同步的) 。

ArrayList 的底層是使用數(shù)組實(shí)現(xiàn)的逻恐,看下面的圖

image-20200212171434134.png

可以看到像吻,數(shù)組中的每一個(gè)元素,都存儲(chǔ)在內(nèi)存單元中复隆,并且元素之間緊密排列萧豆,既不能打亂元素的存儲(chǔ)順序,也不能跳過某個(gè)存儲(chǔ)單元進(jìn)行存儲(chǔ)昏名。

ArrayList 底層既然是使用數(shù)組實(shí)現(xiàn)涮雷,那么特點(diǎn)就和數(shù)組一致:查詢速度快,增刪速度慢轻局。

每個(gè)ArrayList 實(shí)例都有一個(gè)容量洪鸭。該容量是指用來存儲(chǔ)列表元素的數(shù)組的大小, 它總是至少等于列表的大小仑扑。隨著向Array L ist 中小斷添加元素览爵, 其容量也自動(dòng)增長。并未指定增長策略的細(xì)節(jié)镇饮,因?yàn)檫@不只是添加元素會(huì)帶來分?jǐn)偣潭〞r(shí)間開銷那樣簡單蜓竹。我們可以使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建容量為 10 的列表, 也可以初始化指定容量大小储藐。

ArrayList 指定初始容量大小的構(gòu)造器方法

public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
    }
}

常用的操作


public static void main(String[] args) {

    ArrayList<Integer> list = new ArrayList<>();

    //  添加數(shù)據(jù)
    list.add(123);
    list.add(346);

    //  替換數(shù)據(jù)
    list.set(1, 777);

    //  將list中的所有數(shù)據(jù)放到 list2 中
    List<Integer> list2 = new ArrayList<>();
    list2.addAll( list );

    //  循環(huán)list2中所有的數(shù)據(jù)
    for (Integer integer : list2) {

        System.out.println( integer );

        //  刪除循環(huán)出的對(duì)象
        list2.remove(integer);
    }

    //  list 集合是否有數(shù)據(jù)
    if( !list.isEmpty() ) {

        System.out.println("list.size = "+ list.size());

        //  清空 list
        list.clear();
    }

    //  在清空list后俱济,再看list現(xiàn)在有多少數(shù)據(jù)
    System.out.println("list.size = "+ list.size());
}

LinkedList

LinkedList 是一個(gè)鏈表結(jié)構(gòu),可當(dāng)作堆棧钙勃、隊(duì)列蛛碌、雙端隊(duì)列 。鏈表是一種在物理上非連續(xù)辖源、非順序的數(shù)據(jù)結(jié)構(gòu)蔚携,由若干節(jié)點(diǎn)(node)所組成。

單鏈表

image-20200212173413313.png

單向鏈表的每一個(gè)節(jié)點(diǎn)包含兩部分克饶,一部分是存放數(shù)據(jù)的變量data酝蜒,另一部分是指向下一個(gè)節(jié)點(diǎn)的指針next。正如地下黨的聯(lián)絡(luò)方式矾湃,一級(jí)一級(jí)亡脑,單線傳遞:

private static class Node {
    int data;
    Node next;
}

雙鏈表

雙向鏈表比單向鏈表稍微復(fù)雜一些,它的每一個(gè)節(jié)點(diǎn)除了擁有data和next指針,還擁有指向前置節(jié)點(diǎn)的prev指針


image-20200212173517719.png

和數(shù)組不同远豺,鏈表存儲(chǔ)數(shù)據(jù)的時(shí)候奈偏,則采用了見縫插針的方式,鏈表的每一個(gè)節(jié)點(diǎn)分布在內(nèi)存的不同位置躯护,依靠next指針關(guān)聯(lián)起來惊来。這樣可以靈活有效地利用零散的碎片空間。

image-20200212173548104.png

LinkedList 做數(shù)據(jù)的添加和刪除操作時(shí)速度很快棺滞,但是做查詢的時(shí)候速度就很慢裁蚁,這和 ArrayList 剛好相反。

適用 LinkedList 獨(dú)有的方法继准,在集合前后做數(shù)據(jù)插入

public static void main(String[] args) {

    LinkedList<Integer> list = new LinkedList<>();

    list.add(123);
    //  添加相同的數(shù)據(jù)
    list.add(123);
    list.add(456);
    list.add(789);
    list.add(101);

    //  將數(shù)據(jù) 111 添加到 list 的末尾
    list.addLast(111);
    //  將數(shù)據(jù) 999 添加到 list的最前面
    list.addFirst(999);

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

}

注意代碼中聲明和實(shí)現(xiàn)都是 LinkedList 枉证, 如果聲明的是 List 接口 , addFirst 和 addLast 方法是不可見的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末移必,一起剝皮案震驚了整個(gè)濱河市室谚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌崔泵,老刑警劉巖秒赤,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異憎瘸,居然都是意外死亡入篮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門幌甘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潮售,“玉大人,你說我怎么就攤上這事锅风∷址蹋” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵遏弱,是天一觀的道長盆均。 經(jīng)常有香客問我塞弊,道長柠辞,這世上最難降的妖魔是什么谴轮? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上详瑞,老公的妹妹穿的比我還像新娘。我一直安慰自己满钟,他們只是感情好咙崎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眯勾,像睡著了一般枣宫。 火紅的嫁衣襯著肌膚如雪婆誓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天也颤,我揣著相機(jī)與錄音洋幻,去河邊找鬼。 笑死翅娶,一個(gè)胖子當(dāng)著我的面吹牛文留,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播竭沫,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼燥翅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜕提?” 一聲冷哼從身側(cè)響起森书,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谎势,沒想到半個(gè)月后拄氯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡它浅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年译柏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姐霍。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鄙麦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镊折,到底是詐尸還是另有隱情胯府,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布恨胚,位于F島的核電站骂因,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赃泡。R本人自食惡果不足惜寒波,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望升熊。 院中可真熱鬧俄烁,春花似錦、人聲如沸级野。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辰企,卻和暖如春风纠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牢贸。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工议忽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人十减。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓栈幸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帮辟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子速址,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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