Java 集合List,Set常用子類(lèi)簡(jiǎn)介

java集合框架


圖片網(wǎng)上一大堆遗座。

Collection接口

  • List接口
    ArrayList舀凛、LinkedList、Vector途蒋、Stack
  • Set接口
    HashSet猛遍、LinkedHashSet、TreeSet

Map接口

  • HashMap号坡、Hashtable懊烤、LinkedHashMap、TreeMap
Collection(因?yàn)榇_定大小的數(shù)組不能滿足動(dòng)態(tài)改變內(nèi)存分配大小的問(wèn)題宽堆,所以有集合)

Collection

    boolean add(E e) //向集合中添加一個(gè)元素腌紧,若添加元素后集合發(fā)生了變化就返回true,若沒(méi)有發(fā)生變化畜隶,就返回false壁肋。
    boolean addAll(Collection<? extends E> c) //添加給定集合c中的所有元素到該集合中
    void clear() //(optional operation).
    boolean contains(Object o) //判斷該集合中是否包含指定對(duì)象
    boolean containsAll(Collection<?> c)
    boolean equals(Object o)
    int hashCode()
    boolean isEmpty()//size==0?
    Iterator<E> iterator()
    boolean remove(Object o) //移除給定對(duì)象的一個(gè)實(shí)例(有的具體集合類(lèi)型允許重復(fù)元素)
    boolean removeAll(Collection<?> c) //移除元素集合c
    boolean retainAll(Collection<?> c) //僅保留給定集合c中的元素
    int size()
    Object[] toArray()
    <T> T[] toArray(T[] a)

代碼列舉

    public class Demo {
        public static void main(String[] args) {
            Collection datas = new LinkedList();//可以不像數(shù)組那樣指定大小
            datas.add("aaa");//添加元素
            System.out.println(datas.add("bbb"));//true
            if (!datas.contains("ccc")) {
                datas.add("ccc");
            }
            ///////////////////////////////////////////
            Collection datas1 = new ArrayList();
            datas1.add("aaa");
            datas1.add("bbb");
            //判斷子集合中的所有對(duì)象是否存在
            if (datas.containsAll(datas1)) {//true
                System.out.println("datas包含datas1");//輸出
            }
            Collection datas3 = new ArrayList(10);
            datas3.add("eee");
            datas3.add("fff");
            datas3.add("ggg");
            datas.addAll(datas3);
            //////////////////////////////////////////
            System.out.println(datas);//[aaa, bbb, ccc, eee, fff, ggg]
            System.out.println(datas.size());//6   
            datas.remove("ccc");
            datas.retainAll(datas3);
            System.out.println(datas);//[eee, fff, ggg]
            datas.clear();
            System.out.println(datas.size());//0    
            Iterator iterator = datas1.iterator();//迭代器
            while (iterator.hasNext()) {
                System.out.println(iterator.next());//輸出datas1中所有元素
            }
        }
    }

List(存儲(chǔ)對(duì)象有序,可以包含重復(fù)元素)

  • 方法相比Collection多了如下:

      E get(int var1);//返回指定下標(biāo)的元素
    
      E set(int var1, E var2);//修改指定下標(biāo)的值
    
      void add(int var1, E var2);//在指定位置添加元素
    
      int indexOf(Object var1);//返回指定元素的下標(biāo)
    
      int lastIndexOf(Object var1);//返回指定元素的最后一個(gè)的下標(biāo)
    
      ListIterator<E> listIterator();//迭代器
    
      List<E> subList(int var1, int var2);//鏈表截取
    
代碼例舉:
    /**
     * List
     */
    public class Demo {
        public static void main(String[] args) {
            List list1 = new ArrayList();
            list1.add("aaa");
            list1.add("bbb");
            list1.add("ccc");
            list1.add("ddd");
            list1.add("eee");
            list1.add("fff");
            list1.add("ggg");
            System.out.println(list1.get(4));//eee
            System.out.println(list1);//[aaa, bbb, ccc, ddd, eee, fff, ggg]
            list1.set(2, "eee");
            list1.add(3, "zzz");//指定位置添加元素
            System.out.println(list1);//[aaa, bbb, eee, zzz, ddd, eee, fff, ggg]
            System.out.println(list1.indexOf("eee"));//2
            System.out.println(list1.lastIndexOf("eee"));//5
            System.out.println(list1.subList(2, 4));//返回[2,4)左右開(kāi)的元素//[eee, zzz]
        }
    }

