《疯狂JAVA》读书笔记-第八章Java集合

本章要点:集合概述、Collection集合用法等

  1. 集合概述

    • 集合类又称容器类,用来盛装、保存其他数据

    • 数组元素可为基本类型和引用类型的值,但集合只能是引用类型的值

    • 主要有两个接口类派生:collection和map

    • collection是list、set和queue的父接口

    • lambda表达式遍历

      • `//使用lambda表达式遍历集合
        Collection collection = new ArrayList();
        collection.add(“php”);
        collection.add(“java”);
        collection.forEach(obj -> System.out.println(“集合元素” + obj));
        collection.forEach(obj -> {
        System.out.println("集合元素" + obj);
        System.out.println("集合元素" + obj);
        });`
    • Itaerator也是java集合框架的成员,和collection不同的是,Iterator隐藏了collection类底层的各种实现细节,提供遍历collection的统一接口。在使用Iterator遍历集合时,集合的元素不能改变,只有通过iterator.remove()删除上一次next的元素才可以。

      • `

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        //使用Iterator遍历
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
        String c = (String) iterator.next();
        System.out.println("iterator遍历集合元素" + c);
        if ("java".equals(c)) {
        iterator.remove();//删除上一next
        }
        // collection.add("c++");//不可改变元素,报错
        }
        System.out.println(collection);`
    • Predicate过滤符合filter条件的元素。函数式接口,应用例子:

      • `

        1
        2
        3
        4
        5
        6
        for (Object obj : collection) {
        System.out.println("predicate过滤" + predicateTest(obj, ele -> ((String) ele).equals("java")));
        }
        public static boolean predicateTest(Object o, Predicate p) {
        return p.test(o);
        }

        `

    • Set集合:无序,不可重复.EnumSet性能最好,其次HashSet

      • hashSet:按hash算法存储、无序、不是线程同步的、元素可以是null,通过hashcode+equals判断相等(当集合加入一个元素时,会调用对象的hashcode()方法,决定元素的存储位置)。
      • LinkedHashSet:本质还是hashset,只有用链表维护了元素的插入顺序。元素依然不能 重复
      • TreeSet:SortedSet接口的实现类型,红黑树结构存储,根据元素实际大小排序。
        • 是通过调用元素对象的compareTo()比较的,所以元素对象必须实现compare接口,不然当集合有两个元素时,会报错。
        • 元素必须是同一类的实例对象
        • 保证equals返回true时,compareTo也返回true,否则会当成两个对象
        • 注意包含可变对象的情况
      • EnumSet:有序(枚举值排序),不允许插入null,
    • List集合:有序、可重复

      • ArrayList:线程不安全,动态扩容数组空间(通过initialCapacity指定大小)
      • Vector:线程安全,动态扩容数组空间(通过initialCapacity指定大小)。比较古老jdk1.0就有
      • Arrays,ArrayList(固定长度的list),不可删除和添加
    • Queue集合:先进先出

      • PriorityQuue:根据元素大小排序,违反了先进先出。不允许null
      • DQueue接口和ArrayDqueue实现。双端队列,所以可以当队列,也可当栈使用。
      • LinkedList,是一种list集合,实现了Dqueue接口。可当栈使用。因为它内部存储是链表结构,随机访问性能较差,但是插入、删除较好。而ArrayList和ArrayDQueue是以数组结构存储,随机访问较好。
    • Map集合:key是set的集合(因此key不能重复,重复会覆盖),value类似list。

    • hashMap和Hashtable:和hashset一样,尽量不要使用可变对象作为key,不然访问的时候,如果对象变量了,就无法定位到map对象,也不能删除该改变key了(用了的话,就不要改变该对象)

      • hashMap:线程不安全,所以效率较高。key是判断hashcode和equals相等,而vale则是判断equals相等即可。key和value都可以为null
      • Hashtable:线程安全,比较古老。建议尽量别用,key是判断hashcode和equals相等,而vale则是判断equals相等即可,key和value都不可以为null
      • LinkedHashMap:和LinkedHaseSet一样,用链表维护插入时的顺序,所以性能比HashMap低。
      • SortedMap接口和TreeMap实现。和TreeSet一样,key必须是实现了comparable接口。对key比对排序。
    • 操作集合的工具类Collections

      • 排序
      • 查找、替换
      • 同步控制
      • 设置不可变集合
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2020 谭家俊
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

微信