- 博客(49)
- 问答 (1)
- 收藏
- 关注
原创 IDEA的git提交代码提交失败,有错误0 个文件已提交,1 个文件提交失败:
在IDEA中使用Git提交代码时遇Husky钩子验证失败,导致1个文件提交失败。错误提示建议移除Husky的git add命令配置。Husky作为Git钩子工具,常在提交前执行代码检查(如ESLint),若检查不通过会终止提交。临时解决方案是在终端运行npm uninstall husky --save,该命令会移除Husky依赖并暂时关闭验证机制。注意这仅是临时解决方法,长期仍需修复原始验证问题。
2025-06-11 10:15:34
227
1
原创 w笔记--nvm下载node报错:Could not retrieve https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt.
使用nvm下载node时遇到淘宝镜像失效报错,需修改镜像配置。具体解决方案是:打开nvm/nvm/settings.txt文件,将node_mirror和npm_mirror分别替换为https://npmmirror.com/mirrors/node/和https://npmmirror.com/mirrors/npm/。这一操作可解决因淘宝镜像不可用导致的下载失败问题,确保后续能正常安装node.js版本。
2025-06-06 19:58:48
92
原创 w笔记--表格组件(Table)的sorter属性
AntDesign表格组件的sorter属性用于自定义列排序逻辑,支持字符串和日期排序。字符串排序使用localeCompare方法比较字母顺序,返回负值、0或正值决定行顺序;日期排序则通过比较时间戳实现,相减结果决定先后顺序。该属性为表格数据排序提供了灵活的自定义方式。
2025-05-27 14:22:10
299
原创 w笔记--Swagger
本文介绍基于OpenAPI规范的API文档生成工具,重点讲解SpringDoc的实现方案。通过添加springdoc-openapi依赖及基础配置类,可自动生成符合OpenAPI 3.0规范的API文档。文档支持SwaggerUI可视化测试,提供核心注解说明,包括接口分组(@Tag)、操作描述(@Operation)和参数定义(@Parameter),以及数据模型注解(@Schema)的使用方法,涵盖基本类型、数组、映射和嵌套对象等复杂结构,实现代码与文档的自动同步。访问地址包括SwaggerUI界面和Op
2025-05-27 14:15:13
365
原创 I/O 多路复用
是一种高效的I/O操作技术,允许单个线程同时监控多个文件描述符(如套接字),并在其中任何一个文件描述符就绪时进行读写操作。这种技术广泛应用于高并发网络服务器中,如Redis、Nginx等。
2025-02-19 14:23:39
177
原创 Redis缓存雪崩、击穿、穿透
指的是查询一个不存在的数据,由于缓存和数据库中都没有该数据,导致每次请求都直接访问数据库,造成数据库压力过大的现象。指的是在某一时刻,大量缓存数据同时失效或Redis服务宕机,导致所有请求直接打到数据库,造成数据库压力骤增,甚至崩溃的现象。使用两个缓存层,主缓存设置较短过期时间,备份缓存设置较长过期时间,主缓存失效时从备份缓存读取数据。在系统启动或缓存失效前,提前加载热点数据到缓存中,避免大量请求直接访问数据库。在系统启动或缓存失效前,提前加载热点数据到缓存中,避免大量请求直接访问数据库。
2025-02-19 14:08:37
740
原创 Redis为什么速度快、性能高?
Redis提供了多种高效的数据结构,如字符串、哈希、列表、集合、有序集合等,这些结构经过专门优化,操作速度快。Redis采用非阻塞I/O,能够在等待 I/O 操作时继续处理其他请求,提升了并发处理能力。Redis采用单线程处理命令,避免了多线程的上下文切换和竞争条件,简化了设计并提升了性能。Redis支持事务、发布/订阅、Lua脚本等,减少了应用层的复杂性,提升了整体性能。Redis使用简单的文本协议(RESP),减少了协议解析的开销,提升了通信效率。
2025-02-19 11:15:50
748
原创 Redis数据类型及使用场景
与列表类似,但不允许有重复元素,内部用 HashMap 实现,只用了 HashMap 的 key 列来存储对象,元素无序,不支持通过索引下标获取元素,支持集合内的增删改查及多个集合的交集、并集、差集操作,添加、删除、查找复杂度为 O (1),能判断成员是否在集合内。Redis 最基础的数据结构,是简单的key-value 类型,key 为 String,value 可以是 String 或数字,其他结构都是在此基础上构建的。用于维护用户标签等,可方便地获取具有共同标签的用户,例如求用户共同爱好的标签。
2025-02-19 10:41:48
598
原创 Redis持久化
Redis持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失;Redis提供两种持久化机制RDB(默认)和AOF机制;
2025-02-19 09:43:30
847
原创 Redis中的某一热点数据缓存过期了,此时有大量请求访问怎么办
当Redis中的热点数据缓存过期时,大量请求同时涌入数据库,可能导致数据库压力骤增,甚至引发系统崩溃。这种情况称为。
2025-02-17 17:28:19
436
原创 什么是点单登录,前端如何实现单点登录
验证通过后,认证中心会生成一个全局唯一的令牌(Token),并将该 Token 存储在服务器端,同时将 Token 以 Cookie 的形式发送给浏览器。单点登录(Single Sign-On,SSO)是一种身份认证机制,允许用户在一处进行身份验证后,能够在多个相互关联的系统中自由访问,无需重复输入用户名和密码,极大地提升了用户体验和系统的易用性。如果每个系统都独立进行身份验证,用户在访问不同系统时就需要多次输入用户名和密码,这不仅降低了用户体验,还增加了用户遗忘密码的风险,同时也不利于系统的统一管理。
2025-02-17 15:18:11
1171
原创 Java中的hashCode和equals方法之间有什么联系
用于判断两个对象的内容是否相等。默认情况下,它比较的是对象的引用地址,在很多类中会重写该方法以实现基于内容的比较。返回对象的哈希码值,是一个整数。哈希码主要用于在哈希表等数据结构中快速定位和存储对象,提高数据的存储和查找效率。
2025-02-17 09:45:18
383
原创 说说平衡树的基本实现,与红黑树的区别是什么
平衡树是一种能够在插入、删除和查找操作中保持平衡的二叉搜索树。其目的是确保树的高度在一定范围内,防止出现极端情况(如链表化),以便提高操作效率。常见的平衡树有 AVL 数和红黑树,它们都通过某种方式保证树的高度尽量接近对数级别。红黑树:是一种弱平衡的二叉搜索树,允许轻微不平衡,因此插入删除时的旋转操作次数较少,适合高频插入、删除的场景。查找效率可能略低于 AVL 树。AVL 树:是严格的平衡树,保证平衡因子绝对值不超过 1,插入删除操作后不的旋转较为频繁,但查找效率较高。
2025-02-14 16:45:24
222
原创 Java的synchronized是怎么实现的?
当 synchronized 修饰在方法或代码块上时,会对特定的对象或类加锁,从而确保同一时刻只有一个线程能执行加锁的代码块。synchronized 实现原理依赖于 JVM 的 Monitor (监视器锁)和对象头(Object Header)。
2025-02-14 16:23:07
126
原创 泛型的原理、优点以及可能存在的问题
泛型是Java引入的一种特性,允许在定义类、接口或方法时使用类型参数,从而实现对不同类型的通用操作。泛型的核心原理是类型参数化和类型擦除。在编译时,泛型类型参数会被擦除,替换为他们的上限(通常是Object)。泛型允许在定义类、接口或方法时使用类型参数(如<T>),这些类型参数可以在使用时指定具体的类型。类型擦除的目的是为了兼容 Java 的旧版本(Java 5 之前没有泛型)。泛型类型参数只能是引用类型,不能是基本类型(如。由于类型擦除,泛型类型参数在运行时是不可见的。也无法直接获取泛型类型的。
2025-02-14 15:02:03
380
原创 HashMap扩容时为啥容量扩大到原来的2倍?加载因子为啥是0.75?
加载因子表示HashMap在达到多少比例时进行扩容。如果加载因子设置的过大,如 1.0 ,那么HashMap在数组几乎满了才进行扩容,这样会导致哈希冲突的概率增加,链表或红黑树的长度变长,从而降低查询和插入的效率;如果加载因子设置的过小,如 0.5 ,那么HashMap会频繁进行扩容,导致空间利用率降低。经过大量的实验和实践,发现 0.75 是一个比较合适的平衡点,能够在空间利用率和查询效率之间取得较好的平衡。
2025-02-14 12:02:30
343
原创 如何防止SQL注入 / #{ } 和 ${ } 的区别详细解释
SQL 注入是一种常见的网络攻击手段,其本质是攻击者将恶意的 SQL 代码插入到应用程序的输入字段中,从而欺骗服务器执行非预期的 SQL 指令。后续每次执行相同结构的 SQL 语句时,只需要传递不同的参数,不需要重新编译,减少了执行时间和资源的消耗,降低了数据库的负载。由于参数是在 SQL 编译完成后才传递的,攻击者无法通过输入恶意的 SQL 代码来改变 SQL 语句的结构,从而有效防止了 SQL 注入攻击。预编译后的 SQL 语句会被缓存起来,可以重复使用,提高了代码的复用性。MyBatis 会将。
2025-02-11 15:48:14
901
原创 hash冲突及hash冲突的4种解决方案
哈希表大小固定,输入数据数量可能无限,当数据量超出哈希表容量,或负载因子(哈希表中存储的元素数量与哈希表大小的比值)过高,哈希表中的空闲位置减少,冲突概率就会增加。哈希函数的输入可以是任意长度的数据,组合无限,而哈希值的长度固定,输出域有限,根据鸽巢原理,必然会有不同输入映射到同一个输出值。某些特殊的输入模式可能使哈希函数产生相同的哈希值,如哈希函数对输入的某些部分不敏感,具有相似部分的输入就可能映射到同一个哈希值。攻击者可能故意构造输入数据,使其产生相同的哈希值,引发哈希冲突,进行哈希洪水攻击。
2025-01-03 10:14:10
1381
原创 JDK7 与 JDK8 的 HashMap 的区别
JDK7 与 JDK8 的 HashMap 的区别:项 JDK7 JDK8 数据结构 数组 + 链表。 复杂度:O(n) 数组 + 链表 + 红黑树 (若链表长度大于等于8 且容量小于64 会进行扩容;若链表长度大于8 且数组长度大于等于64,会转化为红黑树(提高定位元素的速度);若红黑树节点个数小于6,则将红黑树转为链表。) 插入位置 插入链表头部 插入链表尾部 hash算法 复杂 简单。 红黑树效率高,提高查询效率的地方由红黑树实现,
2024-12-31 21:28:57
235
原创 HashMap、TreeMap、LinkedHashMap的区别
1. 都属于 Map:Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复;2. 都是线程不安全的;
2024-12-31 21:23:16
369
原创 List排序的方法
字段,最后返回比较结果,按照成绩降序、年龄升序(成绩相同时)的规则对列表进行了排序,循环打印出排序后的用户信息展示了排序效果。),最终返回比较结果来确定元素顺序,按照成绩降序、年龄升序(成绩相同时)的规则对列表进行了排序。方法定义了默认的按照数字大小的增序排序逻辑,所以列表会按照从小到大的顺序被排序,从打印结果。进行排序,循环打印结果展示了按照成绩降序、年龄升序(成绩相同时)的规则排序后的用户信息。操作的是对象),它默认会按照自然顺序(在这里就是数字从小到大的顺序)对元素进行排序;
2024-12-31 21:08:30
861
原创 使用 Comparable 和 Comparator 接口对集合排序
如果你需要根据不同的标准或在不同场景下对同一类型的对象进行排序,可以实现 Comparator 接口并重写 compare() 方法。当你希望一个类的对象能够按照某种自然顺序进行排序时,可以实现 Comparable 接口 并重写 compareTo() 方法。实现 Comparator<T> 接口:其中 T 是要比较的对象类型。返回值 < 0 :表示当前对象小于传入的参数;返回值 = 0 :表示当前对象等于传入的参数;返回值 > 0 :表示当前对象大于传入的参数;返回值 > 0 :表示 x > y;
2024-12-31 20:09:53
470
原创 集合(List、Set、Map)ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、HashMap
当创建ArrayList对象时,如果使用的是无参构造器,则elementDate初始容量为0,第一添加时,会扩容到10,再次扩容时elementDate容量会扩容到10*1.5=15,以此类推;扩容机制:创建Vector对象时,如果使用的是无参构造器,则elementDate初始容量为10,如果需要扩容时,会扩容到2倍,以此类推;如果使用的是有参构造器,则elementDate的初始容量为指定的大小,如果需要扩容时,则直接扩容为2倍,以此类推;以后再扩容,table和临界值都扩大两倍32和24,以此类推;
2024-12-31 10:28:48
1683
原创 Spring IOC 和 AOP
在这个例子中,CalculatorCglibProxy 类实现了 MethodInterceptor 接口,在 intercept 方法中添加了日志记录的逻辑,通过 Enhancer 类动态生成目标类的子类作为代理对象,在代理对象的方法执行时,会先执行前置日志记录,再调用目标方法(通过 MethodProxy 调用原方法),最后执行后置日志记录,实现了对目标方法的增强,而且这种方式不需要目标类实现接口,适用范围更广。这是一种更便捷、常用的基于注解初始化容器的方式。
2024-12-16 23:36:26
991
原创 subList与原始List相互影响
它不是独立的副本,而是原始列表的一部分。因此,任何对subList或原始列表的修改都会相互影响。由于subList强引用了原始列表,可能导致不必要的内存占用,甚至引发 内存溢出(OOM) 错误。如果你需要一个真正独立的子列表,应该使用来创建一个新的ArrayList包含subList的内容。这将确保两个列表之间的操作不会相互影响,并且避免潜在的内存问题。
2024-12-13 19:02:01
1179
原创 ArrayList扩容的原理
ArrayList 是基于数组实现的动态列表,它内部维护了一个Object[ ] elementData 数组来存储元素。elementData 的大小决定了 ArrayList 的容量(capacity),而实际包含的元素数量是由 size 字段表示。当向 ArrayList 中添加新元素时,如果当前容量不足以容纳新元素,则需要进行扩容操作。
2024-12-12 17:53:05
787
原创 Java中的ArrayList、LinkedList如何进行线程安全的操作、为什么ArrayList不是线程安全的?
后续操作这个List对象时,实际上修改的是原来 ArrayList 里的数据;在这个过程中,尽管两个线程都进行了扩容判断,但由于线程调度的原因,线程A完成了扩容,而线程B在扩容前就已经决定不再扩容,从而导致了线程B直接使用了旧的数组长度信息,进而访问了超出数组边界的位置(即。例如,在一个有大量读操作和少量写操作的系统中,像配置信息列表的读取和偶尔的修改场景,使用 CopyOnWriteArrayList 可以在保证线程安全的同时,提高读操作的并发性能。,它比较适用于读多写少的并发场景。
2024-12-11 17:47:33
2110
原创 List与Set、数组与ArrayList、ArrayList与LinkedList的区别
类型的数组,每个元素占用 4 个字节,如果知道数组的起始地址和元素的索引,就可以通过简单的乘法和加法运算来计算出元素的内存地址。对象或其他自定义对象)本身在内存中的位置是由 Java 虚拟机的内存管理系统根据内存的使用情况动态分配的,不一定是连续的。(ArrayList 内部维护的是一个对象引用数组,这些引用在内存中是连续存放的。这种连续存储的方式使得数组在随机访问时效率很高,因为可以通过计算偏移量直接定位到元素的内存位置。(在内存中,数组的元素是按照顺序依次存储在一块连续的内存空间中的。
2024-12-09 20:58:02
1075
原创 Java-自动拆箱/装箱/缓存/效率/String和包装类相互转换
只不过编译器帮我们自动完成了从基本类型到包装类型的转换这一过程,这个机制使得代码编写更加简洁和方便,符合 Java 中面向对象操作的风格,因为在很多面向对象的场景里(比如将值存储在集合中,集合元素要求是对象类型),基本类型需要先转换为包装类型才能参与操作。对于“int1 == integer1” 比较,由于 Integer 与 int 进行 “==” 比较时,Integer 会自动拆箱成 int 类型,相当于两个 int 类型比较,所以结果也是 true。对象,所以是可以转换的),然后提取出其包装的。
2024-12-09 19:00:12
1494
原创 Class.forName() 和 ClassLoader 的关系与区别
Class.forName(String className) 是一个静态方法,它接受一个字符串形式的全限定类名作为参数,并返回相应的Class 对象。默认情况下,Class.forName() 不仅会加载指定的类,还会触发该类的初始化(即执行静态代码块和静态变量初始化)。每个应用程序都有一个关联的类加载器,通常是由系统提供的默认列加载器(如 AppClassLoader),但也可以自定义。注册自己,而注册操作通常是放在驱动类的静态初始化块中完成的。用来动态加载数据库驱动程序的类。在 JDBC 编程中,
2024-12-07 10:31:17
1177
原创 使用Java反射机制实例化对象
Java反射机制(Refletion)提供了一种在运行时检查或“自省”类的能力,并能够操作内部属性,如构造函数、方法和字段等。通过反射,你可以在不知道具体类型的情况下创建对象实例、调用方法或访问字段。
2024-12-07 09:41:17
423
原创 四大访问修饰符(public、protected、default、private)
public、protected、default、private
2024-12-06 22:24:38
709
原创 接口中的default方法
在Java8之前,接口的定义有着严格的语法控制,接口中只能声明方法签名,不能包含方法体,所有方法都是抽象方法,这就要求实现接口的类必须去实现接口中定义的每一个方法。方法的引入很好地遵循了二进制兼容性原则,因为有了它,往现存接口中添加新的方法时,那些已经实现了该接口的类可以不用立即去实现新增的这个方法,程序依然能够正常编译和运行,也就不会破坏原有的代码结构和功能,方便了接口的功能扩展以及对已有代码的兼容。方法时,就会执行实现类中重写后的这个方法,避免了接口中。方法,且方法体的实现输出不同的内容(分别是。
2024-12-04 23:35:42
784
空空如也
改写简单计算器,利用循环结构使得简单计算器在一次运行后可以重复多次使用
2021-11-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人