集合框架

Collection接口

  • Collection接口是最基本的容器接口,继承至Iterable接口,允许元素重复,可以无序,无下标

  • 方法

    • boolean add(Object obj) //添加一个对象。
    • boolean addAll(Collection c) //将一个集合中的所有对象添加到此集合中。
    • void clear() //清空此集合中的所有对象。
    • boolean contains(Object o) //检查此集合中是否包含o对象
    • boolean equals(Object o) //比较此集合是否与指定对象相等。
    • boolean isEmpty() //判断此集合是否为空
    • boolean remove(Object o) //在此集合中移除o对象
    • int size() //返回此集合中的元素个数。
    • Object[] toArray() //将此集合转换成数组。
  • 迭代器

    • //Iterator

      • Iterator iterator = collection.iterator();
    •     //迭代器: 是一种专门用来遍历集合元素的一种方法
      
    •     //hasNext(); 有下一个元素 返回true
      
    •     //next(); 取下一个元素
      
    •     //remove(); 删除元素
      
    • 注意事项:

      • //删除
      •         //必须使用迭代器的删除方法
        
      •         //iterator.remove();
        
      •         //集合删除方法 :ConcurrentModificationException
        
      •         //迭代过程中不能使用集合的删除方法,否则会出现并发修改异常
        
      •         //collection.remove(o);
        
  • List接口

    • 特点:有序、有下标、元素可以重复。

    • 方法:

      • • void add(int index, Object o) //在index位置插入对象o。
      • • boolean addAll(int index, Collection c) //将一个集合中的元素添加到此集合中的 index位置。
      • • Object get(int index) //返回集合中指定位置的元素。
      • • List subList(int fromIndex, int toIndex) //返回fromIndex和toIndex之间的集合元 素。
    • ArrayList

      • 底层的数据结构使用的是数组结构,有序,有下标,可以重复,查询很快,但增删较慢,线程不安全
        ArrayList的查找遍历比较快,插入和删除相对较慢,因为使用本地方法优化,并不一定比LinkedList慢

      • 源码分析

          • (1) 调用无参构造方法创建ArrayList集合,长度是0
          • (2) Object[] elementData 储存元素个数 size初始为0
          • (3) 当添加第一个元素时,容量扩容为10 每次扩容大小都是1.5倍
          • (4) remove 方法使用System.arrayCopy实现移动,效率高
          • (5) 迭代器中有一个cursor,获取一个元素侯,cursor+1,如果cursor == size,不能获取
    • LinkedList

      • 底层的数据结构是双向链表结构,有序,有下标,可以重复LinkedList的插入和删除比较快,查找遍历比较慢

      • 源码分析

          • (1)构造没有任何操作,属性size=0,first头节点 last最后一个节点
          • (2)静态内部类Node 包含三个属性 item 数据 next下一个元素 prev上一个元素
          • (3)add方法 每添加一个元素都会形成一个节点 first属性指向第一个元素,last指向后一个元素
          • 每一个节点都有前驱和后继(重点)
    • 列表迭代器

      • //列表迭代器
      •     ListIterator listIterator = linkedListist.listIterator();
        
      •     while (listIterator.hasNext()) {
        
      •         System.out.println(listIterator.next());
        
      •     }
        
      •     while (listIterator.hasPrevious()) {
        
      •         System.out.println(listIterator.previous());
        
      •     }
        
    • Vector

      • 底层是数组数据结构,查询快、增删慢,JDK1.0版本,运行效率慢、线程安全。

      • 遍历

        •     //枚举器
          
        •     Enumeration elements = vector.elements();
          
        •     while (elements.hasMoreElements()) {
          
        •         System.out.println(elements.nextElement());
          
        •     }
          
  • Set接口

    • 特点: 无序、无下标、元素不可重复。

    • 最多只能包含一个null元素

    • 方法: 全部继承自Collection中的方法。

    • HashSet类

      • 底层实现是基于HashMap、不保证Set的迭代顺序、不保证该顺序永久不变

      • 存储结构: 哈希表

        • hashtable 本质 数组+链表
        • JDK1.7 (数组+链表) (链表头插入) 可以并存 并且数组连续
        • JDK1.8 (数组+链表+红黑树)
        • 打印对象的原始hashcode System.out.println(System.identityHashCode(student1));
      • 存储重复依据:hashCode和equals 方法

      • 存储过程:

        • (1)根据hashCode计算存储位置,如果此位置没有元素,则添加
        • (2)如果此位置有元素,在比较equals,如果equals相同,则拒绝添加否则形成链表添加
    • LinkedHashSet

      • 链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序。
      • 存储结构: 哈希表
    • TreeSet

      • 特点:

        • (1) 无序 没有下标 不能重复
        • (2) 对元素进行排序
      • 存储结构: 红黑树

      • 重复依据: Comparable 接口中compareTo(),如果comparTo方法返回0,重复元素拒绝添加

      • 基于排列顺序实现元素不重复。(二叉排序树)

      • 实现了SortedSet接口,对集合元素自动排序。

      • 元素对象的类型必须实现Comparable接口,指定排序规则。

      • 通过CompareTo方法确定是否为重复元素。

  • 数据结构

      • 是一种先进后出的数据结构

      • Stack类:继承Vector类

      • push方法入栈、pop方法出栈

        • //入栈 压栈
        • stack.push(“王五”);
        •     //出栈
          
        •     int count = stack.size();
          
        •     for (int i = 0; i < count; i++) {
          
        •         System.out.println(stack.pop());
          
        •     }
          
      • LinkedList也实现了栈结构

    • 队列

      • 是一种先进先出的数据结构

      • Queue接口:继承Collection接口

      • offer方法入队、pop方法出队

        • //进队
        •     queue.offer("桃子");
          
        •     //出队
          
        •     int count = queue.size();
          
        •     for (int i = 0; i < count; i++) {
          
        •         System.out.println(queue.poll());
          
        •     }
          
      • LinkedList实现了Queue接口

    • 二叉排序树

      • 又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一 般情况下,查询效率比链表结构要高。

      • 特点:

        • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
        • 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
        • 左、右子树也分别为二叉排序树;
        • 没有键值相等的结点。
      • 代码

        • 中序遍历
  • 注意事项:

    • 不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。

