自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 收藏
  • 关注

原创 浅谈redis中的RDB和AOF

Redis 支持 RDB 和 AOF 两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

2026-02-11 10:34:55 633

原创 redis虽然是单线程模型,为啥效率这么高呢?速度这么快呢?

redis虽然是单线程模型,为啥效率这么高呢?速度这么快呢?

2026-02-06 12:25:38 52

原创 redis 的key的过期策略是怎么实现的?

redis 的key的过期策略是怎么实现的

2026-02-06 12:05:47 31

原创 浅谈Java中的反射

Java反射机制允许程序在运行时动态获取类的信息并操作对象,包括访问私有成员、调用方法等。反射的核心是Class类,可通过Class.forName()、类名.class或对象.getClass()三种方式获取Class对象。反射常用于框架开发,如Spring通过反射读取配置动态创建和管理Bean,实现解耦和灵活性。通过反射,框架无需硬编码具体类名,只需根据配置信息(如XML或注解)动态加载类,实现依赖注入等功能。反射机制使框架能够通用化,避免与业务代码紧密耦合,只需修改配置即可扩展功能,提高了系统的可维护

2026-02-01 19:14:16 618

原创 浅谈JVM

本文总结了JVM面试中的核心知识点:1)JVM内存区域划分,将进程申请的内存划分为不同用途区域;2)类加载机制的五阶段流程(加载、验证、准备、解析、初始化)及双亲委派模型;3)垃圾回收机制,重点分析堆内存的回收策略,包括可达性分析和分代回收算法。文章系统梳理了JVM的关键运行原理,包括内存管理、类加载和垃圾回收三大核心机制,为Java面试提供重要参考。

2026-01-12 14:56:50 887

原创 Spring框架中的单例bean是线程安全的吗?

如上图所示,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这时多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单例状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。比如:我们通常在项目中使用的Spring bean都是不可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话,就需要自行保证线程安全。那么Spring框架中的单例bean是线程安全的吗?

2026-01-07 21:05:45 175

原创 Redis中缓存相关的总结

缓存穿透指的是查询一个一定不存在的数据时,由于存储层查不到数据因此不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能会导致 DB 挂掉。在这种情况大概率是遭到了攻击。解决方案的话,我们通常都会用布隆过滤器来解决它。那么什么是布隆过滤器呢?布隆过滤器主要是用于检索一个元素是否在一个集合中。它的底层原理是,先初始化一个比较大的数组,里面存放的是二进制0或1。一开始都是0,当一个key来了之后,经过3次hash计算,在模数组长度找到数据的下标,然后把数组中原来的0改为1。

2025-12-04 16:10:51 513

原创 搞懂git原理和操作(一)

Git版本控制入门指南 本文介绍了Git版本控制系统的基本概念和操作。主要内容包括: Git安装方法(Linux/Windows) 基本操作:创建仓库、配置用户、文件添加/修改/删除 版本管理:查看历史记录、版本回退、撤销修改 分支管理:创建/切换/合并分支、解决冲突 远程仓库简介 文章详细讲解了工作区、暂存区和版本库的关系,并通过具体示例演示了Git常用命令的使用方法,如git init、git add、git commit、git log、git reset等。同时还介绍了分支的创建、合并和删除操作,以

2025-09-19 15:48:49 1034

原创 java对象的比较

Java中优先级队列(PriorityQueue)需要比较元素大小,但自定义对象默认无法比较。文章介绍了三种比较方式:1)覆写Object.equals()方法,但只能比较相等性;2)实现Comparable接口并重写compareTo()方法,实现固定比较规则;3)使用Comparator比较器,通过单独的比较类实现更灵活的排序。PriorityQueue支持后两种方式,Comparable是默认比较方式,Comparator则提供更灵活的比较规则。通过实现这些比较机制,可以确保自定义对象能够正确插入优先

2025-08-16 15:18:15 619

原创 几分钟理解迭代器

本文对比了C语言与Python在数据遍历上的差异。传统C语言需要手动编写循环条件来遍历数组或链表,容易引发错误;而现代语言如Python通过迭代器机制简化了这一过程。Python的for循环会自动处理可迭代对象,使用iter()获取迭代器,并自动捕获StopIteration异常作为遍历结束标志。这种设计提高了代码的安全性和简洁性,避免了传统遍历方式中常见的循环条件错误问题。

2025-06-29 20:41:51 209

原创 五子棋对战乐园项目测试报告

