• java集合框架


    java集合框架

    本期内容
    集合类图

    在这里插入图片描述

    List集合
    • 特点:元素有序,且可重复

    • 遍历:下标,foreach,迭代器

    扩容:
    • 初始容量10,负载因子0.5,扩容增量0.5倍
    • 新容量 = 原容量 + 原容量 * 0.5 , 如 ArrayList的容量为10,一次扩容后是容量为15
    实现:
    ArrayList

    ​ 简单数据结构,超出容量自动扩容,动态数组
    ​ 内部实现是基于基础的对象数组的
    ​ 随机访问快
    ​ 不适合随机增加或删除
    ​ 线程不安全

    LinkedList

    ​ LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部
    ​ 线程不安全
    ​ LinkedList可被用作堆栈(stack)【包括了push,pop方法】,队列(queue)或双向队列(deque)
    ​ 以双向链表实现,链表无容量限制,允许元素为null,线程不安全
    ​ 适合做随机的增加或删除

    Vector

    ​ 线程安全
    但行性能慢,不建议使用

    CopyOnWriteArrayList

    ​ 写时复制
    ​ 线程安全
    ​ 适合于读多,写少的场景
    ​ 写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array
    ​ 比Vector性能高
    ​ 最终一致性
    ​ 实现了List接口,使用方式与ArrayList类似

    ArrayList remove 的注意点
    列举:
    • ​ 数据准备:为方便演示,需要有紧挨在一起的两个或多个相同的元素
      List<Integer> list=new ArrayList<Integer>();
      list.add(1);
      list.add(2);
      list.add(3);
      list.add(3);
      list.add(4);
    
    for(int i=0;i<list.size();i++){
       if(list.get(i)==3) list.remove(i);//当他删除之后 我们的另一个三就会挤上去  所以输出的是                                              [1,2,3,4]
    }
    可以删除 为啥?
     下标变了 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Set

    特点:

    无序,不重复

    思考:

    如果对List容器中的元素去重?上方有操作

    遍历:

    foreach,迭代器
    扩容:

    初始容量16,负载因子0.75,扩容增量1倍
    实现:

    ​ HashSet

    • ​ 它存储唯一元素并允许空值

    • ​ 依据对象的hashcode来确定该元素是否存在

    • ​ 由HashMap支持

    • ​ 不保持插入顺序

    • ​ 非线程安全

    • ​ 性能参数:初始容量,负载因子

    • ​ 默认值: 初始容量16,负载因子0.75

      ​ 示例:new HashSet<>(20, 0.5f);

    TreeSet

    ​ 是一个包含有序的且没有重复元素的集合
    ​ 作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
    ​ TreeSet是基于TreeMap实现的

    Map
    特点:

    ​ 无序,键值对,键不能重复,值可以重复,
    ​ 键重复则覆盖,没有继承Collection接口
    ​ 扩容:初始容量16,负载因子0.75,扩容增量1倍

    遍历:

    ​ 先获取所有键的Set集合,再遍历(通过键获取值)
    ​ 取出保存所有Entry的Set,再遍历此Set即可

    实现:
    HashMap

    ​ 线程不安全,最常用,速度快
    ​ 内部采用数组来存放数据
    ​ 基本原理

    put执行过程 图:

    在这里插入图片描述

    ​ Table数组中的的Node

    • 链表结构示意图:

    在这里插入图片描述

    • 红黑树结构示意图:

    在这里插入图片描述

    ​ 流程图中绿色标出的部分为JDK8新增的处理逻辑,目的是在Table[i]中的Node节点数量大于8时,通过红黑树提升查找速度。


    HashTable:

    ​ 线程安全,不太常用

    ConcurrentHashMap:

    ​ 线程安全,比HashTable性能高

    TreeMap:

    ​ key值按一定的顺序排序
    ​ 添加或获取元素时性能较HashMap慢
    ​ 因为需求维护内部的红黑树,用于保证key值的顺序

    LinkedHashMap:
    		继承HashMap
    			LinkedHashMap是有序的,且默认为插入顺序
    				当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMapMap<String, String> linkedHashMap = new LinkedHashMap<>();
                 linkedHashMap.put("name1", "josan1");
                 linkedHashMap.put("name2", "josan2");
                 linkedHashMap.put("name3", "josan3");
                 Set<Entry<String, String>> set = linkedHashMap.entrySet();
                 Iterator<Entry<String, String>> iterator = set.iterator();
                  while(iterator.hasNext()) {
                Entry entry = iterator.next();
                String key = (String) entry.getKey();
                String value = (String) entry.getValue();
                System.out.println("key:" + key + ",value:" + value);
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    排序:

    ​ java.lang.Comparable
    ​ java.util.Comparator

    工具类:
    Collections

    ​ 提供一组静态方法操作集合

    Arrays

    ​ 提供一组静态方法操作数组

    jdk8:stream
    介绍
    jdk8添加的一个新的功能,称之为流,可以以声明的方式来处理数据,提供一种对 Java 集合运算的方便处理方式

    ​ 让程序员写出高效率、干净、简洁的代码

    特点

    ​ 可以方便的对集合进行并行操作,便于使用多核资源
    ​ 惰性求值
    ​ 不是数据结构,不保存数据
    ​ 不会修改原来的数据源,将操作后的数据保存到另一个对象中

    操作
    中间操作(Intermediate)

    ​ map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 skip、 parallel、 sequential、 unordered

    最终操作(Terminal)

    ​ forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、iterator

    特点:

    ​ 在一次聚合操作中,可以有多个Intermediate,但是有且只有一个Terminal

    ⭐⭐⭐⭐⭐本期类容到此结束⭐⭐⭐⭐⭐
  • 相关阅读:
    【JavaScript】JS开发中五个常用功能/案例(41-45)(牛客题解)
    电脑有机械硬盘和固态硬盘,如何切换系统启动盘?
    nio 文件传输
    文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题
    秒杀系统的设计与实现思路
    SpringBoot SpringBoot 基础篇 1 快速上手SpringBoot 1.7 入门案例解析【starter】
    maven依赖管理
    端到端的基于深度学习的网络入侵检测方法
    YOLOv7训练:_pickle.UnpicklingError: STACK_GLOBAL requires str
    【贪心训练】挑剔的美食家
  • 原文地址:https://blog.csdn.net/qq_63130170/article/details/125486047