Map接口

  • Map父接口

    • 特点:

      • 称为“映射”,用于存储任意键值对(Key-Value)
      • 键:无下标、不可以重复(唯一)
      • 值:无下标、可以重复
    • 方法:

      • V put(K key,V value) //将对象存入到集合中,关联键值。key重复则覆盖原值。
      • Object get(Object key) //根据键获取对应的值。
      • Set keySet()//返回所有key。
      • Collection values() //返回包含所有值的Collection集合。
      • Set<Map.Entry<K,V>> entrySet() //键值匹配的Set集合。
  • HashMap类

    • 基于哈希表的Map接口实现,利用哈希算法根据hashCode()来配置存储地址

    • JDK1.2版本,线程不安全,运行效率快 ;允许用null 作为key或是value。

    • 储存结构: 哈希表

      • JDK1.7 数组 + 链表
      • JDK1.8 数组 + 链表 + 红黑树
    • 存储重复依据:hashCode和equals 方法

    • 存储过程:

      • (1)根据hashCode计算存储位置,如果此位置没有元素,则添加
      • (2)如果此位置有元素,在比较equals,如果equals相同,则拒绝添加否则形成链表添加
    • HashMap源码分析

      • • HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量 调整为16。
      • • 当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是 减少调整元素的个数。
      • • jdk1.8 当每个链表长度大于8,并且数组元素个数大于等于64时,会调整为红黑树,目 的提高执行效率。
      • • jdk1.8 当链表长度小于等于6时,调整成链表。
      • • jdk1.8以前,链表是头插入,jdk1.8以后是尾插入。
  • LinkedHashMap

    • 链表实现的HashMap,按照链表进行存储,即可保留元素的插入顺序。
    • 存储结构: 哈希表
  • Hashtable

    • JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value。
  • Properties

    • Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。

    • 属性集合:

      • (1)存储的是属性名和属性值
      • (2)只能存储String key valus字符串
      • (3)没有泛型
      • (4)和IO流有关
  • TreeMap类

    • 基于红黑树(Red-Black tree)的NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者 根据创建映射时提供的Comparator 进行排序,具体取决于使用的构造方法
    • 实现了SortedMap接口(Map的子接口),可以对key自动排序,Key需实现 Comparable接口。
  • SortedMap接口

    • 进一步提供关于键的总体排序 的 Map

辅助工具类

  • Collections

    • 提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作

    • 方法

      • Collections.max(arrayList)最大值
      • Collections.reverse(arrayList)翻转
      • Collections.shuffle(arrayList)打乱
      • Collections.binarySearch(arrayList, 47)二分查找
      • Collections.sort(arrayList)倒序
      • Collections.frequency(arrayList, 10)查找元素出现的个数
      • Collections.copy(arrayList1, arrayList);复制
  • Arrays类

  • Comparable

    • Comparable用作默认的比较方式,实现了该接口的类之间可以相互进行比较,这个对象组成的集合就可以直接通过sort()进行排序了
  • Comparator比较器

    • Comparator是设计模式中策略模式的一种应用
    • 可以实现定制比较,元素自身提供的比较规则称为自然排序。
    • compare(o1,o2),如果返回值为0,则为重复元素。
    • 使用Comparator比较器,元素类型可不实现Comparable接口,并且优先级高于 Comparable接口。
    • 实现字符串按照长度排序,如果长度相同,按照编码顺序。

数组和集合的转换

  • 数组转成集合

    • List integers = Arrays.asList(nums);
    • add和remove方法不能使用会出现UnsupportedOperationException不支持操作异常
  • 集合变成数组

    • 注意点: 数组要给初始值

    • 步骤

      • ArrayList stringArrayList = new ArrayList<>();
      •     stringArrayList.add("上海");
        
      •     stringArrayList.add("北京");
        
      •     String[] strings = stringArrayList.toArray(new String[0]);
        

在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页