当前位置: 首页 > news >正文

CopyOnWriteArraySet怎么用

在这里插入图片描述

简介

CopyOnWriteArraySet是一个线程安全的无序集合,它基于“写时复制”的思想实现。它继承自AbstractSet,可以将其理解成线程安全的HashSet。

CopyOnWriteArraySet在读取操作比较频繁、写入操作相对较少的情况下可以提高程序的性能和可靠性。它的线程安全机制和CopyOnWriteArrayList一样,是通过volatile和互斥锁实现的。

在这里插入图片描述

应用场景

CopyOnWriteArraySet的应用场景主要是在并发编程中,特别是那些需要高并发的场景。它适用于数据量较小且读多写少的场景,例如,一个Web应用程序中的用户状态信息,这是一个读取操作远多于写入操作的典型场景。

它的线程安全机制避免了在迭代过程中其他线程对集合的修改操作引发的并发冲突,使得在迭代过程中可以安全地进行读取操作。然而,由于CopyOnWriteArraySet的写时复制机制,它可能存在一些性能开销,因此,如果需要频繁的写入操作,可能不适合使用CopyOnWriteArraySet。

总的来说,CopyOnWriteArraySet适合用在读多写少、对数据一致性要求不高、对线程安全性要求高的场景。

在这里插入图片描述

性能问题

CopyOnWriteArraySet的性能问题主要集中在以下几个方面:

  1. 写操作的开销 :由于CopyOnWriteArraySet采用的是写时复制的策略,每次写操作都需要复制一份底层数组,这会导致写操作的开销比较大。如果写操作比较频繁,可能会影响程序的性能。
  2. 内存占用 :由于每次写操作都需要复制一份底层数组,这会导致内存占用比较高。如果集合中的元素数量比较大,可能会导致内存溢出的问题。
  3. 迭代器的性能 :由于CopyOnWriteArraySet的迭代器是基于底层数组的快照实现的,如果在迭代过程中底层数组发生变化,迭代器不会反映这些变化。这可能会导致迭代器的性能不稳定,甚至引发并发问题。

针对以上问题,可以考虑以下优化策略:

  1. 使用其他线程安全集合类 :如果写操作比较频繁,可以考虑使用其他线程安全集合类,如ConcurrentHashMap或ConcurrentSkipListSet等。这些集合类采用了不同的同步策略,可以更好地支持并发访问。
  2. 控制集合的大小 :如果集合中的元素数量比较大,可以考虑控制集合的大小,避免内存溢出的问题。例如,可以设置集合的最大容量,当元素数量超过最大容量时进行清理或压缩操作。
  3. 减少迭代操作 :如果迭代操作比较频繁,可以考虑减少迭代操作的次数或使用其他方式来访问集合中的元素。例如,可以使用流(Stream) API 来处理集合中的元素,避免使用迭代器。

需要注意的是,在选择和优化线程安全集合类时需要根据具体的应用场景和需求进行权衡和选择。

在这里插入图片描述

源码解析

CopyOnWriteArraySet的源码实现相对比较简单,主要基于CopyOnWriteArrayList实现。以下是对CopyOnWriteArraySet源码的简单讲解:

public class CopyOnWriteArraySet<E> extends AbstractSet<E> {private final List<E> array;public CopyOnWriteArraySet() {this.array = new CopyOnWriteArrayList<>();}@Overridepublic boolean add(E e) {return array.add(e);}@Overridepublic boolean remove(Object o) {return array.remove(o);}@Overridepublic boolean contains(Object o) {return array.contains(o);}@Overridepublic int size() {return array.size();}@Overridepublic Iterator<E> iterator() {return new COWIterator<>(array.listIterator());}
}

在CopyOnWriteArraySet中,所有的操作都是通过调用CopyOnWriteArrayList的实现来完成的。CopyOnWriteArrayList的实现细节可以参考之前对CopyOnWriteArrayList的讲解。其中,COWIterator是一个简单的迭代器实现,用于包装ListIterator并确保线程安全。在迭代过程中,COWIterator会持有一个快照,不允许修改操作。

在这里插入图片描述

扩容机制

CopyOnWriteArraySet的扩容机制是基于CopyOnWriteArrayList实现的。当集合的元素数量超过当前数组的容量时,会创建一个新的数组,然后将原数组中的元素复制到新数组中。这个过程是线程安全的,因为整个复制过程是一个原子操作。