本文介绍了一个基于Javaweb开发的五子棋网络对战系统。项目实现了用户注册登录、天梯匹配和五子棋对战等核心功能,并通过Selenium框架进行了自动化测试。系统采用MVC架构,前端使用HTML/CSS/JS,后端使用Java Servlet。测试部分重点实现了用户管理、游戏匹配和对战流程的自动化测试,包括异常处理和多账号登录检测。自动化测试通过WebDriverManager管理浏览器驱动,使用随机算法模拟玩家落子,覆盖了从注册到对战的完整流程。测试结果表明系统功能完整,用户交互流畅,为类似的网络对战游戏

2025-06-09 14:57:56 687

原创 Linux常用命令(软件测试工程师必备)

软件测试工程师必会命令

2025-06-03 14:48:02 229

原创 个人博客系统测试报告

文章总结了作者在学习SpringBoot后,基于个人需求开发了一个博客系统,并进行了详细的测试。项目功能包括登录、博客列表展示、博客发布与删除、注销等。测试主要使用Selenium进行UI自动化测试,涵盖了登录、博客列表、博客详情等页面的功能测试,并记录了测试用例和实际结果。测试过程中遇到了一些问题,如弹窗截图异常、元素定位失败等,并提供了相应的解决方法。最后,作者总结了测试结果,指出了系统中的BUG,并提出了优化建议,如同步文章数量、改进弹窗提示等,以提升用户体验。

2025-05-12 16:46:39 1318

原创 Linux常见基础命令

本文通过Xshell终端来获取Linux环境.

2025-04-28 17:14:15 745

原创 总结设计测试用例的万能公式

现在有⼀款产品,要求我们对“⻔锁”设计测试⽤例,假如你是测试⼈员,你会怎么设计呢?

2025-04-21 16:04:12 606

原创 总结Spring IOC和DI

容器是⽤来容纳某种物品的(基本)装置。⽣活中的⽔杯,垃圾桶,冰箱等等这些都是容器。我们之前的数据存储容器, List/Map, web容器 Tomcat其实我们在一开始学习框架的时候, 在类上⾯添加 @RestController 和 @Controller 注解,就是把这个对象交给Spring管理,Spring框架启动时就会加载该类.把对象交 给Spring管理,就是IoC思想.IoC: Inversion of Control (控制反转),也就是说Spring是⼀个"控制反转"的容器.

2025-04-11 20:50:10 788

原创 总结 MyBatis 的XML实现方法

MyBatis XML的⽅式需要以下两步:配置数据库连接字符串和MyBatis写持久层代码。

2025-03-31 20:49:10 990

原创 总结 MyBatis 的注解实现方法

• MyBatis是⼀款优秀的持久层框架,⽤于简化JDBC的开发。• MyBatis本是Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了googlecode,并 且改名为MyBatis。2013年11⽉迁移到Github。在上⾯我们提到⼀个词:持久层持久层:指的就是持久化操作的层,通常指数据访问层(dao),是⽤来操作数据库的。

2025-03-31 20:30:31 1106

原创 总结 Spring 中存储 Bean 的相关注解以及这些注解的用法.

对于同⼀个类,如何定义多个对象呢?⽐ 如多数据源的场景,类是同⼀个,但是配置不同,指向不同的数据源@Bean@Bean定义了多个对象的话,我们根据类型获取对象,获取的是哪个对象呢?运行结果:报错信息显⽰:期望只有⼀个匹配,结果发现了两个,userInfo,userInfo2.从报错信息中,可以看出来,@Bean注解的bean,bean的名称就是它的⽅法名.接下来我们根据名称来获取bean对象//获取Spring上下⽂对象//@Bean演示Bean的存。

2025-03-24 22:13:38 1144

原创 总结 HTTPS 的加密流程

HTTPS也是⼀个应⽤层协议.是在HTTP协议的基础上引⼊了⼀个加密层.HTTP协议内容都是按照⽂本的⽅式明⽂传输的.这就导致在传输过程中出现⼀些被篡改的情况.上篇文章中已经介绍到了臭名昭著的运营商劫持案件, 这里再介绍一下.下载⼀个天天动听 未被劫持的效果,点击下载按钮,就会弹出天天动听的下载链接已被劫持的效果,点击下载按钮,就会弹出QQ浏览器的下载链接。

2025-03-14 20:37:18 1154

原创 总结 HTTP 协议的基本格式, 相关知识以及抓包工具fiddler的使用

HTTP(全称为"超⽂本传输协议")是⼀种应⽤⾮常⼴泛的应⽤层协议.什么叫超文本呢? 就是超越文本, 不止可以传输字符串, 还能够传输图片, 文字, 视频, 音频....尤其对Java开发来说, http比tcp还重要.

2025-03-14 10:07:07 1757

原创 总结数据链路层相关知识

