自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis-常见数据类型及应用场景

Redis数据类型及其应用场景 Redis提供了多种数据类型,每种类型都有特定的内部实现和应用场景: String:最基本类型,底层采用int、SDS结构,适用于缓存、分布式锁和共享Session。常用命令包括set/get/mset等。 List:底层采用双向链表或压缩列表(3.2+版本改为quicklist),适用于消息队列实现。通过LPUSH/RPOP实现先进先出,BRPOP实现阻塞读取。 Hash:底层采用压缩列表或哈希表(7.0+改为listpack),适用于存储对象信息如用户资料、购物车等。

2026-01-07 20:59:17 922

原创 在线抽奖系统自动化测试

本文介绍了在线抽奖系统Web自动化测试的全过程。该系统为企业活动提供抽奖解决方案,包含奖品管理、人员管理、活动创建和抽奖等核心功能。测试采用Java+Selenium框架,搭建了包含41个测试用例的自动化测试环境,覆盖登录、奖品管理、人员管理、活动管理和抽奖等模块。测试结果显示所有用例均通过验证,系统功能稳定可靠。测试代码采用模块化设计,封装公共方法提高复用性,并通过断言验证结果。该自动化测试方案有效提升了测试效率,确保系统上线质量。

2025-09-25 14:37:19 1081

原创 Jmeter性能测试工具的使用

本文介绍了性能测试相关概念与JMeter工具的使用。性能测试包括基准测试、并发测试、负载测试等类型,主要指标有并发数、吞吐量、响应时间等。JMeter作为性能测试工具,可通过配置线程组、HTTP请求、结果树等组件实现测试,支持参数化、断言、并发控制等功能。文章详细说明了如何通过CSV数据文件模拟多用户,使用同步定时器实现并发,以及使用事务控制器组合接口。最后介绍了性能测试的三种执行方式(GUI/CLI/分布式)和性能分析三要素:响应时间、错误率和吞吐量,指导如何通过这些指标判断系统瓶颈。

2025-09-21 23:58:57 1002

原创 常见的排序算法总结

本文介绍了常见的排序算法及其特性。主要内容包括:1)排序算法的稳定性定义;2)七大排序算法分类(插入、选择、交换、归并);3)各算法实现原理、时间复杂度、空间复杂度及稳定性分析。其中插入排序(直接、希尔)、选择排序(直接、堆)、交换排序(冒泡、快速)和归并排序均有详细Java代码示例。总结指出,归并、插入、冒泡排序是稳定的;选择、希尔、堆排序和快速排序不稳定;时间复杂度从O(n²)到O(nlogn)不等,空间复杂度O(1)到O(n)不等。

2025-09-09 15:53:37 751

原创 JVM:内存区域划分、类加载的过程、垃圾回收机制