ArrayList(底層數(shù)組實(shí)現(xiàn)(查詢快籽慢,增刪慢))

  • 當(dāng)容量不夠的時(shí)候添加的容量是當(dāng)前的1.5倍

  • Vector基本用法和ArrayList一樣浸遗,區(qū)別是線程安全(基本不用)

  • 底層數(shù)組實(shí)現(xiàn)(查詢快,增刪慢)

      /**
       * ArrayList 基本用法同上
       */
      public class Demo {
    
          public static void main(String[] args) {
              ArrayList<String> list1 = new ArrayList<String>();
              list1.add("aaa");
              list1.add("bbb");
              list1.add("ccc");
              list1.add("ddd");
              list1.add("eee");
              list1.add("fff");
              list1.add("ggg");
              //錯(cuò)誤寫(xiě)法
              /*
              for (String s : list1) {
                  list1.remove(s);//Exception in thread "main" java.util.ConcurrentModificationException
              }*/
              Iterator<String> iterator = list1.iterator();
              //錯(cuò)誤寫(xiě)法
             /* while (iterator.hasNext()) {
                  iterator.remove();//Exception in thread "main" java.lang.IllegalStateException
              }*/
              //正確寫(xiě)法
              while (iterator.hasNext()) {
                  iterator.next();
                  iterator.remove();
              }
              System.out.println(list1);
          }
      }
    

ArrayList源碼剖析

LinkedList(用鏈表實(shí)現(xiàn)(增刪快箱亿,查詢慢))

    void addFirst(E element);
    void addLast(E element);
    E getFirst();
    E getLast();
    E removeFirst();
    E removeLast();
    boolean add(E e) //把元素e添加到鏈表末尾
    void add(int index, E element) //在指定索引處添加元素

都可以從字面上了解它的方法含義跛锌。

Set(存儲(chǔ)元素?zé)o序届惋,不能有重復(fù)元素)

HashSet

    /**
     * Set
     * 存儲(chǔ)對(duì)象無(wú)序察净,并且唯一
     * 如何判斷對(duì)象的唯一性:根據(jù)Object提供的 int hashCode()和boolean equals(Object obj)方法
     * 唯一性的過(guò)程:  先調(diào)用對(duì)象的hashCode()方法驾茴,如果哈希值不相同,則直接添加到集合中氢卡,
     * 若哈希值相同锈至,則會(huì)調(diào)用eqauls()方法判斷內(nèi)容是否相同,若返回false译秦,則表示內(nèi)容不同峡捡,
     * 那么將其添加到集合中,反之筑悴,返回true時(shí)们拙,則不添加到集合中
     */
    public class Demo {  
        public static void main(String[] args) {
            Set set = new HashSet();
            set.add("aaa");//添加的時(shí)候就判斷唯一性
            set.add("bbb");
            set.add("ccc");
            set.add("aaa");
            set.add("ddd");
            set.add("aacca");
            set.add("aaa");
            System.out.println(set);//[aaa, ccc, bbb, ddd, aacca]
            Boolean b = false;
            //注:hashCode()相同時(shí),并不一定代表是同一類(lèi)型的對(duì)象
            System.out.println(b.hashCode() + "," + new Integer(1237).hashCode());
        }
    }

TreeSet(比HashSet多了一個(gè)排序功能)

    /**
     * TreeSet:  數(shù)據(jù)結(jié)構(gòu)是黑紅二叉樹(shù)阁吝,保存數(shù)據(jù)的唯一性同HashSet砚婆,同時(shí)增加的對(duì)象必須是可排序的
     * <p>
     * 排序方式:
     * 1、 增加的對(duì)象類(lèi)突勇,實(shí)現(xiàn)Comparable接口
     * 2装盯、 創(chuàng)建比較器,需要?jiǎng)?chuàng)建類(lèi)甲馋,并實(shí)現(xiàn)Comparator接口
     */
    public class Demo {
        public static void main(String[] args) {   
            TreeSet treeSet = new TreeSet();
            //添加對(duì)象時(shí)埂奈,先確保對(duì)象的唯一性,再調(diào)用String.compareTo(Object obj)比較大小
            //默認(rèn)排序方式:從小到大排序(依字符的ASCII碼值或字符串長(zhǎng)度)
            treeSet.add("aaa");
            treeSet.add("ccc");
            treeSet.add("bbb");
            treeSet.add("aaa");
            treeSet.add("eee");
            Iterator iterator = treeSet.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
            System.out.println(treeSet);//[aaa, bbb, ccc, eee]
        }
    }