具体的扩容过程如下:

  1. 当集合的元素数量超过当前数组的容量时,会创建一个新的数组,大小是原数组的两倍。
  2. 然后将原数组中的元素复制到新数组中,每个元素复制的顺序是按照它们在原数组中的顺序。
  3. 复制完成后,将原数组清空,并将新数组赋值给集合的内部数组。

这种扩容机制的优点是可以在多线程环境下实现高效的并发访问,因为复制操作是一个原子操作,不会受到其他线程的干扰。同时,由于每次扩容时都会创建一个新的数组,因此可以避免因为元素插入导致的数组重新排列的开销。但是,由于每次扩容都需要创建一个新的数组并复制元素,所以如果集合中的元素数量非常大,扩容过程可能会比较耗时。

与CopyOnWriteArrayList的区别

CopyOnWriteArraySet和CopyOnWriteArrayList都是基于“写时复制”的思想实现的线程安全的数据结构,适用于读多写少的场景。它们的主要区别在于:

  1. 数据结构:CopyOnWriteArraySet是Set,而CopyOnWriteArrayList是List。因此,CopyOnWriteArraySet不允许存放重复值,而CopyOnWriteArrayList可以。
  2. 存储方式:CopyOnWriteArraySet内部持有一个CopyOnWriteArrayList引用,所有的操作都是由CopyOnWriteArrayList来实现的。它是无序的,不允许存放重复值。
  3. 迭代器行为:CopyOnWriteArraySet的迭代器使用了“快照”技术,存储了内部数组快照,不支持remove、set、add操作,但通过迭代器进行并发读取时效率很高。这是与CopyOnWriteArrayList的主要区别。

两者都是线程安全的数据结构,适用于读多写少的场景。主要区别在于数据结构、存储方式和迭代器行为。

代码示例

在多线程环境下,可以使用CopyOnWriteArraySet来保证线程安全。以下是一个简单的示例:

import java.util.concurrent.CopyOnWriteArraySet;public class Example {private static CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<>();public static void main(String[] args) {new Thread(() -> {for (int i = 0; i < 5000; i++) {set.add("a" + System.currentTimeMillis());}}).start();new Thread(() -> {for (int i = 0; i < 5000; i++) {set.add("b" + System.currentTimeMillis());}}).start();}
}

在这个示例中,我们创建了一个CopyOnWriteArraySet,并启动了两个线程,每个线程都向集合中添加元素。由于CopyOnWriteArraySet是线程安全的,因此在迭代过程中,其他线程对集合的修改操作不会引发并发冲突。

在这里插入图片描述

拓展

  • 线程安全集合类
    除了CopyOnWriteArraySet和CopyOnWriteArrayList,Java中还有其他一些线程安全的集合类,包括:
  1. ConcurrentHashMap:线程安全的Map实现,使用分段锁技术实现并发访问。
  2. ConcurrentSkipListMap:基于跳表(Skip List)实现的线程安全Map,具有较高的并发性能。
  3. ConcurrentLinkedQueue:基于链接节点的线程安全队列,支持高效的并发访问。
  4. ConcurrentSkipListSet:基于跳表(Skip List)实现的线程安全Set,具有较高的并发性能。

这些线程安全集合类的使用方法和普通的集合类类似,但它们能够在多线程环境下提供更好的并发性能和数据安全性。

  • CopyOnWriteArrayList讲解
    快点我呀✋🏻

  • 更多集合

ConcurrentLinkedDeque详解-Deque接口链表实现方案

ArrayDeque详解-Deque接口数组实现方案

LinkedList详解-Deque接口链表实现方案

Java中Deque接口方法解析

相关文章:

CopyOnWriteArraySet怎么用

简介 CopyOnWriteArraySet是一个线程安全的无序集合&#xff0c;它基于“写时复制”的思想实现。它继承自AbstractSet&#xff0c;可以将其理解成线程安全的HashSet。 CopyOnWriteArraySet在读取操作比较频繁、写入操作相对较少的情况下可以提高程序的性能和可靠性。它的线程…...

uniapp得app云打包问题

获取appid&#xff0c;具体可以查看详情 也可以配置图标&#xff0c;获取直接生成即可 发行 打包配置 自有证书测试使用时候不需要使用 编译打包 最后找到安装包apk安装到手机 打包前&#xff0c;图片命名使用要非中文&#xff0c;否则无法打包成功会报错...