JVM内存管理与垃圾回收机制解析 JVM是Java程序运行的核心,采用字节码机制实现跨平台特性。其运行时数据区分为堆(对象存储)、虚拟机栈(方法执行)、本地方法栈、程序计数器和元数据区(类信息)。变量存储位置取决于类型:局部变量在栈,成员变量在堆,静态变量在元数据区。 类加载过程包括加载、验证、准备、解析和初始化五个阶段,采用双亲委派模型确保安全性,通过Bootstrap、Extension和Application三类加载器实现层级加载。 垃圾回收采用可达性分析法判断对象存活,通过四种引用类型(强、软、弱、

2025-09-01 21:37:07 823

原创 设计模式 | 常见的设计模式(单例、工厂、代理、适配器、责任链等等)

本文介绍了七种常见设计模式及其应用场景:1. 单例模式(饿汉式/懒汉式/双重校验锁)确保全局唯一实例;2. 工厂模式(简单工厂/抽象工厂)解耦对象创建;3. 代理模式(静态/动态)控制对象访问;4. 适配器模式(类/对象)解决接口兼容问题;5. 策略模式封装算法族实现灵活切换;6. 责任链模式构建处理链;7. 模板模式定义算法骨架。文中通过具体代码示例(如电影代理、USB转TypeC适配器等)说明各模式的实现方式,并分析了项目实践中的应用案例(如抽奖状态扭转系统),强调了解耦、复用和扩展性等设计优势。

2025-08-31 19:02:58 741

原创 Set和Map

摘要:本文详细介绍了Java集合框架中的Set和Map接口及其实现类。Set接口的HashSet、LinkedHashSet和TreeSet分别基于哈希表、双向链表和红黑树实现,各有不同的特性和适用场景。重点分析了HashMap的底层原理,包括哈希函数、扰动函数、扩容机制和哈希冲突解决方法(链地址法和红黑树)。对比了JDK1.7和1.8中HashMap的差异,1.8版本引入了红黑树优化性能。此外,还介绍了ConcurrentHashMap的线程安全实现方式(分段锁和CAS),以及TreeMap和Linked

2025-08-29 19:07:01 1077

原创 List | 常见的List实现类(ArrayList、LinkedList、Vector)以及ArrayList源码解读

本文介绍了Java集合框架中的List接口及其三种常见实现类:ArrayList、LinkedList和Vector。ArrayList基于数组实现,支持快速随机访问但不适合频繁插入删除;LinkedList基于双向链表实现,适合频繁插入删除但随机访问效率低;Vector是线程安全的ArrayList版本但性能较低。文章详细解析了ArrayList的初始容量机制(懒加载)和扩容策略(默认1.5倍扩容),并对比了ArrayList和LinkedList在不同位置添加元素的性能差异:首部添加LinkedList

2025-08-27 21:05:06 942

原创 常见的加密算法:对称加密、非对称加密、摘要加密

本文介绍了三种常见的加密算法:对称加密(如AES)、非对称加密(如RSA)和摘要加密(如MD5、SHA256),并重点讲解了如何在Java项目中应用这些算法保护敏感数据。对称加密适合手机号等需要解密的场景,非对称加密安全性更高但速度较慢,摘要加密则适用于密码存储。文章详细演示了使用Hutool工具实现AES加密和SHA256加密的代码示例,并针对MD5存在的安全隐患,提出了一种自定义加盐加密方案。该方案通过UUID生成盐值,将盐值与密码拼接后进行MD5加密,有效提升了数据安全性。最后提供了完整的加盐加密和验

2025-08-03 00:47:34 1176

原创 记录一种 Java 自定义快速读的方式,解决牛客中运行超时问题

本文分享了一种解决牛客网”dd爱框框“题目超时问题的Java快速读方法。原题要求找到数组中和≥x的最短连续子数组,使用双指针解法思路正确但提交仅通过20%用例。问题根源在于Scanner输入效率低,改用自定义Read类(基于BufferedReader和StringTokenizer)实现快速输入后成功通过。该Read类提供了next()、nextInt()等方法,显著提升了数据读取效率。这一优化方案适用于需要处理大规模输入的场景,体现了算法竞赛中IO优化的重要性。

2025-07-08 21:18:45 371

原创 网络原理 | TCP协议的常见核心机制

TCP可靠传输机制的核心技术包括确认应答、超时重传、滑动窗口和连接管理等。确认应答通过序号和确认序号实现数据有序接收,超时重传动态调整超时时间处理丢包问题。滑动窗口允许批量发送数据提升效率,快速重传针对丢包进行优化。连接管理通过三次握手建立连接和四次挥手释放连接确保通信可靠性。流量控制和拥塞控制分别从接收端和网络链路角度调节发送速率。延时应答和捎带应答机制进一步提升了传输效率。这些机制共同构成了TCP的可靠传输体系,在保证数据准确性的同时兼顾了网络性能。

2025-06-16 20:55:11 984 1

原创 网络原理 | TCP协议与UDP协议的报文格式

摘要:端口号用于区分网络进程,范围0-65535,其中0-1023为知名端口(如HTTP:80、HTTPS:443)。UDP协议采用8字节固定报头,最大报文长度64KB,包含16位校验和确保数据可靠性。TCP协议则更为复杂,包含32位序号/确认号、6位标志位(SYN/FIN等)、窗口控制和20-60字节可变报头,通过校验和与伪首部机制保证传输完整性。两者均采用2字节端口号标识,超出范围会被截断处理。(149字)

2025-06-10 15:53:43 643

原创 网络原理 | TCP与UDP协议的区别以及回显服务器的实现

TCP和UDP是传输层两大核心协议,主要区别在于:TCP提供可靠连接、面向字节流传输,适合文件传输等场景;UDP是无连接、不可靠但高效的协议,适合实时性要求高的应用。基于UDP实现回显服务器需使用DatagramSocket和DatagramPacket类,而TCP实现则使用ServerSocket和Socket类,通过流对象进行数据传输。TCP服务器需注意多线程处理并发连接和缓冲区刷新问题。两种协议各有所长,TCP保证数据准确性,UDP则更注重实时性,开发者应根据具体需求选择适合的传输协议。

2025-05-26 14:21:54 1295

原创 合并K个升序链表

本文介绍了如何合并K个升序链表的问题。题目要求将多个已按升序排列的链表合并为一个升序链表。解题思路是通过两两合并的方式,逐步减少链表数量,直到最终合并为一个链表。文章提供了两种实现方式:一种是通过ListNode数组传入链表,另一种是通过ArrayList传入链表。对于每种方式,文章详细介绍了如何选择传入的链表对进行合并,并提供了相应的代码实现。此外,文章还复习了ArrayList的常见操作,以便更好地理解和使用ArrayList来解决类似问题。通过本文,读者可以掌握合并多个升序链表的方法,并熟悉相关的数据

2025-05-18 23:34:06 737

原创 网络原理 | 网络基础概念复习

IP地址是网络通信中用于标识主机或设备的核心概念,通常以点分十进制表示,便于识别。端口号则用于区分同一主机上的不同应用程序,确保数据正确传递。协议是网络通信的基础,规定了数据交互的规则,确保发送和接收方能够正确解析数据。五元组(源IP、源端口、目的IP、目的端口、协议号)唯一标识一个通信会话。网络协议采用分层结构(如OSI七层模型和TCP/IP五层模型),每层专注于特定功能,降低了系统的复杂性和耦合性。封装和分用是数据传输的关键过程,数据在发送时逐层封装,接收时逐层解析,确保信息准确传递。

2025-05-15 22:15:04 1223

原创 文件操作和IO(下)

在上一篇文章中,主要介绍了在Java中如何进行文件系统操作,具体见博客:在本篇中主要介绍如何对文件内容进行操作。对于文件内容的操作,主要使用流对象来进行,具体可以分为两个大类:字节流和字符流,下面将详细展开两种方式的具体细节和使用示例。

2025-05-08 20:59:51 962

原创 文件操作和IO(上)

文件按照层级结构进行组织(类似于数据结构中的树型结构),将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式,一种是绝对路径,另一种是相对路径。绝对路径:从树型结构的角度来看,树中的每个结点都可以被一条从树的根结点开始,并到达该结点的路径所描述,将这种描述方式称为文件的绝对路径(Absolute Path)。相对路径:除了从根结点出发,也可以从任意结点出发来找到目标结点,这种描述方式称为相对路径(Relative Path),相对于当前结点的一条路径。

2025-04-22 22:14:53 1078

原创 Anaconda下的tensorflow安装

下面是安装tensorflow的命令,使用下列指令安装前需要配置好CUDA,关于CUDA的配置在上一篇博客中有详细的步骤描述。关于Anaconda的安装以及配置可以浏览我的上一篇博客。与上面图片一样则说明tensorflow环境安装成功。

2024-04-15 23:52:03 1502

原创 pytorch环境配置

GPU版本选择cu,后面cp37的意思是python3.7版本,使用离线安装不涉及网络问题。更改红色框选的路径为下图cmd.exe后面的内容之后重启pycharm终端即可。找到与CUDA、python、torch相对应的torchvision版本。如果支持CUDA11.x,建议先安装CUDA11.3,下载链接。离线下载的优势是不出错,相对于在线下载方式很有优势。查看torchvision是否安装成功。查看GPU能够支持的最高CUDA版本。输入下列命令查看CUDA是否安装成功。查看已经创建的虚拟环境。

2024-04-15 23:12:15 1681 3

原创 实验六~Web事件处理与过滤器

实验六~~~

2023-04-30 00:27:49 1915

原创 实验五~JDBC数据库访问与DAO设计模式

【步骤3】创建兼具视图与控制器功能的JSP页面:编写displayBooks.jsp页面,使用动作调用BookDAO查询所有图书的信息,以表格的形式显示所有图书的书号、书名、作者、价格和出版社名称。【步骤5】:创建showCustmer.jsp,显示所有客户的信息,每一条客户信息后面增加修改和删除超链接,编写ActionServlet.java控制器,调用DAO和传输对象实现对客户信息的删除和修改功能。创建数据库MySQL代码与插入数据代码。上面这部分需要改一下。

2023-04-24 22:46:02 2023 1

原创 Java多线程~谈谈自己对于synchronized、volatile关键字的理解,线程的状态转换以及创建线程的方式

创建一个线程,线程就进入了NEW状态,当调用start方法时,进入RUNNABLE状态,如果调用了wait、join等方法时就进入WAITING、TIMED_WAITING状态,当多个线程竞争同一把锁时,竞争失败的线程进入BLOCKING状态,线程执行完成后,进入TERMINATED状态。这里的轻量级锁是通过CAS实现的,通过CAS检查并更新一块内存,如果更新成功表示加锁成功,如果更新失败,则认为锁被占用,继续自旋式的等待(并不放弃CPU).自旋操作是一直让CPU进行空转,比较浪费CPU资源。

2023-03-17 12:18:44 751

原创 分享一个降低时间复杂度的方法~除自身以外数组的乘积

给你一个整数数组nums,返回 数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据 保证 数组nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请不要使用除法,且在O(n) 时间复杂度内完成此题。

2023-03-03 13:27:24 496

原创 浅谈对于封装、继承与多态的理解(Java)

在复习过程中,总结自己对于封装、继承、多态的理解,包括了如何在子类中访问父类的同名变量和方法,子类构造方法的定义与使用,根据代码块在继承顺序上的执行关系来谈谈初始化,在java中使用多态的条件、多态的体现以及多态的优缺点

2023-02-24 23:34:54 1183

原创 Java~对于代码块与内部类的理解

在复习过程中浅谈自己对于代码块与内部类的理解

2023-02-22 23:52:09 736

原创 数据结构~七大排序算法(Java实现)

数据结构~七大排序算法~Java实现~直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、针对快速排序的优化、归并排序

2023-02-18 00:42:51 498

原创 LeetCode Hot 100~Day3

LeetCode Hot 100~

2022-12-26 23:00:37 697

原创 LeetCode Hot 100~Day2

leetcode Hot 100~

2022-12-23 23:05:34 1567 2

原创 LeetCode Hot 100~Day1

挑战十天完成leetcode hot 100~第一天

2022-12-12 01:06:28 512

原创 算法学习 | 回溯算法之深度优先搜索常见题型练习

深度优先搜索(Depth First Search):深度优先搜索属于图算法的一种,其过程主要是对每一个可能的分支路径深入到不能再深入到为止,而且每个节点只能访问一次。深度优先搜索本质上就是暴力搜索,遍历了所有可能的情况,必然能得到解。DFS搜索的流程是一个树的形式,每次一条路走到黑。

2022-11-27 22:22:22 1250

原创 算法学习 | 深度优先搜索~一条道走到黑

深度优先搜索(Depth First Search):深度优先搜索属于图算法的一种,其过程主要是对每一个可能的分支路径深入到不能再深入到为止,而且每个节点只能访问一次。深度优先搜索本质上就是暴力搜索,遍历了所有可能的情况,必然能得到解。DFS搜索的流程是一个树的形式,每次一条路走到黑。深度优先搜索的关键是解决“当下该如何做”,下一步的做法和当下的做法是一致的。“当下如何做”一般是尝试每一种可能,用for循环遍历对于每一种可能确定之后,继续走下一步,当前的剩余可能等到从下一步回退之后再处理。

2022-11-25 21:20:38 1045 1

原创 Spring中Bean的作用域和生命周期

Bean的作用域是指Bean在Spring整个框架中的某种行为模式,比如singleton单例作用域,就表示Bean在整个Spring中只有一份,它是全局共享的,当其他人修改了这个值后,另一个人读取到的就是被修改的值.每次对该作用域下的Bean的请求都会创建新的实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配(通过@Autowired注入)都是新的对象实例。用户会话的共享bean,比如记录一个用户的登录信息,限定在Spring MVC中使用。

2022-11-22 22:54:40 725

原创 Spring中Bean对象的装配/注入(属性注入、构造方法注入、Setter注入)、@Autowired与@Resource的对比、如何解决同一类型多个bean的报错问题

构造方法注入是Spring推荐的注入方式,他的缺点是如果多个注入会显得比较臃肿,但出现这种情况应该考虑一下是否符合程序的单一职责的设计模式,它的优点是通用性,在使用之前一定要保证注入的类不为空。使用时设置的参数不同,相比于@Autowired,@Resource支持更多的参数设置,例如name设置,设置之后就可以根据name的值来获取Bean。也就是DI(依赖注入):将某个对象需要的依赖注入到属性中,常见的对象注入方法有属性注入、构造方法注入、Setter注入。构造方法注入是在类的构造方法中实现注入。

2022-11-21 20:27:14 1335

原创 Spring~五种存储Bean对象的类注解、方法注解(@Bean)以及Bean对象的获取

@Configuration是将其注册为配置类对象,在项目启动时需要准备一些配置信息,一般通过配置类来初始化,其他类注解都是注册为普通的Bean对象,主要是在软件分层后,在不同的分层使用。@Component注解是组件存储,除了明确含义的类注解作用外,其他的作用就可以使用@Component来进行注解,其默认也是单例的方式注册Bean对象。@Repository注解是仓库存储,数据访问层,一般是数据库的操作,其默认也是单例的方式注册Bean对象。此时就只能通过@Bean注解的方法名来获取Bean对象。

2022-11-21 14:23:23 2711

原创 初识Spring框架~控制反转IoC、依赖注入DI以及Spring项目的创建方式

对于Spring IoC容器来说,是管理Bean对象的容器.单纯从存放数据这个角度来看,Spring IoC容器与普通的集合框架一样,但使用Spring容器存放对象,对象不需要程序员手动去new,需要进行管理的对象,直接放入到容器中。因此,在学习Spring时,主要就是学会如何将对象存储到Spring中,再从Spring中获取对象的过程。依赖注入和控制反转其实是从不同的角度描述同一件事,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦.也可以说IoC是是思想,而DI是其具体的实现。

2022-11-20 23:05:35 437

原创 买卖股票的最好时机(一、二)

买卖股票是经典的动态规划问题,在动态规划的学习与练习中,最重要的是定义状态并根据状态进行方程递推,分别以贪心思想和动态规划来解决买卖股票的最好时期一和二

2022-11-20 00:02:32 465

原创 算法学习 | 动态规划经典练习题合集

动态规划思想~带权值的最小路径和、背包问题(二)、分割回文串-ii、编辑距离

2022-10-28 23:33:18 3515

原创 算法学习 | 动态规划~大事化小、小事化了

动态规划算法思想总结以及相关OJ题练习记录:斐波那契数列、拆分词句、三角形、不同的路径数目(一)

2022-10-27 23:33:13 844

原创 算法学习 | 贪心算法~通过局部最优的选择来得到整体最优解

贪心算法思想总结以及贪心算法相关OJ题:选择排序、平衡字符串、买卖股票的最佳时机 II、跳跃游戏、最多可以参加的会议数目

2022-10-26 21:42:02 2725 1

原创 网络原理 | UDP协议与TCP协议的对比、相关面试常见问题总结

TCP协议与UDP协议的对比,常见面试题的总结:为什么是三次握手而不是两次或四次?三次握手中能不能携带数据?为什么是四次挥手而不是三次?如何基于UDP协议实现可靠传输?CLOSE_WAIT与TIME_WAIT

2022-10-25 23:39:10 636 1

空空如也

空空如也

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

TA关注的人

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