List、Set左胞、數(shù)據(jù)結(jié)構(gòu)寇仓、Collections

學(xué)習(xí)目標(biāo)

  • 能夠說(shuō)出常見(jiàn)得數(shù)據(jù)結(jié)構(gòu)有哪些及其特點(diǎn)
  • 能夠說(shuō)出數(shù)組結(jié)構(gòu)特點(diǎn)
  • 能夠說(shuō)出棧結(jié)構(gòu)特點(diǎn)
  • 能夠說(shuō)出數(shù)組結(jié)構(gòu)特點(diǎn)
  • 能夠說(shuō)出單向鏈表結(jié)構(gòu)特點(diǎn)
  • 能夠說(shuō)出紅黑樹特點(diǎn)
  • 能夠說(shuō)出list集合特點(diǎn)
  • 能夠說(shuō)出Set集合的特點(diǎn)
  • 能夠說(shuō)出哈希表的特點(diǎn)
  • 使用HashSet集合存儲(chǔ)自定義元素
  • 能夠說(shuō)出可變參數(shù)的格式
  • 能夠使用集合工具類
  • 能夠使用Comparator比較器進(jìn)行排序

1.棧結(jié)構(gòu)特點(diǎn)

又稱堆棧,它是運(yùn)算受限得線性表烤宙,只允許一端進(jìn)行插入和刪除(只有一個(gè)口遍烦,先進(jìn)后出,類似彈夾)

2.隊(duì)列結(jié)構(gòu)特點(diǎn)

隊(duì)列只允許一端插入一端刪除(兩個(gè)口躺枕,先進(jìn)先出乳愉,類似安檢)

3.數(shù)組結(jié)構(gòu)特點(diǎn)

數(shù)組,在內(nèi)存中開辟一段連續(xù)的內(nèi)存空間屯远。特點(diǎn)是查詢快蔓姚,增刪慢。原因是查詢數(shù)組中長(zhǎng)度固定并連續(xù)慨丐,知道開頭位置和偏移量就能知道元素具體地址坡脐;增刪慢是因?yàn)樾枰匦聞?chuàng)建新數(shù)組,復(fù)制刪除或增加的其他元素到新數(shù)組中房揭,在指定位置進(jìn)行添加和刪除操作备闲。

image

4.鏈表結(jié)構(gòu)特點(diǎn)

鏈表,查詢慢捅暴,增刪快恬砂。因?yàn)殒湵淼刂贩沁B續(xù),必須重頭開始查詢蓬痒,當(dāng)增加/刪除元素對(duì)鏈表結(jié)構(gòu)沒(méi)有影響泻骤,所以增刪快。

  • 單向列表:鏈表中只有一個(gè)鏈子梧奢,不能保證元素順序

  • 雙向列表:鏈表中有兩條鏈子狱掂,專門紀(jì)錄元素順序,是一個(gè)有序集合亲轨。

    image

    image

5.紅黑樹特點(diǎn)

紅黑樹趋惨,趨近于平衡樹,查詢得速度非车胛茫快器虾,查詢?nèi)~子節(jié)點(diǎn)最大次數(shù)和最小次數(shù)不能超過(guò)2倍

image

6.list接口特點(diǎn)

list讯嫂,是一個(gè)存取有序得集合,允許出現(xiàn)重復(fù)元素兆沙,可以通過(guò)索引訪問(wèn)指定元素端姚。

public void add(int index, E element) : 將指定的元素,添加到該集合中的指定位置上挤悉。
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素巫湘。
public E set(int index, E element) :用指定元素替換集合中指定位置的元素,返回值的更新前的元素装悲。
  • ArrayList集合 底層是一個(gè)數(shù)組結(jié)構(gòu),查詢快尚氛,增刪慢诀诊。
  • LinkedList集合 底層是鏈表結(jié)構(gòu),查詢慢阅嘶,增刪快属瓣。
public void addFirst(E e) :將指定元素插入此列表的開頭。
public void addLast(E e) :將指定元素添加到此列表的結(jié)尾讯柔。
public E getFirst() :返回此列表的第一個(gè)元素抡蛙。
public E getLast() :返回此列表的最后一個(gè)元素。
public E removeFirst() :移除并返回此列表的第一個(gè)元素魂迄。
public E removeLast() :移除并返回此列表的最后一個(gè)元素粗截。
public E pop() :從此列表所表示的堆棧處彈出一個(gè)元素。
public void push(E e) :將元素推入此列表所表示的堆棧捣炬。
public boolean isEmpty() :如果列表不包含元素熊昌,則返回true。
  • Vector集合單線程集合

7.Set接口的特點(diǎn)

無(wú)序集合湿酸,不允許重復(fù)元素婿屹。沒(méi)有索引,沒(méi)有帶索引得方法推溃,不能for循環(huán)遍歷

  • HashSet是 Set 接口的一個(gè)實(shí)現(xiàn)類昂利,不允許重復(fù)元素,存取順序可能不一致铁坎。
  • hash值:是一個(gè)十進(jìn)制整數(shù)页眯,系統(tǒng)隨機(jī)給出(是邏輯地址,不是真實(shí)得存儲(chǔ)物理地址)