数据链路层的代表协议是以太网协议, 以太这个词出自于物理学.最初人们认为,光是一种波. 光能在真空中传播, 波都需要介质. 那么人们就脑补在真空中存在一种物质,称为"以太". 后来迈克尔逊–莫雷实验做了一个实验, 光在各个方向上传播速度都是一样的(光速不变前提), 这样就推翻了以太的存在. 但是以太这个词, 再互联网这个圈子中还是保留了下来.我们平时使用的网线, 也叫做"以太网线"我们平时使用的交换机, 也叫做"以太网交换机"以太网这个协议, 既涉及到数据链路层的内容也涉及到物理层的内容/

2025-03-11 14:46:17 414

原创 总结IP协议的相关特性

所谓的IP地址,其实是一个32位的整数(4字节), 但是我们平时看到的并不是一系列二进制数字, 而是点分十进制. 由于按照32位的方式表示, 就会使这个数字变的很大, 很难理解记忆. 一般都会把IP地址, 按照点分十进制的方式来表示.32位表示的数据量非常有限,无符号的话只有42亿9千万. 既然是"“地址",原则上是不能重复的.(每个设备的ip 得不相同). 现在全世界能上网的设备, 其实早都超出这个数字了~~(达到百亿级别了).

2025-03-11 14:03:33 634

原创 总结TCP协议的相关特性

TCP全称为"传输控制协议(TransmissionControlProtocol").⼈如其名,要对数据的传输进⾏⼀个详细 的控制;表⽰数据是从哪个进程来,到哪个进程去;后⾯详细讲;表⽰该TCP头部有多少个32位bit(有多少个4字节);4个bit位能表示的范围是0-15, 而这里的单位是四个字节, 所以TCP头部最⼤⻓度是15* 4 = 60字节.而TCP报头的前20个字节是固定的(就是抛去选项和数据部分), 也就是说TCP报头最短是20个字节.

2025-03-10 17:49:54 1124

原创 总结 UDP 的报文结构和注意事项

传输层主要用的协议是UDP和TCP.

2025-03-07 21:22:27 337

原创 总结网络中的一些基本概念

⽹络互连的⽬的是进⾏⽹络通信,也即是⽹络数据传输,更具体⼀点,是⽹络主机中的不同进程间, 基于⽹络传输数据。那么,在组建的⽹络中,如何判断到底是从哪台主机,将数据传输到那台主机呢?这就需要使⽤IP地 址来标识。

2025-03-05 21:46:36 900

原创 浅谈⽂件操作和IO

文件是在硬盘上存储数据的一种方式. 操作系统帮我们把硬盘的一些细节都封装起来了. 程序猿只需要了解文件相关的接口即可. 而硬盘用来存储数据的, 和内存相比, 硬盘的存储空间更大, 访问速度更慢, 成本更低, 是一种持久化存储. 操作系统通过"文件系统"这样的模块来管理硬盘.可能你的电脑上面有好几个盘, 但实际上我们的电脑上只有一个硬盘, 是操作系统通过文件系统把这一个硬盘抽象成多个硬盘.NTFS windows 上的文件系统,背后有一定的格式来组织硬盘的数.EXT4 Linux上常见的文件系统.

2025-03-04 21:25:28 924

原创 总结 HashTable, HashMap, ConcurrentHashMap 之间的区别

HashTable是一个线程安全的哈希表实现,它继承自Dictionary类。HashTable使用 synchronized 方法来确保线程安全,这意味着在多线程环境中,多个线程可以同时访问HashTable,而不会导致数据不一致。HashMap是一个线程不安全的哈希表实现,它继承自类。HashMap不使用同步方法,因此在多线程环境中,需要手动同步或使用其他线程安全机制。

2025-03-03 16:06:03 461

原创 浅谈七大排序算法(详细讲解加代码实现)

1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN )3. 空间复杂度:O(logN)4. 稳定性:不稳定1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。2. 时间复杂度:O(N*logN)3. 空间复杂度:O(N)4. 稳定性:稳定排序算法最好时间复杂度最坏时间复杂度平均时间复杂度空间复杂度是否稳定插入排序O(n)O(n²)O(n²)O(1)是希尔排序。

2025-03-03 14:55:07 1326

原创 总结Callable 接⼝,信号量Semaphore ,CountDownLatch

这些都是JUC中的常见类.

2025-02-25 22:05:01 266

原创 浅谈Java中的CAS

什么是CASCAS: 全称Compare and swap,字⾯意思:”⽐较并交换“.能够比较和交换某个寄存器中的值和内存中的值, 看是否相等. 如果相等,则把另外一个寄存器中的值和内存中的值进行交换. CAS有哪些应用呢?比如, 多线程针对一个count变量进行++. 在java标准库中, 已经提供了一组原子类.基于CAS 实现更灵活的锁,获取到更多的控制权. 但是遇到一些极端的场景就不一定了. 可如果是3个线程呢?虽然上述操作,概率比较小,也需要去考虑. 假设上述情况出现的概率是万分之一,