Linux bin包生成

需求背景&#xff1a; 在实际项目时我们很少把源码用个tar给到客户&#xff0c;这样显得很不专业&#xff0c;且有的时候我们提供补丁&#xff0c;那么这个时候我们提供一个补丁的bin包可以直接安装运行就显得很高大上了。 物料准备 准备一台liunx&#xff0c;虚拟机亦可&am…...

Java多人聊天

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…...

自动驾驶:传感器初始标定

手眼标定 机器人手眼标定AxxB&#xff08;eye to hand和eye in hand&#xff09;及平面九点法标定 Ax xB问题求解&#xff0c;旋转和平移分步求解法 手眼标定AXXB求解方法&#xff08;文献总结&#xff09; 基于靶的方法 相机标定 (1) ApriTag (2) 棋盘格&#xff1a;cv::f…...

如何将 MySQL 数据库转换为 SQL Server

本文解释了为什么组织希望将其 MySQL 数据库转换为 Microsoft SQL 数据库。本文接着详细介绍了尝试转换之前需要记住的事项以及所涉及的方法。专业的数据库转换器工具将帮助您快速将 MySQL 数据库记录转换为 MS SQL Server。 在继续之前&#xff0c;我们先讨论一下 MySQL 到 M…...

【开源】基于Vue+SpringBoot的河南软件客服系统

文末获取源码&#xff0c;项目编号&#xff1a; S 067 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S067。} 文末获取源码&#xff0c;项目编号&#xff1a;S067。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、…...

《算法面试宝典》--深度学习常见问题汇总

第三章 深度学习基础 3.1 基本概念 3.1.1 神经网络组成? 神经网络类型众多,其中最为重要的是多层感知机。为了详细地描述神经网络,我们先从最简单的神经网络说起。 感知机 多层感知机中的特征神经元模型称为感知机,由Frank Rosenblatt于1957年发明。 其中 x 1 x_1 x...

【计算机网络实验】实验三 IP网络规划与路由设计(头歌)

目录 一、知识点 二、实验任务 三、头歌测试 一、知识点 IP子网掩码的两种表示方法 32位IP子网掩码&#xff0c;特点是从高位开始连续都是1&#xff0c;后面是连续的0&#xff0c;它有以下两种表示方法&#xff1a; 传统表示法&#xff0c;如&#xff1a;255.255.255.0IP前…...

CodeBlocks添加头文件,解决fatal error: ui.h No such file or directory

问题描述 在使用codeblocks工具进行LVGL仿真过程中报错&#xff0c;找不到头文件 原因分析&#xff1a; 没有将头文件加入编辑器搜索的目录中&#xff0c;编译时找不到头文件。 解决方案&#xff1a; 将要包含的头文件的目录加进去就可以了...

鸿蒙开发:UIAbility组件与UI的数据同步-使用EventHub进行数据通信【鸿蒙专栏-21】

文章目录 ArkTS应用模型中UIAbility组件与UI的数据同步使用EventHub进行数据通信使用globalThis进行数据同步1. UIAbility和Page之间使用globalThis2. UIAbility和UIAbility之间使用globalThis3. 使用globalThis的注意事项4. 使用globalThis的注意事项同名对象覆盖导致问题的场…...

云架构的思考3--云上开发

目录 1 DevOps--简单灵活性高2 服务化&#xff08;微服务&#xff09;--弹性&#xff08;可扩展&#xff09;、按需自主服务3 无状态&#xff08;Serverless&#xff09;--弹性&#xff08;可扩展&#xff09;4 日志--安全5 配置中心--安全6 设计模式6.1 使用“适配器模式”调用…...

vue3日常知识点学习归纳

1&#xff0c;父子组件传递&#xff1a; 父组件传递参数 <template><div><!-- 子组件 参数&#xff1a;num 、nums --><child :num"nums.num" :doubleNum"nums.doubleNum" increase"handleIncrease"></child>&l…...

策略模式终极解决方案之策略机

我们在开发时经常会遇到一堆的if else …, 或者switch, 比如我们常见的全局异常处理等, 像类似这种很多if else 或者多场景模式下, 策略模式是非常受欢迎的一种设计模式, 然而, 一个好的策略模式却不是那么容易写出来. 我在工作中也因为写烦了switch,if else 觉得很不优雅, 因…...

linux 常用指令目录大纲