HashSet存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)(哈希表)厢呵,jdk>=1.8 哈希表=數(shù)組+紅黑樹 窝撵,jdk<1.8 哈希表=數(shù)組+鏈表。

1.Hashset存儲(chǔ)數(shù)據(jù)步驟:

  • 第一步襟铭,開辟數(shù)組空間碌奉,先計(jì)算元素得hash值
  • 第二步短曾,不同哈希值放在數(shù)組空間內(nèi),相同hash值形成鏈表(紅黑樹)==【當(dāng)鏈表長(zhǎng)度超過(guò)8位赐劣,會(huì)把鏈表轉(zhuǎn)成紅黑樹】==

2.set元素不允許存儲(chǔ)重復(fù)元素原理

set元素在調(diào)用add()方法時(shí)嫉拐,add()方法會(huì)調(diào)用元素得hashcode方法和equals方法,判斷是否重復(fù)魁兼。


image

3.HashSet存儲(chǔ)自定義類型元素

需求:同名同年齡婉徘,視為同一個(gè)人,只能存儲(chǔ)一次咐汞。

回答:重寫equals()和hashCode()方法盖呼。

代碼如下:

public class Student { 

    private String name; 
    private int age;
    public Student() {}
     public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    
}


 public class HashSetDemo2 {
        public static void main(String[] args) {
            //創(chuàng)建集合對(duì)象 該集合中存儲(chǔ) Student類型對(duì)象
            HashSet<Student> stuSet = new HashSet<Student>();
            //存儲(chǔ) 
            Student stu = new Student("于謙", 43);
            stuSet.add(stu);
            stuSet.add(new Student("郭德綱", 44));
            stuSet.add(new Student("于謙", 43));
            stuSet.add(new Student("郭麒麟", 23));
            stuSet.add(stu);
            for (Student stu2 : stuSet) {
            System.out.println(stu2);
            }
        }
    }
    
    執(zhí)行結(jié)果:
    Student [name=郭德綱, age=44]
    Student [name=于謙, age=43] 
    Student [name=郭麒麟, age=23]

4.LinkedHashSet集合特點(diǎn)

繼承Hashset集合,不重復(fù),底層是哈希表(數(shù)組+鏈表/紅黑樹)+鏈表(紀(jì)錄元素得存儲(chǔ)位置),保證元素有序化撕。

5.可變參數(shù)

jdk1.5之后出現(xiàn)的新特性几晤,方法類型已知,個(gè)數(shù)未知.(數(shù)據(jù)類型 ...),其原理底層是一個(gè)數(shù)組植阴,根據(jù)傳遞參數(shù)不同蟹瘾,創(chuàng)建不同長(zhǎng)度數(shù)組來(lái)存儲(chǔ)參數(shù)個(gè)數(shù)。

8.Collections集合工具類

public static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素掠手。
public static void shuffle(List<?> list) 打亂順序 :打亂集合順序憾朴。
public static <T> void sort(List<T> list) :將集合中元素按照默認(rèn)規(guī)則排序。
public static <T> void sort(List<T> list喷鸽,Comparator<? super T> ) :將集合中元素按照指定規(guī)則排 序伊脓。

1.Comparator比較器

public static <T> void sort(List<T> list) :將集合中元素按照默認(rèn)規(guī)則排序。

  Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.charAt(0) ‐o1.charAt(0);
            }
        });
        
  public class Student implements Comparable<Student> {

        @Override
        public int compareTo(Student o) {
            return this.age‐o.age;//升序 } }
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魁衙,一起剝皮案震驚了整個(gè)濱河市报腔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剖淀,老刑警劉巖纯蛾,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纵隔,居然都是意外死亡翻诉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門捌刮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碰煌,“玉大人唤反,你說(shuō)我怎么就攤上這事验夯。” “怎么了帝牡?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵俄认,是天一觀的道長(zhǎng)个少。 經(jīng)常有香客問(wèn)我洪乍,道長(zhǎng),這世上最難降的妖魔是什么夜焦? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任壳澳,我火速辦了婚禮,結(jié)果婚禮上茫经,老公的妹妹穿的比我還像新娘巷波。我一直安慰自己,他們只是感情好卸伞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布抹镊。 她就那樣靜靜地躺著,像睡著了一般瞪慧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上部念,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天弃酌,我揣著相機(jī)與錄音,去河邊找鬼儡炼。 笑死妓湘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乌询。 我是一名探鬼主播榜贴,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼妹田!你這毒婦竟也來(lái)了唬党?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鬼佣,失蹤者是張志新(化名)和其女友劉穎驶拱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晶衷,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓝纲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晌纫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片税迷。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锹漱,靈堂內(nèi)的尸體忽然破棺而出箭养,到底是詐尸還是另有隱情,我是刑警寧澤哥牍,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布露懒,位于F島的核電站闯冷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏懈词。R本人自食惡果不足惜蛇耀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坎弯。 院中可真熱鬧纺涤,春花似錦、人聲如沸抠忘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)崎脉。三九已至拧咳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間囚灼,已是汗流浹背骆膝。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灶体,地道東北人阅签。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蝎抽,于是被迫代替她去往敵國(guó)和親政钟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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