2025-02-25 21:21:13 255

原创 总结synchronized与ReentrantLock

在了解synchrnized之前, 我想和你说一说锁的概念.

2025-02-25 11:49:56 914

原创 浅谈死锁的原因以及解决方案

死锁就是两个人(或两个线程)互相等对方,结果谁也动不了。在生活中,这种情况很常见,比如两个人互相等对方先让路,结果谁也走不了。在编程里,也是类似的道理,只是换成了线程和资源。

2025-02-23 22:11:31 562

原创 总结常见的锁策略

注意: 接下来总结的锁策略不仅仅是局限于 Java . 任何和 "锁" 相关的话题, 都可能会涉及到以下内容. 这些特性主要是给锁的实现者来参考的. 普通的程序猿也需要了解⼀些, 对于合理的使⽤锁也是有很⼤帮助的.

2025-02-23 18:06:13 224

原创 谈谈对线程的认识

这里的时间主要是消耗在申请资源上的. 进程是系统分配资源的基本单位. 这其中, 内存分配就是一个大活, 操作系统内部有一定的数据结构把空闲的内存分块管理好. 当我们去进行申请内存的时候, 系统就会从这样的数据结构中找到一个大小合适的空闲内存, 返回给对应的进程.一个进程, 最开始的时候, 至少要有一个线程. 这个线程负责完成执行代码的工作. 也可以根据需要,创建出更多的线程, 从而使当前实现"并发编程"的效果. 每个线程都可以独立地执行一段代码.每一个线程, 也有状态, 优先级, 上下文,记账信息....

2025-02-21 22:26:23 347

原创 简单模拟实现一个线程池

• newScheduledThreadPool: 设类似于定时器的效果.添加一些任务,任务都在后续的某个时刻再执行.被执行的时候不是只有一个扫描线程来执行任务, 可能是由多个线程共同执行所有的任务.• 使⽤ Executors.newFixedThreadPool(10) 能创建出固定包含 10 个线程的线程池.池(Pool)是一个非常重要的思想方法. 内存池, 进程池, 连接池, 常量池......• newSingleThreadExecutor: 创建只包含单个线程的线程池.

2025-02-21 20:42:38 349

原创 模拟实现Java中的计时器

定时器是⼀种实际开发中⾮常常⽤的组件. ⽐如⽹络通信中, 如果对⽅ 500ms 内没有返回数据, 则断开连接尝试重连. ⽐如⼀个 Map, 希望⾥⾯的某个 key 在 3s 之后过期(⾃动删除). 类似于这样的场景就需要⽤到定时器.定时器也是软件开发中的⼀个重要组件. 类似于⼀个 "闹钟". 达到⼀个设定的时间之后, 就执⾏某个指定好的代码. 前端/后端中都会用到计时器.• schedule 包含两个参数. 第⼀个参数指定即将要执⾏的任务代码, 第⼆个参数指定多⻓时间之后 执⾏ (单位为毫秒).

2025-02-21 13:18:20 1008

原创 模拟实现Java中的阻塞队列

阻塞队列是⼀种特殊的队列. 也遵守 "先进先出" 的原则.阻塞队列是⼀种线程安全的数据结构, 并且具有以下特性:• 当队列满的时候, 继续⼊队列就会阻塞, 直到有其他线程从队列中取⾛元素.• 当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插⼊元素.阻塞队列的⼀个典型应⽤场景就是 "⽣产者消费者模型". 这是⼀种⾮常典型的开发模型.

2025-02-19 22:00:01 272

原创 总结单例模式的写法(在线程安全的情况下)

啥是设计模式?设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀ 些固定的套路. 按照套路来⾛局势就不会吃亏. 软件开发中也有很多常⻅的 "问题场景". 针对这些问题场景, ⼤佬们总结出了⼀些固定的套路. 按照这 个套路来实现代码, 也不会吃亏.单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例.单例模式具体的实现⽅式有很多. 最常⻅的是 "饿汉" 和 "懒汉" 两种。

2025-02-19 21:25:33 959

原创 谈谈 wait 和 notify

多线程调度是随机的, 很多时候希望多个线程能够按照咱们规定的顺序来执行. 完成线程之间的配合工作. wait和notify就是一个用来协调线程顺序的重要工具. 这俩方法都是 Object 提供的方法.随便找个对象,都可以使用wait和notify.

2025-02-17 21:21:58 331

JavaSE思维导图(总结)

自己做的思维导图

2023-12-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除