Linux下的Signal信号处理及详解&#xff0c;test ok-CSDN博客 Linux下怎样判断一个binary是否可以debug//test ok_感知算法工程师的博客-CSDN博客 linux file命令的用法//test ok-CSDN博客 linux下生成core dump方法与gdb解析core dump文件//test ok-CSDN博客 linux readel…...

webpack该如何打包

1.我们先创建一个空的大文件夹 2.打开该文件夹的终端 输入npm init -y 2.1.打开该文件夹的终端 2.2在该终端运行 npm init -y 3.安装webpack 3.1打开webpack网址 点击“中文文档” 3.2点击“指南”在点击“起步” 3.3复制基本安装图片画线的代码 4.在一开始的文件夹下在创建一…...

【STM32】TIM定时器输入捕获

1 输入捕获 1.1 输入捕获简介 IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff08;上升沿/下降沿&#xff09;&#xff0c;当前CNT的值将被锁存到CCR中&#xff08;把CNT的值读出来&#xff0c;写入到…...

webrtc 设置不获取鼠标 启用回声消除

数 getDisplayMedia()(属于 navigator.mediaDevices 的一部分)与 getUserMedia() 类似,用于打开显示内容(或部分内容,如窗口)。返回的 MediaStream 与使用 getUserMedia() 时相同。 显示鼠标与否 getDisplayMedia() 的约束条件与常规视频或音频输入资源的限制不同。 {…...

JVM虚拟机:如何查看JVM初始和最终的参数?

本文重点 在前面的课程中&#xff0c;我们学习了如何查看当前程序所处于的xx参数&#xff0c;本文再介绍一种如何参看JVM的xx参数&#xff1f; 查看JVM的所有初始化参数 方式一&#xff1a;java -XX:PrintFlagsInitial 方式二&#xff1a;java -XX:PrintFlagsInitial -versio…...

JVM Optimization Learning(五)

目录 一、JVM Optimization 1、G1 1、G1内存模型 2、基础概念 3、G1特点&#xff1a; 4、CMS日志分析 5、G1日志分析 2、GC参数 2.1、GC常用参数 2.2、Parallel常用参数 2.3、CMS常用参数 2.4、G1常用参数 一、JVM Optimization 1、G1 G1官网说明&#xff1a;Gar…...

Java项目学生管理系统一前后端环境搭建

在现代的软件开发中&#xff0c;学生管理系统是一个常见的应用场景。通过学生管理系统&#xff0c;学校能够方便地管理学生的信息、课程安排和成绩等数据。本文将介绍如何使用Java语言搭建一个学生管理系统的前后端环境&#xff0c;并提供一个简单的示例。 1.环境搭建 学生管…...

LeetCode:169.多数元素(哈希表)

题目 第一版 思路 直接开个哈希表&#xff0c;存储每个数组中的数字和对应出现的次数。然后排序后找出对应最大value值的key。 代码 class Solution {public int majorityElement(int[] nums) {Map<Integer,Integer>map new HashMap<Integer,Integer>();for(…...

Linux指令学习

目录 1.ls指令 2.pwd命令 3.cd 指令 4. touch指令 5.mkdir指令 6.rmdir指令 && rm 指令 7.man指令 8.cp指令 9.mv指令 10.cat指令 11.more指令 12.less指令 13.head指令 14.find指令&#xff1a; -name 15.grep指令 16.zip/unzip指令&#xff1a; 17.tar…...

vue2+datav可视化数据大屏(1)

开始 &#x1f4d3; 最近打算出一个前端可视化数据大屏的系列专栏&#xff0c;这次将很全面的教大家设计可视化大屏&#xff0c;从开始到打包结束&#xff0c;其中&#xff0c;包括如何设计框架&#xff0c;如何封装axios&#xff0c;等等&#xff0c;本次使用的数据均为mock数…...

Linux 多进程并发设计-进程对核的亲缘设置

1设计结构 2 设计优点 1 充分利用多核系统的并发处理能力2 负载均衡3 职责明确&#xff0c;管理进程仅负责管理&#xff0c;工作进程仅负责处理业务逻辑 3 演示代码: //main.cpp #define _GNU_SOURCE #include<sys/types.h> #include<sys/wait.h> #include <…...

Javascript 函数介绍

Javascript 函数介绍 很多教程书一上来就讲解一堆语法&#xff0c;例如函数定义、函数调用什么。等读者看完了函数这一章都没搞懂什么是函数。 在讲解什么叫函数之前&#xff0c;我们先看下面一段代码&#xff1a; <!DOCTYPE html> <html xmlns"http://www.w3.…...

php 粉丝关注功能实现

实现粉丝关注功能的步骤如下&#xff1a; 创建用户表&#xff08;user&#xff09;和关注表&#xff08;follow&#xff09;&#xff1a; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(255) NOT NULL,email varchar(255) NOT NULL,password varc…...

深入浅出理解kafka ---- 万字总结

1.Kafka简介 Kafka 本质上是一个 MQ&#xff08;Message Queue&#xff09;&#xff0c;使用消息队列的优点&#xff1a; 解耦&#xff1a;允许独立的扩展或修改队列两边的处理过程。可恢复性&#xff1a;即使一个处理消息的进程挂掉&#xff0c;加入队列中的消息仍然可以在系…...

一对一聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…...

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis查询中返回值四种情况

第一章 Mybatis查询中返回值四种情况 1.1 查询单行数据返回单个对象 /*** 通过id获取员工信息*/ public Employee selectEmpById(int empId);<select id"selectEmpById" resultType"employee">SELECTid,last_name,email,salaryFROMtbl_employeeWHE…...

华为云安全组规则

初始发布cce,快被安全组搞死了。现在把自己的研究成果综合一下,在这里给自己留痕,希望对迷惑的朋友有帮助。 先搞懂安全组是个啥东东: 安全组规则 操作场景 安全组实际是网络流量访问策略,通过访问策略可以控制流量入方向规则和出方向规则,通过这些规则可以为加入安全组…...

MySQL之binlog文件过多处理方法

背景 MySQL由于大量读写&#xff0c;导致binlog文件特别的多。从而导致服务器disk空间不足问题。 先备份binlog文件 tar -zcvf mysql.tar.gz mysql/data/mysql-bin.00* 修改MySQL配置 binlog过期时间 show variables like expire_logs_days; 这里 0 表示 永不过期 如果为 n…...

力扣面试150题 | 88.合并两个有序数组

力扣面试150题 &#xff5c; 88.合并两个有序数组 题目描述解题思路代码实现复杂度分析 题目描述 88.合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并…...

Spring Cache快速入门教程及案例

1. Spring Cache介绍 Spring Cache提供了一组注解&#xff0c;使开发者能够轻松地在方法上定义缓存行为 Spring Cache抽象了缓存的底层实现&#xff0c;允许开发者选择使用不同的缓存提供者&#xff08;如 Ehcache、Redis、Caffeine 等&#xff09;。通过配置相应的缓存管理器…...

pycharm中debug,py文件

1、先把需要的实参传入 2、在合适位置打上断点 3、在小三角旁边右键调用调试 4.步进/步出查看 5.选择单步执行&#xff0c;走的更慢...

虚拟化之指令的Trap和仿真

有时,虚拟机监控程序需要在虚拟机(VM)中模拟操作。例如,VM内的软件可能尝试配置与功耗管理或缓存一致性相关的低级处理器控件。通常,您不希望将VM直接访问这些控件,因为它们可能被用于突破隔离,或影响系统中的其他VM。 trap在执行给定操作(例如读取寄存器)时引发异常…...

Python函数默认参数设置

在某些情况下&#xff0c;程序需要在定义函数时为一个或多个形参指定默认值&#xff0c;这样在调用函数时就可以省略为该形参传入参数值&#xff0c;而是直接使用该形参的默认值。 为形参指定默认值的语法格式如下&#xff1a; 形参名 默认值 从上面的语法格式可以看出&…...

js moment计算当前时间到24:00:00的剩余时间

2023.12.7今天我学习了如何计算当前的时间到24:00:00剩下的时间&#xff0c;https://momentjs.cn/ const now moment(); // 获取当前时间const endOfDay moment().endOf(day); // 设置当天的 23:59:59const duration moment.duration(endOfDay.diff(now)); // 计算剩余时间的…...

【UE5】瞬移+马赛克过渡效果

效果 步骤 1. 新建一个工程&#xff0c;创建一个Basic关卡 2. 添加第三人称游戏资源到内容浏览器 3. 新建一个材质&#xff0c;这里命名为“M_Pixel” 打开“M_Pixel”&#xff0c;设置材质域为“后期处理” 在材质图表中添加如下节点 此时效果如下&#xff0c;已经有马赛克的…...

【Skynet 入门实战练习】分布式 ID | 雪花算法 | 缓存设计 | LRU算法 | 数据库

文章目录 前言雪花算法LRU 算法缓存模块数据库测试逻辑 前言 本节实现了 分布式 ID 生成系统&#xff0c;采用雪花算法实现唯一 ID&#xff1b;实现缓存架构&#xff0c;采用 LRU &#xff08;最近最少使用&#xff09;算法。 雪花算法 分布式 ID 生成算法的有很多种&#x…...

ArcGIS Pro中怎么设置标注换行

在ArcGIS Pro中进行文字标注的时候&#xff0c;如果标注的字段内容太长&#xff0c;直接标注的话会不美观&#xff0c;而且还会影响旁边的标注显示&#xff0c;这里为大家介绍一下在ArcGIS Pro中设置文字换行的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的…...

MAX26——快速人物毛发插片工具 Hair cards tool

一提到毛发插件&#xff0c;我们一般想起的就是maya的 xgrn 或者max的ox。但是这些都是我们做影视级数字人用的。比较费性能也比较费面 下面分享一个干货 Hair cards tool 这个插件操作不像xgen与ox那么复杂。基本上0基础上手5分钟不到。就能插片出不错的效果。比较适用于&…...

一天一个设计模式---原型模式

基本概念 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是通过复制现有对象来创建新对象&#xff0c;而不是通过实例化类。原型模式允许在运行时动态创建对象&#xff0c;同时避免了耦合与子类化。 在原型模式中&#xff0…...

<习题集><LeetCode><链表><2/19/21/23/24>

目录 2. 两数相加 19. 删除链表的倒数第 N 个结点 21. 合并两个有序链表 23. 合并 K 个升序链表 24. 两两交换链表中的节点 2. 两数相加 https://leetcode.cn/problems/add-two-numbers/ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//head是cur链表头节点…...

C++实现DFS、BFS、Kruskal算法和Prim算法、拓扑排序、Dijkstra算法

背景&#xff1a; 实现要求&#xff1a; 根据图的抽象数据类型的定义&#xff0c;请采用邻接矩阵来存储图1&#xff0c;采用邻接表来存储图2&#xff0c;并完成如下操作&#xff1a;对图1无向图进行深度优先遍历和广度优先遍历。对图1无向图采用Kruskal算法和Prim算法得出最小…...

Spring 依赖注入的三种方式优缺点

小王学习录 前言属性注入1. 属性注入的优点2. 属性注入的缺点 Setter注入Setter注入的优点Setter注入的缺点 构造方法注入1. 构造方法的优点 总结补充Aurowired注解和Resource注解的区别 前言 在前面的文章中介绍了基于注解的方式将Bean存储到Spring中, 接下来介绍如何基于注解…...

代理模式介绍(静态代理、jdk动态代理、cglib代理)

一、静态代理 &#xff08;一&#xff09;定义 1、定义 为其他对象提供一种代理以控制对这个对象的访问&#xff1b; 2、涉及到的角色 &#xff08;1&#xff09;抽象主题角色&#xff1a;真实主题和代理主题的共同接口&#xff0c;便于在使用真实主题的地方都可以使用代理…...

设计模式基础——工厂模式剖析(2/2)

目录 一、工厂模式 1.1 工厂模式的定义 1.2 工厂模式的设计意图 1.3 工厂模式主要解决的问题 1.4 工厂模式的缺点 1.5 实际的应用案例 1. 数据库连接池 2. 图形用户界面&#xff08;GUI&#xff09;组件 3. 文件操作 二、各种工厂模式的变形 1.1 简单工厂模式&#…...

spark3.x 读取hudi报错

报错信息如下: Exception in thread "main" org.apache.hudi.exception.HoodieUpsertException: Failed to upsert for commit time 20231201203145254 at org.apache.hudi.table.action.commit.BaseWriteHelper.write(BaseWriteHelper.java:64) at org.apa…...

微信小程序中block和View组件的使用区别

block和View组件都是用于布局的组件: 1. Block组件&#xff1a; Block组件是一个无实际显示效果的组件&#xff0c;它主要用于包裹一组组件&#xff0c;并提供了类似于div的作用。使用Block组件可以将一组组件进行分组&#xff0c;便于样式的管理和控制。Block组件不会在页面…...