TreeSet添加的元素必須實(shí)現(xiàn)Comparable接口

    /**
     * 實(shí)現(xiàn)Comparable接口
     */
    public class Demo {
        public static void main(String[] args) {
            //方法一
            TreeSet<Person> treeSet = new TreeSet();
            treeSet.add(new Person("111"));
            treeSet.add(new Person("444"));
            treeSet.add(new Person("111"));
            treeSet.add(new Person("222"));
            treeSet.add(new Person("333"));       
            System.out.println(treeSet);//[111, 222, 333, 444]
            //////////////////////////
            //方法二
            TreeSet<Animal> treeSet1 = new TreeSet(new MyCompartor());
            treeSet1.add(new Animal(111));
            treeSet1.add(new Animal(444));
            treeSet1.add(new Animal(111));
            treeSet1.add(new Animal(222));
            treeSet1.add(new Animal(333));
            System.out.println(treeSet1);//[111, 222, 333, 444]
        }
        //方法一
        static class Person implements Comparable {
            private String name;
            public Person(String name) {
                this.name = name;
            }  
            @Override
            public int compareTo(Object o) {
                return this.name.compareTo(((Person) o).name);
            }
            @Override
            public String toString() {
                return this.name;
            }
        }
        //方法二
        static class Animal {
            private int age;
            public Animal(int age) {
                this.age = age;
            }
            @Override
            public String toString() {
                return this.age + "";
            }
        }
        static class MyCompartor implements Comparator<Animal> {
            @Override
            public int compare(Animal animal, Animal t1) {
                return animal.age - t1.age;
            }
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末定躏,一起剝皮案震驚了整個(gè)濱河市账磺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痊远,老刑警劉巖垮抗,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碧聪,居然都是意外死亡冒版,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)矾削,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)壤玫,“玉大人豁护,你說(shuō)我怎么就攤上這事哼凯。” “怎么了楚里?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵断部,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我班缎,道長(zhǎng)蝴光,這世上最難降的妖魔是什么她渴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蔑祟,結(jié)果婚禮上趁耗,老公的妹妹穿的比我還像新娘。我一直安慰自己疆虚,他們只是感情好苛败,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著径簿,像睡著了一般罢屈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上篇亭,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天缠捌,我揣著相機(jī)與錄音,去河邊找鬼译蒂。 笑死曼月,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹂随。 我是一名探鬼主播十嘿,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼岳锁!你這毒婦竟也來(lái)了绩衷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤激率,失蹤者是張志新(化名)和其女友劉穎咳燕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乒躺,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡招盲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘉冒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曹货。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讳推,靈堂內(nèi)的尸體忽然破棺而出顶籽,到底是詐尸還是另有隱情,我是刑警寧澤银觅,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布礼饱,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏镊绪。R本人自食惡果不足惜匀伏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝴韭。 院中可真熱鬧够颠,春花似錦、人聲如沸榄鉴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牢硅。三九已至蹬耘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間减余,已是汗流浹背综苔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留位岔,地道東北人如筛。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抒抬,于是被迫代替她去往敵國(guó)和親杨刨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法擦剑,類(lèi)相關(guān)的語(yǔ)法妖胀,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法惠勒,異常的語(yǔ)法赚抡,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • Map(映射,存儲(chǔ)的是“鍵-值”映射表纠屋,“鍵”是不能重復(fù)的) 如果鍵重復(fù)涂臣,則相當(dāng)于修改對(duì)應(yīng)鍵的值。 Map接口定義...
    向日花開(kāi)閱讀 6,190評(píng)論 0 3
  • Java集合框架結(jié)構(gòu)圖完整版 在完整版的結(jié)構(gòu)圖中Collection集合和Map下有許多未實(shí)現(xiàn)的抽象類(lèi)(Ab...
    LizGbus8閱讀 870評(píng)論 0 3
  • 一、基本數(shù)據(jù)類(lèi)型 注釋 單行注釋?zhuān)?/ 區(qū)域注釋?zhuān)?* */ 文檔注釋?zhuān)?** */ 數(shù)值 對(duì)于byte類(lèi)型而言...
    龍貓小爺閱讀 4,257評(píng)論 0 16
  • “三言”诊沪、“二拍”是指明代五本著名傳奇小說(shuō)集的合稱(chēng)影兽,2015年1月中國(guó)畫(huà)報(bào)出版社再次出版了此集,包括馮夢(mèng)龍創(chuàng)作的《...
    夏西凌閱讀 754評(píng)論 0 2