集合与反射

devtools/2025/2/27 12:17:25/

一、集合体系

        集合一共分为两部分:Collection(单列集合)每个元素(数据)只包含一个值。

        Map(双列集合)每个元素包含两个值(键值对)。

二、ArrayList和LinkedList的区别

        数据结构:ArrayList基于动态数组实现,LinkedList基于双向链表实现。

        随机访问:ArrayList支持快速随机访问,时间复杂度为O(1);LinkedList随机访问效率低,时间复杂度为O(n)。

        插入和删除:在中间位置插入和删除元素时,ArrayList需要移动大量元素,时间复杂度为O(n);LinkedList只需修改指针,时间复杂度为O(1)。

        内存占用:ArrayList内存占用相对紧凑;LinkedList每个节点都需要额外的指针空间,内存占用较多。

三、让ArrayList变得线程安全

        使用Collections.synchronizedList()方法,将ArrayList转换为线程安全的列表。

        使用CopyOnWriteArrayList,它在修改操作时会创建一个新的底层数组,读操作不会被写操作阻塞。

四、HashMap的底层结构

        JDK 1.8之前,HashMap底层由数组和链表组成。JDK 1.8及之后,当链表长度超过阈值(默认为8)时,链表会转换为红黑树,以提高查找效率。

        底层数组的长度为16

        长度是2的幂次方:计算高效:在计算元素存储位置时,使用位运算(n - 1) & hash代替取模运算,提高计算效率。分布均匀:能使元素在数组中的分布更均匀,减少哈希冲突,提高查询性能。

五、线程安全的集合

  • Vector:通过在方法上添加synchronized关键字实现线程安全,所有对Vector的操作都是同步的。

  • Hashtable:与Vector类似,方法基本都被synchronized修饰。

  • ConcurrentHashMap:JDK 1.7使用分段锁,JDK 1.8使用CAS和synchronized

  • CopyOnWriteArrayList:写操作时复制数组,读操作无锁,读写分离。

六、快速失败机制 

        当多个线程对集合进行并发修改时,可能会抛出ConcurrentModificationException异常。Java集合在遍历过程中,通过记录集合的修改次数modCount,当遍历过程中发现modCount发生变化,就认为集合被其他线程修改了,从而抛出异常。

七、红黑树红黑规则

  1. 每一个节点或是红色的,或者是黑色的

  2. 根节点必须是黑色

  3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的

  4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)

  5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

八、红黑树与B+树的区别

        节点存储数据:B+树的非叶子节点只存储键,叶子节点存储键和数据;红黑树的每个节点都存储键和数据。

        查询效率:B+树的查询效率更稳定,所有数据都在叶子节点,查询时间复杂度为O(log n);红黑树查询时间复杂度也是O(log n),但可能需要遍历更多节点。

        应用场景:B+树常用于数据库索引等需要大量数据存储和高效范围查询的场景;红黑树常用于Java集合等需要快速插入、删除和查找的场景。

九、Stream流中的方法

        Stream流中间操作方法

方法名说明
Stream<T> filter(Predicate predicate)用于对流中的数据进行过滤
Stream<T> limit(long maxSize)返回此流中的元素组成的流,截取前指定参数个数的数据
Stream<T> skip(long n)跳过指定参数个数的数据,返回由该流的剩余元素组成的流
static <T> Stream<T> concat(Stream a, Stream b)合并a和b两个流为一个流
Stream<T> distinct()返回由该流的不同元素(根据Object.equals(Object) )组成

Stream流的终结方法

方法名说明
void forEach(Consumer action)对此流的每个元素执行操作
long count()返回此流中的元素数

收集方法

方法名说明
R collect(Collector collector)把结果收集到集合中

十、反射

        获取Class类对象的三种方式:

                类名.class属性

                对象名.getClass()方法

                Class.forName(全类名)方法

        应用场景:

                框架开发:Spring框架中通过反射实现依赖注入和AOP等功能。

                动态代理:在Java中,可通过反射创建动态代理类,为目标对象生成代理对象。

                对象的动态创建和操作:根据配置文件或用户输入动态创建对象。


http://www.ppmy.cn/devtools/163062.html

相关文章

Windows docker下载minio出现“Using default tag: latestError response from daemon”

Windows docker下载minio出现 Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded 此类情况&#xff0c;一般为镜像地址问题。 {"registry-mirrors": ["https://docker.re…

物联网综合实训室建设方案的探讨(职业院校物联网综合实训室建设方案)

随着物联网技术的迅猛发展&#xff0c;社会对物联网人才的需求日益增加。为了满足这一需求&#xff0c;高校和职业院校纷纷开始建设物联网综合实训室&#xff0c;以培养具备实际操作能力和创新思维的高素质物联网人才。本文旨在探讨一种行之有效的物联网综合实训室建设方案&…

HAProxy高级功能及配置

目录 1、HAProxy高级功能及配置 基于cookie的会话保持 配置选项 配置示例 验证cookie信息 HAProxy状态页 状态页配置项 启用状态页 登录状态页 backend server信息 利用状态页实现haproxy服务器的健康性检查 IP透传 layer 4 与 layer 7 四层负载 七层代理 四层…

网络空间安全(1)web应用程序的发展历程

前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷&#xff0c;从简单的文档共享系统到如今复杂、交互式、数据驱动的平台&#xff0c;经历了多个重要阶段。 一、起源与初期发展&#xff08;1989-1995年&#xff09; Web的诞生&#xff1a; 1989年&#xff0c;欧洲…

[特殊字符] 蓝桥杯 Java B 组 之最小生成树(Prim、Kruskal) 并查集应用

Day 3&#xff1a;最小生成树&#xff08;Prim、Kruskal&#xff09; & 并查集应用 &#x1f4d6; 一、最小生成树&#xff08;MST&#xff09;简介 最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09; 是一个 无向连通图 的 最小代价子图&#xff0c;它包含 …

图神经网络:拓扑数据分析的新时代

随着图数据的广泛应用,图神经网络(Graph Neural Network, GNN)作为一种强大的深度学习工具,逐渐成为机器学习领域中的一颗新星。图数据在许多现实世界问题中无处不在,诸如社交网络、交通网络、分子结构、推荐系统等都可以被建模为图结构。图神经网络通过直接处理图结构数据…

DeepSeek 15天指导手册——从入门到精通 PDF(附下载)

DeepSeek使用教程系列--DeepSeek 15天指导手册——从入门到精通pdf下载&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指导手册——从入门到精通》以系统化学习路径为核心&…

解决免费 PDF 发票打印痛点的实用工具

软件介绍 在单位工作时&#xff0c;常常会面临大量电子发票打印的任务&#xff0c;过程极为繁琐。每次打印&#xff0c;都得先打开 reader 阅读器&#xff0c;接着依次选择打印机、份数、纸张以及纸盒&#xff0c;步骤一个都不能少。要是碰上有清单页的发票&#xff0c;那上述…