Java 集合List,Set常用子类简介

java集合框架


图片网上一大堆。

Collection接口

  • List接口
    ArrayList、LinkedList、Vector、Stack
  • Set接口
    HashSet、LinkedHashSet、TreeSet

Map接口

  • HashMap、Hashtable、LinkedHashMap、TreeMap
Collection(因为确定大小的数组不能满足动态改变内存分配大小的问题,所以有集合)

Collection

    boolean add(E e) //向集合中添加一个元素,若添加元素后集合发生了变化就返回true,若没有发生变化,就返回false。
    boolean addAll(Collection<? extends E> c) //添加给定集合c中的所有元素到该集合中
    void clear() //(optional operation).
    boolean contains(Object o) //判断该集合中是否包含指定对象
    boolean containsAll(Collection<?> c)
    boolean equals(Object o)
    int hashCode()
    boolean isEmpty()//size==0?
    Iterator<E> iterator()
    boolean remove(Object o) //移除给定对象的一个实例(有的具体集合类型允许重复元素)
    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();//可以不像数组那样指定大小
            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");
            //判断子集合中的所有对象是否存在
            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(存储对象有序,可以包含重复元素)

  • 方法相比Collection多了如下:

      E get(int var1);//返回指定下标的元素
    
      E set(int var1, E var2);//修改指定下标的值
    
      void add(int var1, E var2);//在指定位置添加元素
    
      int indexOf(Object var1);//返回指定元素的下标
    
      int lastIndexOf(Object var1);//返回指定元素的最后一个的下标
    
      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)左右开的元素//[eee, zzz]
        }
    }

ArrayList(底层数组实现(查询快,增删慢))

  • 当容量不够的时候添加的容量是当前的1.5倍

  • Vector基本用法和ArrayList一样,区别是线程安全(基本不用)

  • 底层数组实现(查询快,增删慢)

      /**
       * 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");
              //错误写法
              /*
              for (String s : list1) {
                  list1.remove(s);//Exception in thread "main" java.util.ConcurrentModificationException
              }*/
              Iterator<String> iterator = list1.iterator();
              //错误写法
             /* while (iterator.hasNext()) {
                  iterator.remove();//Exception in thread "main" java.lang.IllegalStateException
              }*/
              //正确写法
              while (iterator.hasNext()) {
                  iterator.next();
                  iterator.remove();
              }
              System.out.println(list1);
          }
      }
    

ArrayList源码剖析

LinkedList(用链表实现(增删快,查询慢))

    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(存储元素无序,不能有重复元素)

HashSet

    /**
     * Set
     * 存储对象无序,并且唯一
     * 如何判断对象的唯一性:根据Object提供的 int hashCode()和boolean equals(Object obj)方法
     * 唯一性的过程:  先调用对象的hashCode()方法,如果哈希值不相同,则直接添加到集合中,
     * 若哈希值相同,则会调用eqauls()方法判断内容是否相同,若返回false,则表示内容不同,
     * 那么将其添加到集合中,反之,返回true时,则不添加到集合中
     */
    public class Demo {  
        public static void main(String[] args) {
            Set set = new HashSet();
            set.add("aaa");//添加的时候就判断唯一性
            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()相同时,并不一定代表是同一类型的对象
            System.out.println(b.hashCode() + "," + new Integer(1237).hashCode());
        }
    }

TreeSet(比HashSet多了一个排序功能)

    /**
     * TreeSet:  数据结构是黑红二叉树,保存数据的唯一性同HashSet,同时增加的对象必须是可排序的
     * <p>
     * 排序方式:
     * 1、 增加的对象类,实现Comparable接口
     * 2、 创建比较器,需要创建类,并实现Comparator接口
     */
    public class Demo {
        public static void main(String[] args) {   
            TreeSet treeSet = new TreeSet();
            //添加对象时,先确保对象的唯一性,再调用String.compareTo(Object obj)比较大小
            //默认排序方式:从小到大排序(依字符的ASCII码值或字符串长度)
            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添加的元素必须实现Comparable接口

    /**
     * 实现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;
            }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容