自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 几分钟理解迭代器

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

2025-06-29 20:41:51 146

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

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

2025-06-09 14:57:56 561

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

软件测试工程师必会命令

2025-06-03 14:48:02 183

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

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

2025-05-12 16:46:39 1172

原创 Linux常见基础命令

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

2025-04-28 17:14:15 694

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

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

2025-04-21 16:04:12 545

原创 总结Spring IOC和DI

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

2025-04-11 20:50:10 686

原创 总结 MyBatis 的XML实现方法

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

2025-03-31 20:49:10 825

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

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

2025-03-31 20:30:31 1037

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

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

2025-03-24 22:13:38 1066

原创 总结 HTTPS 的加密流程

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

2025-03-14 20:37:18 1019

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

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

2025-03-14 10:07:07 1591

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

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

2025-03-11 14:46:17 368

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

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

2025-03-11 14:03:33 591

原创 总结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 1077

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

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

2025-03-07 21:22:27 297

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

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

2025-03-05 21:46:36 857

原创 浅谈⽂件操作和IO

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

2025-03-04 21:25:28 878

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

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

2025-03-03 16:06:03 364

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

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 1211

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

这些都是JUC中的常见类.

2025-02-25 22:05:01 236

原创 浅谈Java中的CAS

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

2025-02-25 21:21:13 210

原创 总结synchronized与ReentrantLock

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

2025-02-25 11:49:56 851

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

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

2025-02-23 22:11:31 478

原创 总结常见的锁策略

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

2025-02-23 18:06:13 148

原创 谈谈对线程的认识

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

2025-02-21 22:26:23 324

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

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

2025-02-21 20:42:38 309

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

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

2025-02-21 13:18:20 844

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

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

2025-02-19 22:00:01 231

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

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

2025-02-19 21:25:33 920

原创 谈谈 wait 和 notify

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

2025-02-17 21:21:58 298

原创 浅谈线程安全问题的原因和解决方案

上述的代码中两个线程, 针对同一个变量, 进行循环自增. 各自自增5w次,预期最终应该是10w, 但实际上,并不是这样的结果. 每次运行的结果都不一样, 并且还都是错的.在多线程下,发现由于多线程执行,导致的bug, 统称为"线程安全问题". 如果某个代码, 在单线程下执行没有问题, 多个线程下执行也没问题, 则称为"线程安全",反之就可以称为"线程不安全".那么啥是bug呢?

2025-02-16 22:05:15 786

原创 总结 Java 线程的几种状态

一个线程在没执行star方法之前是NEW状态, 执行start方法后就会是RUNNABLE状态, 此时如果是sleep造成的堵塞, 线程状态就会变成TIMED_WAITING, 要是wait造成的堵塞, 线程状态就会变成WAITING, 要是synchronized造成的堵塞, 线程状态就会变成BLOCKED.其实这里所提到的状态, 就是pcb里的状态字段, 系统设定将线程分为了就绪状态和堵塞状态, 但是在Java中, 把上述状态又做了划分. 就是以下六种.

2025-02-16 16:45:22 167

原创 总结Thread的基本用法

Runnable这里则是分开了,把要完成的工作放到Runnable 中, 再让Runnable和Thread配合.lambda表达式, 本质上就是一个"匿名函数". 这样的匿名函数, 主要就可以用来作为回调函数来使用.当我们使用并发编程的方式,来完成某个工作时, 就可以用Runnable描述这个工作的具体细节.这种方法就是把线程要执行的任务和线程本身,进一步的解耦合了.使用线程池的方式,就可以使用Runnable搭配线程池使用.使用多线程的方式,就可以使用Runnable搭配线程使用.

2025-02-12 21:16:46 698

原创 谈谈Thread类中run和start的区别

当我们点击运行程序的时候, 就会先创建出一个java进程, 这个进程中就包含了至少一个线程, 这个线程也叫做主线程, 也就是负责main方法的线程.start()方法执行时, 会调用系统api, 在系统内核中把线程对应的pcb啥的给创建出来并管理好, 新的线程就参与调度了.run()方法只是上面入口的方法(普通的方法), 并没有调用api, 也没有创建出真正的线程.每个线程都能被独立地调度执行。

2025-02-12 11:08:32 237

原创 浅谈进程和线程的区别和联系

这使得线程切换更快,更适合高并发场景。因为进程的上下文较大,所以进程切换的开销相对较大。创建进程的时候把分配资源的工作给做了, 后续创建线程, 直接共用之前的资源即可. (这里的资 源大概指的是内存指针和文件描述符表所对应的资源)而线程是多个线程公用一份地址空间, 一个线程一旦抛出异常, 就可能会导致整个进程异常结束, 多个线程之间容易相互影响.1. 进程包含线程. 都是为了实现并发编程的方式, 线程比进程更轻量.2. 进程是系统分配资源的基本单位, 线程是系统调度执行的基本单位.

2025-02-08 14:13:05 286

原创 谈谈MySQL中的索引和事务

索引相当于一本书的目录(index), 在一个表里有很多数据, 在查询表的时候, 最基本的方式就是遍历表,一条一条地进行筛选. 因此,就可以给这个表,来建立索引来提高查找的速度, 而索引是以"列"为维度进行建立的.表中有很多列, 查询的时候, 查的方式也有区别. 有的时候, 是按照id来查询. 有的时候, 是按照name来查. 还有的时候, 是按照邮箱来查.

2025-01-21 20:25:32 1109

原创 浅谈对进程的认识

操作系统是一个搞管理的软件1.对下,要管理各种硬件设备.2.对上,要给应用程序提供一个稳定的运行环境.进程(process), 是一个正在运行的程序.比如, 大家都有的qq, 或者电脑上运行的软件.同一个程序,运行多次, 就可能会产生出多个进程.平时所说的程序,指的是一些exe的可执行文件.得是把程序跑起来,才会涉及到"进程".程序, 是可执行文件.它只是在硬盘上的一个东西(静态的)如果双击程序,此时操作系统, 就会把可执行文件中的数据和指令,加载到内存中,并且让。

2025-01-09 22:38:36 728

原创 MySQL表的增删改查(进阶)

是把"行之间的关系"转换成"列之间的关系", 在SQL中,编写条件,条件都是列和列之间进行比较。SELECT 中使用 GROUP BY 子句, 就是指定一个列, 按照这个列进行分组, 这一个列中数值相同的会被放到同一组. 每个分组中, 都可以使用上述聚合函数来进行计算.笛卡尔积中,有的数据靠谱, 有的数据不靠谱.(靠谱指的是笛卡尔积表达的情况和客观情况是一致的)笛卡尔积,就是把两个表里的记录,按照排列组合的方式,构造成一个更大的表了.尤其是表的本身的记录比较多的情况=>多表联合查询, 也是非常低效的.

2025-01-04 17:41:19 1149

原创 优先级队列(堆)

Java集合框架中提供了和两种类型的优先级队列,是线程不安全的,是线程安全的,本文主要介绍。关于PriorityQueue的使用要注意:1. 使用时必须导入PriorityQueue所在的包,即:2. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出 ClassCastException异常3. 不能插入null对象,否则会抛出NullPointerException4.没有容量限制,可以插入任意多个元素,其内部可以自动扩容5.

2024-12-04 20:48:40 963

JavaSE思维导图(总结)

自己做的思维导图

2023-12-18

空空如也

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

TA关注的人

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