effective Java 学习笔记(第二弹)
effective Java 学习笔记(第一弹)
整理自《effective Java 中文第3版》
本篇笔记整理第3,4章的内容。
重写equals方法需要注意的地方
- 自反性:对于任何非空引用 x,x.equals(x) 必须返回 true。
- 对称性:对于任何非空引用 x 和 y,如果且仅当 y.equals(x) 返回 true 时 x.equals(y) 必须返回 true。
- 传递性:对于任何非空引用 x、y、z,如果 x.equals(y) 返回 true,y.equals(z) 返回 true,则 x.equals(z) 必须返回 true。
- 一致性:对于任何非空引用 x 和 y,如果在 equals 比较中使用的信息没有修改,则 x.equals(y) 的多次调用必须始终返回 true 或始终返回 false。
- 对于任何非空引用 x,x.equals(null) 必须返回 false。
在equals方法声明中,不要将参数Object替换成其他类型!可以用instanceof来判断类型是否一致。
重写equals方法时同时也要重写hashcode方法。相等的对象必须要具有相等的哈希码(hash code)。
@EqualsAndHashCode(callSuper = false) 是 Lombok 库中的一个注解,用于自动生成 equals 和 hashCode 方法。这个注解可以帮助开发者减少样板代码的编写。
callSuper = false 参数表示在生成的 equals 和 hashCode 方法中不调用父类的 equals 和 hashCode 方法。这意味着生成的方法将仅基于当前类的字段来实现相等性和哈希值的计算。这样可以确保子类在继承父类时,不会因为父类的 equals 和 hashCode 方法而影响子类的行为。
始终重写toString方法
虽然Object类提供了toString方法的实现,但它返回的字符串是它由类名后跟一个「at」符号(@)和哈希码的无符号十六进制表示组成。若想输出需要的易懂的内容,需要重写。
@Data 注解是 Lombok 库提供的一个注解,用于简化 Java 类的编写。使用 @Data 注解后,Lombok 会自动生成以下内容:
- 生成 getter 和 setter 方法:为类中的所有字段自动生成 getter 和 setter 方法。
- 生成 toString 方法:为类生成 toString 方法,包含所有字段的值。
- 生成 equals 和 hashCode 方法:为类生成 equals 和 hashCode 方法,基于所有字段。
- 生成 toString 方法:为类生成 toString 方法,包含所有字段的值。
- 生成无参构造函数:为类生成一个无参构造函数。
- 生成全参构造函数:为类生成一个包含所有字段的全参构造函数。
import lombok.Data;@Data
public class User {private String name;private int age;private String email;
}
使用 @Data 注解后,Lombok 会为 User 类生成以下内容:
public String getName()
public void setName(String name)
public int getAge()
public void setAge(int age)
public String getEmail()
public void setEmail(String email)
public String toString()
public boolean equals(Object obj)
public int hashCode()
无参构造函数 public User()
全参构造函数 public User(String name, int age, String email)
考虑实现Comparable接口
无论何时实现具有合理排序的值类,你都应该让该类实现Comparable接口,以便在基于比较的集合中轻松对其实例进行排序,搜索和使用。 比较 compareTo 方法的实现中的字段值时,请避免使用「<」和「>」运算符。 相反,使用包装类中的静态compare方法或Comparator接口中的构建方法。
如下是反例,可能导致整形最大长度移除和IEEE754浮点运算失真危险。
static Comparator<Object> hashCodeOrder = new Comparator<>() {public int compare(Object o1, Object o2) {return o1.hashCode() - o2.hashCode();}
};
可以使用如下两种方式替代
static Comparator<Object> hashCodeOrder = new Comparator<>() {public int compare(Object o1, Object o2) {return Integer.compare(o1.hashCode(), o2.hashCode());}
};static Comparator<Object> hashCodeOrder = Comparator.comparingInt(o -> o.hashCode());
额外话题:IEEE754浮点运算失真
IEEE754浮点运算失真(或精度丢失)是指在使用IEEE754标准表示和计算浮点数时,由于二进制存储和有限位数限制,导致无法精确表示某些十进制小数或运算结果出现微小误差的现象。这是计算机科学中浮点数处理的固有挑战。
核心原因:
- 二进制与十进制的进制差异
- 许多十进制小数(如0.1)无法用有限位二进制精确表示(类似1/3无法用有限十进制表示)。
- 例如,0.1的二进制表示是无限循环小数:0.0001100110011…,存储时会被截断。
- IEEE754的存储结构限制
- 浮点数按三部分存储:符号位、指数位(控制范围)、尾数位(控制精度)。
- 单精度(32位):1符号位 + 8指数位 + 23尾数位 → 约6-9位有效十进制数字。
- 双精度(64位):1符号位 + 11指数位 + 52尾数位 → 约15-17位有效十进制数字。
- 舍入规则的影响
- IEEE754默认使用“向最近偶数舍入”(Round to Nearest, Ties to Even),可能导致累积误差。
典型表现:
console.log(0.1 + 0.2); // 输出:0.30000000000000004(非精确0.3)
console.log(0.3 - 0.2 === 0.1); // 输出:false
>>> 1.0000000000000001 == 1.0
True # 双精度无法区分过小的差异
实际影响场景:
- 科学计算:迭代计算中误差累积可能影响结果可靠性。
- 金融系统:货币计算要求精确到分,浮点误差可能导致账务错误。
- 游戏物理引擎:微小误差可能引发碰撞检测异常。
解决方案:
- 整数替代法
用整数表示最小单位(如分而不是元):
price_cents = 1000 # 表示10.00元,避免浮点运算
- 高精度计算库
Python:decimal 模块(基于十进制的精确计算):
from decimal import Decimal
print(Decimal(‘0.1’) + Decimal(‘0.2’)) # 输出精确0.3 - 误差容忍比较
使用极小值(epsilon)判断近似相等:
function areEqual(a, b, epsilon = 1e-10) {return Math.abs(a - b) < epsilon;
}
- 特殊场景处理
避免超大数与超小数直接相加(会丢失小数部分):
double big = 1e20;
double small = 1.0;
printf("%f\n", big + small - big); // 输出0.0(small被吞没)
虽然IEEE754的精度问题无法彻底消除,但通过合理的设计(如定点数、符号处理、误差控制)可将其影响降至最低。理解这一机制是开发可靠数值计算程序的关键基础。
使类的成员的可访问性最小化
非零长度的数组总是可变的,所以类具有公共静态 final 数组属性,或返回这样一个属性的访问器是错误的。
如果一个类有这样的属性或访问方法,客户端将能够修改数组的内容。 这是安全漏洞的常见来源:
public static final Thing[] VALUES = { ... };
有两种方法可以解决这个问题。
- 可以使公共数组私有并添加一个公共的不可变列表:
private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES =Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
- 可以将数组设置为 private,并添加一个返回私有数组拷贝的公共方法:
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {return PRIVATE_VALUES.clone();
}
应该尽可能地减少程序元素的可访问性(在合理范围内)。 在仔细设计一个最小化的公共 API 之后,你应该防止任何散乱的类,接口或成员成为 API 的一部分。 除了作为常量的公共静态 final 属性之外,公共类不应该有公共属性。 确保 public static final 属性引用的对象是不可变的。
我自己也犯过这样的错误,在某个枚举中创建private static final Set的集合,枚举中加了静态的方法返回这个数组,在外层删除这个集合的某个值,这个集合的值就彻底变了。大致代码如下:
@Getter
public enum VIPTypeEnum {BRONZE(0,"bronze"),SILVER(1,"silver"),GOLD(2,"gold"),SUPPER(999,"supper"),;private int code;private String desc;VIPTypeEnum(int code, String desc) {this.code = code;this.desc = desc;}private static final Set<VIPTypeEnum> showSet = Sets.newHashSet(BRONZE,SILVER,GOLD);public static Set<VIPTypeEnum> getShowSet(){return showSet;}
}
public static void main(String[] args) {Set<VIPTypeEnum> showSet = VIPTypeEnum.getShowSet();System.out.println(showSet);showSet.remove(VIPTypeEnum.SILVER);System.out.println(VIPTypeEnum.getShowSet());
}
输出如下:
[BRONZE, GOLD, SILVER]
[BRONZE, GOLD]
使用static final修饰的成员变量值改变了。上面说的书中的方法也是可以的:
修改为:
public static Set<VIPTypeEnum> getShowSet(){return Collections.unmodifiableSet(showSet);}
那么运行main方法,会抛出异常:
[BRONZE, GOLD, SILVER]
Exception in thread "main" 与目标 VM 断开连接, 地址为: ''127.0.0.1:52720',传输: '套接字''
java.lang.UnsupportedOperationExceptionat java.util.Collections$UnmodifiableCollection.remove(Collections.java:1058)at com.example.demo.DemoApplication.main(DemoApplication.java:121)
书中的第二种方法改后会报错:‘clone()’ 在 ‘java.lang.Object’ 中具有 protected 访问权限,因为Set接口并没有定义clone()方法。这通常会导致编译错误,提示无法找到符号或类似的问题。为了解决这个问题,我们可以使用其他方式来复制集合,例如通过构造函数创建一个新的HashSet实例。
public static Set<VIPTypeEnum> getShowSet(){return new HashSet<>(showSet);}public static void main(String[] args) {Set<VIPTypeEnum> showSet = VIPTypeEnum.getShowSet();System.out.println(showSet);showSet.remove(VIPTypeEnum.GOLD);System.out.println(showSet);System.out.println(VIPTypeEnum.getShowSet());}
输出结果:
[BRONZE, GOLD, SILVER]
[BRONZE, SILVER]
[BRONZE, GOLD, SILVER]
关于深、浅拷贝的操作,见:Java 对实例进行深拷贝操作
最小化可变性
“最小化可变性”强调设计不可变类(Immutable Class)的重要性。不可变类的实例一旦创建,状态就不可修改,这能显著提升代码的线程安全性、可维护性和可靠性。以下是关键原则及示例:
核心原则
- 不提供修改状态的方法(Mutators)
- 如 setXxx() 方法,禁止直接修改对象属性。
- 确保类不可被继承
- 避免子类破坏不可变性,通常用 final 修饰类或私有化构造函数。
- 保护对可变组件的访问
- 如果类持有可变对象(如数组、集合),需防御性拷贝(Defensive Copy),避免外部修改影响内部状态。
示例1:简单的不可变类
public final class ImmutablePoint {private final int x;private final int y;public ImmutablePoint(int x, int y) {this.x = x;this.y = y;}// 只有getter,没有setterpublic int getX() { return x; }public int getY() { return y; }
}
不可变性体现:
- x 和 y 被声明为 final,只能在构造函数中初始化。
- 没有提供修改字段的方法(如 setX())。
- 类为 final,不允许子类覆盖行为。
示例2:处理深层次可变对象
若类中包含可变对象(如 Date、数组),需确保外部无法修改其内部状态:
public final class ImmutableEvent {private final Date eventDate; // Date本身是可变的!public ImmutableEvent(Date date) {this.eventDate = new Date(date.getTime()); // 防御性拷贝,避免外部修改原Date}public Date getEventDate() {return (Date) eventDate.clone(); // 返回拷贝,避免外部修改内部Date}
}
构造函数中创建 Date 的副本存储,而非直接引用外界传入的 Date。getEventDate() 返回克隆对象,防止外部通过获取引用修改内部状态。
示例3:Java标准库中的不可变类
String 类:
String s = "Hello";
s = s.concat(" World"); // 返回新对象,原s未被修改
所有看似修改的操作(如 concat()、substring())都返回新对象,原始字符串不变。
BigInteger、BigDecimal:
数值运算(如 add())均返回新实例,确保原有对象不变。
为何不可变类更安全?
- 线程安全:无需同步,多线程共享时不会出现竞态条件。
- 缓存友好:可安全复用对象(如 String 常量池)。
- 防御性拷贝不必要:不可变对象本身无法被修改,传递时无需复制。
- 可靠的哈希键:作为 HashMap 的键时,哈希值不会改变,避免定位错误。
何时使用可变类?
不可变类的缺点是频繁创建对象可能影响性能,此时可选择可变配套类:String(不可变) ➔ StringBuilder(可变,用于高效拼接字符串)。复杂计算中,若需频繁修改状态,可使用可变对象临时操作,最终生成不可变结果。
相关文章:
effective Java 学习笔记(第二弹)
effective Java 学习笔记(第一弹) 整理自《effective Java 中文第3版》 本篇笔记整理第3,4章的内容。 重写equals方法需要注意的地方 自反性:对于任何非空引用 x,x.equals(x) 必须返回 true。对称性:对于…...
Spring BeanFactoryPostProcessor 和 BeanPostProcessor有什么用?
BeanFactoryPostProcessor 和 BeanPostProcessor 都是 Spring 框架中非常重要的扩展点,我们在开发中可以利用 Spring 容器实例化 Bean、配置 Bean 以及初始化 Bean 的过程中进行自定义的干预。但它们的作用时机和作用对象不同。 1. BeanFactoryPostProcessor: 作用…...
Centos7 Gitlab17部署
确保你的安装源正常 1.安装依赖项 sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix 2.安装Gitlab (1)添加仓库 curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash (2) 安装Gitl…...
一文解读DeepSeek在工业制造领域的应用
引言 在当今数字化浪潮席卷全球的背景下,各个行业都在积极寻求创新与变革,工业制造领域也不例外。然而,传统工业制造在生产效率、质量控制、成本管理等方面面临着诸多挑战。在这一关键时期,人工智能技术的兴起为工业制造带来了新的…...
基于动态 FOF(基金中的基金)策略的基金交易推荐系统的设计与实现思路
下面为你呈现一个基于动态 FOF(基金中的基金)策略的基金交易推荐系统的设计与实现思路,同时给出一个简单的 Python 示例代码。 系统设计 1. 需求分析 收集各类基金的历史数据,涵盖净值、收益率、风险指标等。依据动态 FOF 策略…...
第一次程序Hello Python
Python环境安装 安装地址 安装地址 https://www.python.org/ 1. 安装Python 下载完成后,双击安装包(如python-3.13.2.exe),按照提示进行安装。在安装过程中,确保勾选“Add Python to PATH”选项,以便在命…...
nvm 切换node 版本 但是没有带星号*
在 Windows 系统中配置 NVM_SYMLINK 环境变量的步骤如下: 1️⃣ 设置变量路径 变量名:NVM_SYMLINK 变量值:建议设置为 C:\Program Files\nodejs(需与后续步骤中 NVM 配置的符号链接路径一致) 2️⃣ 配置系统环境变量…...
Java定时任务的三重境界:从单机心跳到分布式协调
《Java定时任务的三重境界:从单机心跳到分布式协调》 本文将以生产级代码标准,揭秘Java定时任务从基础API到分布式调度的6种实现范式,深入剖析ScheduledThreadPoolExecutor与Quartz Scheduler的线程模型差异,并给出各方案的性能压…...
1.NextJS基础
NextJS注意要点 文件用来定义路由,folder name becomes the route name注意区分客户端渲染和服务器渲染 html渲染完成后给到客户端(此时网页内容已经全部提供),有利于crawler和优化seo逻辑更简单request deduplication减少API请求…...
晶晨/全志/联发科芯片系列电视盒子改固件包教程
声明:对电视盒子进行改包(修改固件包)是一项有一定技术门槛且存在风险的操作,可能会导致盒子变砖、失去保修等问题,同时私自修改固件可能违反相关法律法规和使用协议。以下为你提供一个通用的大致改包教程,…...
2025最新3个wordpress好用的主题
红色大气的wordpress企业主题,适合服务行业的公司搭建企业官方网站使用。是一款专为中小企业和个人开发者设计的WordPress主题,旨在提供专业的网站构建解决方案。 通过此WordPress主题,用户可以轻松创建和维护一个专业的企业网站,…...
GZCTF平台搭建及题目上传
前言 我用手里的Ubuntu虚拟机搭建的,大家根据自己的实际情况来吧 安装及部署 首先,你的虚拟机需要有Docker和Docker-Compose,前者可以看我之前的文章,另外一个可以输入下面的命令安装,注意先获取管理员权限ÿ…...
openGauss关联列数据类型不一致引起谓词传递失败
今天分享一个比较有意思的案例 注意:因为原始SQL很长,为了方便排版,简化了SQL 下面SQL跑60秒才出结果,客户请求优化 select dtcs.owner, dtcs.table_name, dtcs.column_name, dct.commentsfrom dba_tab_columns dtcsleft outer j…...
【网络安全基础学习】渗透测试工具--Burp Suite详细教程
Burp Suite与SniffMaster:网络安全工具的双剑合璧 Burp Suite(简称BP)是一款用于攻击web应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。然而,除了Burp…...
手机测试,工作中学习
要学习各种机型的截图方式、开发模式在哪。 荣耀机型:截图:关节快速敲两下。开发者模式在“系统和更新”里。 1.出现缺陷,需要获取日志。 学习adb生成日志:当测试中出现缺陷的,使用adb logcat -d > d:/log.txt …...
ctfshow WEB web2
1.查当前数据库名称 or 11 union select 1,database(),3 limit 1,2;#-- 得到数据库名称web2 2.查看数据库表的数量 or 11 union select 1,(select count(*) from information_schema.tables where table_schema web2),3 limit 1,2;#-- 得到数据库表数量为2 3.查表的名字 第…...
大疆上云api介绍
概述 目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人…...
ASP.NET Web API + VUE3 整合阿里云OSS,后端API生成预签名上传Url,前端VUE进行上传
1、后端API 我用的是.net sdk6,所以先安装了这个Aliyun.OSS.SDK.NetCore 下面是后端生成上传Url的参考代码,主意request.ContentType,如果这里要是设置了,那么前端也要设置成一样的,如果前端是获取文件的contentType&…...
Java基础 3.22
1.break练习 //1-100之内的数求和,求当和第一次大于20的当前数i public class Break01 {public static void main(String[] args) {int n 0;int count 0;for (int i 1; i < 100; i) {count i;System.out.println("当前和为" count);if (count &g…...
如何快速解决 Postman 报错?
介绍一些 Postman 常见的报错与处理方法,希望能够对大家有所帮助。 Postman 一直转圈打不开的问题 Postman 报错处理指南:常见报错与解决方法...
软件性能效率测试工具有哪些?专业第三方软件检测机构推荐
在软件开发的新时代,软件性能效率测试已经成为每个企业不可或缺的一部分。无论是在竞争激烈的市场中,还是在追求卓越用户体验的过程中,都需要进行有效的性能测试。 一、软件性能效率测试的目标 1、响应时间:确保用户请求的响…...
手机销售终端MPR+LTC项目项目总体方案P183(183页PPT)(文末有下载方式)
资料解读:手机销售终端 MPRLTC 项目项目总体方案 详细资料请看本解读文章的最后内容。在当今竞争激烈的市场环境下,企业的销售模式和流程对于其发展起着至关重要的作用。华为终端正处于销售模式转型的关键时期,波士顿 - 华为销售终端 MPRLTC …...
redis使用
redis集群搭建可参考:redis集群搭建-CSDN博客 一、简述 Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值对存储系统,通常用作数据库、缓存和消息代理。它支持多种数据结构,包括字符串、哈希、列…...
深入 SVG:矢量图形、滤镜与动态交互开发指南
1.SVG 详细介绍 SVG(Scalable Vector Graphics) 是一种基于 XML 的矢量图形格式,用于描述二维图形。 1. 命名空间 (Namespace) ★ 了解 命名空间 URI:http://www.w3.org/2000/svg 用途:在 XML 或 XHTML 中区分不同标…...
从双指针到单调栈,深挖“接雨水”的算法奥秘
从双指针到单调栈,深挖“接雨水”的算法奥秘 大家好,我是你们熟悉的算法领域大牛Echo_Wish。今天我们聊聊经典题目《接雨水》(Trapping Rain Water),不仅仅是讲解,而是深度对比两种高效解法:双…...
Labview和C#调用KNX API 相关东西
叙述:完全没有听说过KNX这个协议...................我这次项目中也是简单的用了一下没有过多的去研究 C#调用示例工程链接(labview调用示例在 DEBUG文件夹里面) 通过网盘分享的文件:KNX调用示例.zip 链接: https://pan.baidu.com/s/1NQUEYM11HID0M4ksetrTyg?pwd…...
Wireshark网络抓包分析使用详解
序言 之前学计网还有前几天备考华为 ICT 网络赛道时都有了解认识 Wireshark,但一直没怎么专门去用过,也没去系统学习过,就想趁着备考的网络相关知识还没忘光,先来系统学下整理点笔记~ 什么是抓包?抓包就是将网络传输…...
linux命令行工具进阶
文章目录 前言ssh免密登录,免密码登录,公私钥查看与修改IP地址临时修改永久修改 mount临时切换根文件系统永久切换根文件系统loop文件partedinitramfsuboot command line 前言 本文记录了一些不经常用到,但在某个时刻需要用到的一些指令。 免…...
【Linux文件IO】Linux中标准IO的API的描述和基本用法
Linux中标准IO的API的描述和基本用法 一、标准IO相关API1、文件的打开和关闭示例代码: 2、文件的读写示例代码:用标准IO(fread、fwrite)实现文件拷贝(任何文件均可拷贝) 3、文件偏移设置示例代码: 4、fgets fputs fget…...
【netstat和ss】Windows和Linux下的,网络连接排查简单案例
网络连接排查利器:netstat与ss命令详解 初识netstat:Windows下的网络连接查看工具 需要查看本机的网络连接情况时,Windows系统提供了一个非常实用的命令:netstat。和findstr组合形成一个有用的组合命令: netstat -a…...
【WPF】MVVM模式实现数据绑定以及Command事件绑定
1.引用类 using System.ComponentModel2.创建Command自定义类 public class DelegateCommand : ICommand{public bool CanExecute(object parameter){if (CanExecuteFunc null)return true;return this.CanExecuteFunc(parameter);}public event EventHandler CanExecuteChan…...
Flutter快速搭建聊天
之前项目中使用的环信聊天,我们的App使用的Flutter开发的 。 所以,就使用的 em_chat_uikit ,这个是环信开发的Flutter版本的聊天。 一开始,我们也用的环信的聊天,是收费的,但是,后面就发现&…...
网络层之IP协议
在讨论传输层时, 我们都只讨论了发送方和接收方的问题, 而没有讨论中间的网络形态的问题. 也就是数据包如何从主机传送到主机的? 如图, 主机B发送数据到主机C, 发送报文需要进行路径选择, 主机B-> F-> G-> H-> C-> D -> 主机C 这条路径是如何被选择出来的?…...
【设计模式】策略模式(Strategy Pattern)详解
策略模式(Strategy Pattern)详解 一、策略模式的定义 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一组算法,将每个算法封装起来,并使它们可以相互替换,从而让算法的…...
Elasticsearch:构建 AI 驱动的搜索体验
Elasticsearch 介绍 当你开始使用 Elastic 时,你将使用 Elasticsearch Relevance Engine™(ESRE),它专为 AI 搜索应用程序提供支持。借助 ESRE,你可以利用一整套开发者工具,包括 Elastic 的文本搜索、向量…...
数据文件误删除,OceanBase中如何重建受影响的节点
当不慎误删数据文件且当前没有现成的可替换节点时,在OceanBase中,不必急于采取极端措施,可以考虑运用 server_permanent_offline_time 参数,来重建受影响的节点。 原理: server_permanent_offline_time 是 OceanBase数…...
MySQL面试专题
1.什么是BufferPool? Buffer Pool基本概念 Buffer Pool:缓冲池,简称BP。其作用是用来缓存表数据与索引数据,减少磁盘IO操作,提升效率。 Buffer Pool由缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制…...
Redmi Note 11 T pro + 刷入 LinegaOs 22.1 记录 手机已经解锁bl.
Redmi Note 11 T pro 刷入 LinegaOs 22.1 记录 手机已经解锁bl. 获取LIneagaOS源码, 以及https://github.com/xiaomi-mediatek-devs 这个组织提供的代码,非常感谢 环境要求: ubuntu 22.04 需要准备的依赖 sudo apt install git curl vim…...
Python+Requests+Pytest+YAML+Allure接口自动化框架
GitHub源码地址(详细注释):源码 调试项目python自主搭建:附项目源码 一、项目介绍 本项目是基于 PythonRequestsPytestYAMLAllure 搭建的 接口自动化测试框架,用于对 REST API 进行测试。 框架的主要特点包括&#…...
如何解决Redis缓存异常问题(雪崩、击穿、穿透)
引言 Redis作为一种高性能的内存数据库,被广泛应用于缓存系统的构建中。然而,在实际应用过程中,我们常常会遇到三种典型的缓存异常问题:缓存雪崩、缓存击穿和缓存穿透。这些问题如果处理不当,可能会导致系统性能下降&…...
如何使用 Postman 进行接口测试?
使用 Postman 这一工具,可以轻松地进行接口测试。以下是一份简单的使用教程,帮助你快速上手。 Postman 接口测试教程:详细步骤及操作技巧...
记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException
一、问题描述 有个文件导入功能,用到了Hutool 的加密解密功能,本地运行完全可以,但是线上报错:“org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFou…...
VLAN实验
一:实验拓扑 二:实验需求 1、PC1和PC3所在接口为access接口,属于VLAN 2 2、PC2/4/5/6处于同一网段 其中PC2可以访问PC4/5/6 PC4可以访问PC5不能访问PC6 PC5不能访问PC6 3、PC1/3和PC2/4/5/6不在一个网段,且可以正常通讯 4、…...
FPGA中串行执行方式之状态机
FPGA中串行执行方式之状态机 在FPGA中,默认情况下,逻辑是并行执行的,因为FPGA的硬件资源是并行的。然而,在某些情况下,你可能需要某一段逻辑以串行方式执行。这可以通过以下几种方法实现:使用状态机(Finite State Machine, FSM)、使用计数器控制、使用流水线(Pipel…...
【常用的中间件】
中间件(Middleware)是位于客户端和服务器之间的软件层,用于处理客户端请求和服务器响应之间的各种任务。中间件可以提供多种功能,如负载均衡、消息队列、缓存、身份验证等。以下是常用的中间件及其作用: 1. 消息队列中…...
spring - 十二种事务失效场景
目录 编辑 一、方法内部调用 1、原理: 2、结论: 3、解决方法: 1. 增加一个service,把一个事务的方法移到新增加的service方法里面,然后进行注入再调用 2. 在自己类中注入自己 3. 通过AopContentent 二、访问权限不是pubilc 三、方法用final修饰 四、没有被spr…...
python脚本处理excel文件
1.对比perl和python 分别尝试用perl和python处理excel文件,发现perl的比较复杂,比如说read excel就有很多方式 Spreadsheet::Read use Spreadsheet::ParseExcel 不同的method,对应的取sheet的cell方式也不一样。更复杂的是处理含有中文内…...
C#基础学习(二)C#数组生存手册:从入门到“血压拉满“的奇妙旅程
作为一只C#萌新,当你试图用数组装下整个世界时,系统可能会温柔地弹出一句**"Index was outside the bounds of the array."**。别慌!这份求生指南将用段子教你玩转数组 一、数组是什么 数组简单来说就是由相同元素组成的一个集合&a…...
MySQL 性能优化方向
MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…...
2025年- G26-Lc100-57.插入间隔(max、min)--java版
1.题目描述 题目翻译: 给定一个不重叠的区间阵列 intervals,其中intervals[i] [starti, endi]表示第i一个区间的起始位置和结束位置,并且intervals 按照起始位置starti升序排序。 另外,给定一个新的区间newInterval [start, e…...