• Java学习----集合1


    今日学习内容总结如下:

    几种Set的比较

    HashSet:不保证元素的添加顺序,底层采用哈希表算法,查询效率高。判断两个元素是否相等equals方法返回为true要求hashCode值必须相等。即要求存入HashSet中的元素要覆盖equals方法和hashCode方法

    LinkedHashSet是HashSet的子类,底层采用了哈希表算法以及链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于HashSet

    TreeSet不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用红-黑树算法,树结构比较适合查询,但是添加的效率较低

    各种Set集合性能分析

    HashSet和TreeSet是Set集合中用得最多的集合。HashSet总是比TreeSet集合性能好,因为HashSet不需要额维护元素的顺序。

    LinkedHashSet需要用额外的链表维护元素的插入顺序,因此在插入时性能比HashSet低,但在迭代访问(遍历)时性能更高。因为插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素。

    EnumSet元素是所有Set元素中性能最好的,但是它只能保存枚举类型的元素。

    相关的集合计算

    addAll将指定集合中的所有元素都添加到此集合中,如果在进行此操作的同时修改了指定的集合,那么将不能保证操作的正确性

    removeAll从指定的集合中移除包含在另一个集合中的元素,返回值为boolean,如果包含了要移除的对象则返回true否则false

    retainAll仅仅保留集合中同时包含在指定集合的对象,其它的全部移除

    containsAll用来查看在该集合中是否存在在指定集合中的所有对象,返回true表示存在,否则false

    Collection和Collections的区别

    Arrays工具类,是针对数组的帮助类,提供一系列静态方法实现对各种数组的搜索、排序等操作
             sort排序  binarySearch折半查找  fill填充数据  copyOf拷贝数组 hashCode获取一个数组的hash值
             toString将数组转换为友好显示的字符串

    List asList(T... a)  将不确定个数的参数转换为List

    asList方法返回的并不是java.util.ArrayList,而是Arrays内部类

    private static class ArrayList
                     extends AbstractList
                        implements RandomAccess, java.io.Serializable

    属性:private final E[] a;  用于存储数据,一旦Arrays.ArrayList构建完毕,则长度不可变

    List提供了方法toArray将List转换为数组

    Collection是java.util下的接口,它是各种集合的父接口,继承于它的接口主要有Set和List

    Collections是个java.util下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

    Collections.sort(list);针对集合进行原地排序

    具体实现 list.sort(null);

    在List接口中针对sort方法提供了默认实现

    1. @SuppressWarnings({"unchecked", "rawtypes"})
    2. default void sort(Comparatorsuper E> c) {
    3. Object[] a = this.toArray();
    4. Arrays.sort(a, (Comparator) c); //针对数组使用Arrays.sort进行排序,在Arrays.sort中可以针对数组的规模在快排等多种排序算法中自动选择
    5. ListIterator i = this.listIterator();
    6. for (Object e : a) {
    7. i.next();
    8. i.set((E) e);
    9. }
    10. }

    Collections.binarySearch(list, 7)使用折半查找对应的元素,可以返回在list中的下标

    线程安全化

    ArrayList和LinkedList线程不安全,针对线程安全的需求一般也不建议使用Vector。
            
            synchronizedXxx
            
            List list=Collections.synchronizedList(new ArrayList<>());
            
            具体实现是在原来数据操作的基础上添加了一个全局锁

    Objects工具类

    Objects类是Final的,即不可以被其他类继承,并且它里面的方法都是static的

    equals方法的功能是判断两个对象     是否是同一个对象, 或者两个对象是否相等。重点是处理了比较对象为null

    deepEquals就比较严格一点,首先它比较两个对象是否是同一个对象;如果不是,再判断它们是否是矩阵,对于矩阵的每个元素,它们是否是同一个对象;最后调用对象的equals方法

    hashCode(Object)是计算单个对象的hashCode,这里处理了null,hashCode(Object...)是计算矩阵的hashCode

    toString方法是一个加强版的toString,多了一个null处理

    requireNonNull判断非null  requireNonNull(Object) 如果obj为null,则异常NullPointerException

    isNull对象是否为Null,nonNull判断对象是否非null,不抛异常

    List接口的新方法

    获取一个不可变的集合,其中的元素不允许修改,只能读取,具体实现类为ListN
        List list = List.of(10,12,30,5,56,47);  //ImmutableCollections 

  • 相关阅读:
    R语言编写一个研究多重共线性的小程序(1)
    嵌入式处理趋势,第一部分:超集成MCU
    如何编写一个投票功能的智能合约
    安卓相关基础知识整理
    python系列26:numpy稀疏矩阵笔记
    【附源码】计算机毕业设计JAVA中小学教务管理平台
    uni-app项目由hbuilder项目转化为cli项目
    pcdn链路聚合怎么在爱快上实现
    java家教信息计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    Python标准库
  • 原文地址:https://blog.csdn.net/hanxuya/article/details/126611134