自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Git相关的命令

本文介绍了Git版本控制系统的基本概念和常用操作。主要内容包括:Git的工作区、暂存区和版本库的关系;文件提交、版本回退、分支管理等核心操作;远程仓库的克隆、推送和拉取;标签创建与管理等。重点讲解了git add、commit、push/pull等常用命令的使用方法,以及分支合并、冲突解决和bug修复等团队协作技巧。文章还涵盖了.gitignore文件配置、SSH密钥设置等实用内容,为开发者提供了全面的Git使用指南。

2025-09-02 15:30:17 1226

原创 网页五子棋测试

本文介绍了一款基于Java开发的网页版五子棋对战系统。系统采用SpringBoot+SSM框架,集成WebSocket实现实时对战功能,MySQL存储用户数据。主要功能包括用户注册登录、积分匹配、实时对战和胜负判定。测试结果表明,系统在功能、界面和基本性能方面表现良好,但在高并发场景下存在响应延迟问题。测试采用自动化测试框架,覆盖注册、登录、匹配、落子和胜负判定等核心功能,验证了系统在不同浏览器上的兼容性。项目实现了低延迟、易上手的五子棋在线对战体验,但仍有优化空间以提升高并发性能。

2025-08-10 20:30:25 1065

原创 模拟实现消息队列:构建轻量级消息中间件

本文详细介绍了如何从零实现一个轻量级消息队列系统。首先分析了核心需求,包括生产者、消费者和Broker的交互机制,以及交换机、队列、绑定等关键概念。然后设计了系统架构,重点阐述了消息持久化方案(SQLite数据库+文件存储)、内存数据结构、虚拟主机路由规则等核心模块的实现。文章还讲解了网络通信协议设计,包括自定义二进制协议和请求/响应模型。最后通过生产者-消费者案例展示了系统使用方法。该项目完整实现了消息队列的基本功能,为理解中间件原理提供了实践参考。

2025-07-18 16:31:49 899

原创 从0到1开发网页版五子棋:我的Java实战之旅

摘要:本文介绍了一个基于Java开发的网页版五子棋在线对战系统。系统采用SpringBoot+MyBatis框架,使用WebSocket协议实现实时通信,支持用户注册登录、天梯匹配、实时对战和战绩记录等功能。通过分级匹配机制确保游戏公平性,利用WebSocket双向通信特性实现低延迟的对战体验。系统包含用户模块(MySQL存储)、匹配模块(多线程队列管理)和对战模块(胜负判定算法)三大核心部分,具有结构清晰、性能稳定等特点,为在线棋类游戏开发提供了完整的技术解决方案。

2025-07-16 22:36:59 1330

原创 算法练习7-岛屿数量

摘要:岛屿数量问题要求统计二维01矩阵中由相邻'1'组成的岛屿数量(相邻指上下左右)。解题采用深度优先搜索(DFS)算法,遍历矩阵时遇到未访问的'1'就启动DFS标记所有相连的'1',岛屿计数加1。示例代码使用方向数组实现DFS遍历,并用访问数组避免重复统计。算法时间复杂度为O(M×N),需遍历每个元素;空间复杂度为O(M×N),来自递归栈和访问数组。例如输入[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]输出3,表示有3个独立岛屿。

2025-07-14 21:41:17 295

原创 算法练习6-大数乘法(高精度乘法)

摘要:本文介绍了大数乘法的字符串实现方法,通过模拟竖式运算解决两个超长数字字符串的相乘问题。算法步骤包括:反转字符串便于低位运算、逐位相乘并累加、处理进位、构建结果字符串并去除前导零。代码实现采用StringBuilder处理字符串反转和拼接,时间复杂度为O(m²),空间复杂度为O(m),其中m为较长字符串长度。该方法有效解决了传统整数类型无法处理超大数字相乘的问题,适用于0≤n≤10¹⁰

2025-07-12 21:37:49 675

原创 算法练习5-原地移除数组中所有的元素

摘要:本文介绍了两种原地移除数组中指定元素的高效算法。双指针法通过左右指针协作遍历数组,时间复杂度O(n),空间复杂度O(1)。优化版则减少不必要的元素赋值,当目标值出现在数组开头时性能更优。文章以电商产品列表下架为例说明实际应用场景,比较了两种方法的适用性,为处理数组元素删除提供了实用解决方案。(150字)

2025-07-10 17:06:55 493

原创 算法题练习4-杨辉三角

杨辉三角是中国古代数学成就,展示二项式系数排列和组合数性质。本文介绍了其特性:每行两端为1,非首尾元素等于上方两元素之和。通过Java代码实现生成过程,利用两层循环构造三角形,时间复杂度为O(n²)。该算法展示了如何运用基础数据结构和数学规则解决实际问题,是理解递归和动态规划的经典案例。

2025-07-09 12:25:21 261

原创 算法题练习3-判定链表是否是回文串

摘要:判断链表是否为回文结构的高效算法,要求时间复杂度O(n)、空间复杂度O(1)。核心步骤:1)快慢指针找中点;2)反转后半链表;3)比较前后两部分。关键点:处理边界情况后,通过快慢指针定位中点,反转后半段后同步遍历比较节点值。算法分析:三步操作均为O(n)时间,仅用常数空间,满足题目要求。该方案简洁高效,适用于长度≤900的链表。

2025-07-08 12:34:17 352

原创 算法题练习2-数字统计

核心思想是将当前位拆分为三部分:高位(high)、当前位(current)、低位(low)所以时间复杂度为:O((y−x+1)×log⁡n)十位:20, 21, 22 → 共 3 次。个位:2, 12, 22 → 共 3 次。如果当前位是 "2",则计数器加一。不适合处理大规模数据(如。分类讨论不同情况下的贡献值。可高效处理大数据范围(如。,使用循环依次取出每一位。对于每一位,根据当前位。适用于小数据范围(如。不需要逐个检查每个数字。

2025-07-07 11:46:08 421

原创 算法题练习1--消失的数字

该问题要求在包含0到n的数组中找出缺失的数字。提供了两种高效解法:1)异或法:利用a^a=0的特性,先异或0到n所有数,再异或数组元素,剩下即为缺失数;2)求和法:计算0到n的理论总和与实际数组和的差值。两种方法时间复杂度均为O(n),空间复杂度O(1)。异或法避免了整数溢出问题,求和法则更直观易理解。示例输入[0,1,3,4]均能正确输出缺失数字2。

2025-07-06 09:01:25 213

原创 UDP:一个不靠谱但极速的网络英雄

在网络协议的世界里,UDP(User Datagram Protocol,用户数据报协议),就像一位性格火爆又追求速度的快递小哥,不讲究繁文缛节,只讲究——送达!了解了他的行李(报文结构)和行程风格(特点与注意事项),你也能更好地选择什么时候"叫小哥出发",什么时候"找绅士帮忙"!UDP 这位快递小哥,虽然"不靠谱",但在很多需要速度优先的场景里,没有人比他更合适!虽然小哥很快,但也有需要注意的地方,否则容易"丢件"或者"找不到人"!想象一下:你在一个大夜市里搞直播卖货,声音要快,动作要快,消息要快!

2025-04-27 10:19:32 1113

原创 解锁栈与队列:掌握数据结构的精髓,献给追求卓越的你

例如,Web服务器处理客户端请求时,通过线程池可以有效地控制同时处理的最大请求数量,避免因创建过多线程而导致的性能下降或系统崩溃。当用户点击“后退”按钮时,当前页面(即栈顶元素)会被弹出(pop),然后显示之前的一个页面。顾客到达银行时,他们的号码会被加入队列的尾部。应用场景:这种机制非常适合于需要追踪一系列操作,并允许用户按顺序撤销这些操作的应用场景,比如浏览器的历史记录、文本编辑器的撤销功能等。应用场景:任何需要按照请求到达的顺序处理请求的情况都可以使用队列,如任务调度系统、打印队列等。

2025-04-26 16:34:50 1011

原创 网络世界探秘:从IP到响应,揭秘两台主机如何“聊天”!

今天,我们就来用一个通俗有趣的方式,带你了解网络通信背后的“秘密”。你到了朋友家(IP地址),但你是去客厅找他聊微信,还是去书房给他送文件?端口号就像“客厅101室”这样的房间编号,帮你找到正确的地方。,每一台连接到网络的设备(我们称为“主机”)都有一个独一无二的IP地址。你上门找朋友 → 找到他家地址 → 敲对的房间门 → 开始聊天 → 他把照片和信息递给你 → 你带回来看。一个主机(比如你的电脑)可以同时运行多个应用程序,比如浏览器、微信、QQ……你和外国朋友聊天,如果他只会英文,你得也用英文和他说。

2025-04-16 11:52:35 790

原创 多线程环境下的哈希表:HashMap、Hashtable 和 ConcurrentHashMap 的爱恨情仇

大家好,我是你们的代码小助手!它们在多线程环境下表现大相径庭,有的像新手司机开车(容易出事故),有的像老司机带锁链(安全但慢吞吞),还有的像赛车手开跑车(又快又稳)。线程安全:Hashtable 是个严格的老司机,它的每个方法都加了 synchronized 锁,确保多线程环境下的安全性。高效扩容:它的扩容机制堪称黑科技,每次只搬运一小部分元素,其他线程可以继续操作,真正做到了“化整为零”。总结来说,Hashtable 就像是一个带着厚重锁链的老司机,虽然安全,但速度慢得让人怀疑人生。

2025-04-10 08:45:00 1252

原创 探索文件与流的世界:File、InputStream 和 OutputStream 的奇妙之旅

在编程的世界里,文件和数据流就像一位位勤劳的邮递员,负责将信息从一个地方传递到另一个地方。今天,我们将一起踏上一场生动的旅程,揭开 Java 中 File 类以及 InputStream 和 OutputStream 的神秘面纱。InputStream 是一个抽象类,它是所有字节输入流的父类,专门用于从文件或其他来源中读取数据。你需要知道哪些文件夹里有笔记,哪些文件是重要的,哪些文件需要删除。getPath() 和 getAbsolutePath():获取文件的路径,就像找到一本书在书桌上的具体位置。

2025-04-09 18:41:01 548

原创 深入浅出:从IO到文件系统,探索计算机存储的奥秘

在 Java 中,IO 是一个非常重要的部分,涉及读取和写入数据的各种方式。通过这篇博客,我们用 Java 语言深入浅出地了解了 IO、存储、硬盘和文件系统的核心概念,并通过代码示例展示了如何在 Java 中操作文件系统。在 Java 中,我们经常需要将数据从内存写入硬盘(持久化存储),或者从硬盘读取到内存中进行处理。例子:假设你想从键盘输入你的名字,然后打印出来,这就涉及到输入(键盘)和输出(屏幕)。2. 辅助存储(硬盘、SSD等):速度慢一点,但容量大、价格便宜,适合长期保存数据。

2025-04-09 17:53:39 735

原创 Java中的synchronized锁:从魔法图书馆到高效线程同步

synchronized 优化一. 线程安全:为何需要同步?想象你正在一座神奇的魔法图书馆中。这座图书馆里有着无数珍贵且独一无二的书籍,每本书都是一个共享资源。如果你和你的朋友们都想同时阅读同一本书,而没有规则来管理你们的行为,那么可能会出现混乱的局面:有人可能会不小心撕破书页,甚至为了抢夺某本书而发生争执。为了避免这种情况,我们需要一种方式来确保每个人都能有序地借阅书籍而不破坏它们。这就是线程安全的重要性所在。

2025-04-09 09:45:00 2692

原创 线程池:程序员的“线程管家婆”

大家好,今天我们要聊一聊 Java 中的 线程池。线程池可以说是程序员的好帮手,它就像一个“管家婆”,帮你管理线程,让你省心省力。接下来,我们将用生动有趣的方式总结线程池的相关知识。一. 线程池是什么?想象一下,你是一个餐厅老板。每天有很多顾客(任务)来吃饭,你不可能每次来一个顾客就雇一个服务员(线程)吧?这不仅浪费资源,还容易导致混乱。所以聪明的你决定雇佣一个固定数量的服务员团队(线程池),让他们轮流接待顾客(处理任务)。这就是线程池的核心思想!

2025-04-08 00:00:18 2064

原创 线程安全大冒险:从混乱到和谐的旅程

通过这场冒险,我们学会了如何识别和巧妙应对线程安全的各种怪兽,无论是借助同步机制的力量、选用合适的线程安全类,还是通过避免共享可变状态来预防问题,每一个策略都是确保程序世界和谐稳定的关键。无论是争夺宝石的小精灵、神秘的魔法镜子、狡猾的商人还是被困的骑士,它们都揭示了多线程编程中常见的线程安全问题。但是,如果你在一个遥远的城堡里更新了镜子上的信息,而你的朋友们却看不到这个变化,直到他们走进城堡亲自查看。幸运的是,我们可以通过创建一个训练有素的魔法军团(线程池),让他们高效地完成任务,同时减少不必要的麻烦。

2025-04-07 11:00:00 2250

原创 Java线程生命周期探秘:六种状态的转换与核心机制

在 Java 中,线程是并发编程的核心概念之一。理解线程的状态及其切换条件对于编写高效、正确的并发程序至关重要。本文将详细讲解 Java 线程的几种状态、每种状态的含义以及状态之间的切换条件。一、线程的状态图二、状态详细说明1. 初始状态(NEW)线程对象已经被创建,但尚未调用 start() 方法启动线程,这意味着线程处于未启动状态且不会被执行。只有当调用了 start() 方法之后,线程才会进入 RUNNABLE 状态,开始准备运行。2.1。

2025-04-06 12:20:18 857

原创 Java多线程编程:从Thread类入门到精通的艺术之旅

一、认识线程-Thread类1. Thread类的常见构造方法想象一下,Thread 就像一个魔法盒,不同的构造方法就像是开启这个盒子的不同钥匙。最常见的几把“钥匙”包括:(1) 无参构造方法:new Thread()这是最基础的创建方式,就像你拿到了一个未命名的魔法盒。你可以稍后通过重写 run() 方法给它赋予任务。输出结果:(2) 带任务的构造方法:new Thread(Runnable target)这种方式相当于在创建魔法盒的同时,直接给它指定了要执行的任务(比如跳舞或唱歌)。

2025-04-06 10:49:52 886

原创 进程与线程:并行世界的双子星

进程(Process)是操作系统资源分配的基本单位。一个进程可以看作是一个正在运行的程序实例,它拥有独立的内存空间、文件句柄、寄存器状态等资源。每个进程都有自己的地址空间,彼此之间相互隔离,互不干扰。线程(Thread) 是进程内部的一个执行单元,也是 CPU 调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源(如内存、文件句柄等),但每个线程有自己的栈空间和寄存器状态。进程和线程是操作系统实现多任务处理的核心机制,各自扮演着不可或缺的角色。

2025-04-04 18:23:12 905

原创 揭开Linux进程调度的神秘面纱:Java开发者的基础教程

进程调度是操作系统内核的一项核心功能,它负责决定在何时以及哪个进程可以使用 CPU 资源。特别是在多任务操作系统中,如 Linux 系统,多个程序似乎同时运行,但实际上单个 CPU 核心在任意时刻只能执行一个进程。因此,为了模拟并行处理和提高系统效率,需要通过进程调度来管理和分配 CPU 时间给不同的进程。1.进程在 Linux 中,进程是系统进行资源分配和调度的基本单位。每个进程都有独立的地址空间、执行状态(例如:运行、就绪、等待)、打开文件和其他系统资源。

2025-04-03 19:36:19 1052

原创 从零到精通:解锁Java中TreeMap与TreeSet的排序魔法 ----知识篇

TreeMap是Java集合框架中的一员,它实现了SortedMap接口,能够存储键值对,并根据键的自然顺序进行排序,或者通过在构造时提供的Comparator来进行排序。// 使用自然顺序(键需实现Comparable接口)// 使用自定义Comparator// 按降序排序TreeSet是Java集合框架中的一员,它实现了SortedSet接口,主要用于存储不重复的元素,并且这些元素会按照自然顺序或通过提供的Comparator进行排序。

2025-03-24 17:44:58 1254

原创 HashMap与HashSet:Java开发者不可不知的两大神器!-----知识总结篇

HashMap是Java中实现Map接口的一种数据结构,它基于哈希表机制存储键值对(key-value pairs)。HashMap允许一个键对应一个值,并且特别之处在于它可以包含一个null键和多个null值。这种灵活性使得HashMap在处理各种数据时都非常方便,但同时也要求开发者在使用时更加小心,特别是涉及到null值的场景。HashSet是Java中实现Set接口的一种数据结构,它不允许存储重复的元素。

2025-03-23 20:24:38 1017

原创 解锁二叉树:高效存储与搜索的秘密武器

这篇博客为大家提供一个全面了解二叉树的窗口,从基本概念到Java实现示例,再到其在数据搜索、表达式解析等领域的应用。二叉树不仅是算法学习的基石,也是解决实际问题的强大工具。尽管本文覆盖了许多关键点,但二叉树的世界依然广阔,值得进一步探索。

2025-03-22 17:58:31 1008

原创 算法之魂:深入剖析数据结构中的七大排序算法

在计算机科学领域,排序是一项基础但至关重要的操作。无论你是处理数据库查询结果还是优化搜索效率,了解不同的排序算法及其适用场景都至关重要。本文将介绍并简要分析数据结构中最常用的七种排序算法,以及它们的时间/空间复杂度和稳定性信息。

2025-03-18 11:38:56 1337

原创 数据结构的艺术:如何使用Java打造高性能双链表

双链表由一系列节点组成,每个节点不仅存储数据,还维护了与前驱和后继节点的引用。这种设计使得我们可以在O(1)的时间复杂度下完成插入和删除操作,前提是已经找到了目标节点的位置。然而,双向引用也带来了一些额外的空间开销,因此在选择使用双链表之前,需要权衡时间和空间的需求。通过本文,我们一起深入探讨了如何使用Java构建一个高效的双链表,并详细分析了其基本操作的时间复杂度和应用场景。作为你的技术向导,我希望这些内容不仅能帮助你掌握双链表的核心概念,还能激发你在实际项目中灵活运用这一强大工具。

2025-03-09 18:32:38 1005

原创 动手实践:构建一个功能完备的Java单链表

通过本文的学习,我们掌握了如何使用Java语言构建一个单链表,并实现了其基本操作。这不仅加深了对链表的理解,也为后续学习更复杂的数据结构打下了坚实的基础。希望这篇博客能够帮助你在编程学习的道路上迈出坚实的一步。如果你有任何问题或建议,请在下方留言交流!

2025-03-08 13:03:21 648

原创 多态:探索Java面向对象编程中的动态行为

多态性是面向对象编程的一种特性,它允许同一个接口或方法在不同的对象中表现出不同的行为。具体来说,多态通过方法重载(编译时多态)和方法覆盖(运行时多态)实现,使得一个基类的引用可以指向其派生类的对象,并调用相应的方法而无需关心具体的对象类型。这种机制不仅简化了代码结构,还增强了程序的灵活性和可扩展性,使得开发者能够编写更加通用和复用性高的代码。例如,无论是圆形还是矩形对象,都可以通过相同的“绘制”接口进行操作,但每个对象执行的具体绘制逻辑可能完全不同。

2025-03-05 18:36:00 816

原创 数据结构之旅:自己动手实现顺序表

在本博客中,我们详细介绍了如何从零开始实现一个顺序表(MyArrayList),包括其基本原理、类定义与属性、核心方法及错误处理。通过定义存储数据的数组elem、记录已使用元素数量的usedSize和默认容量DEFAULT_SIZE,并实现添加、删除、获取等关键方法,我们深入理解了动态数组的工作机制。此外,我们还探讨了边界检查和容量扩展逻辑,确保代码的健壮性。这次实践不仅提升了编程技能,还增强了对数据结构的掌握,是一次非常有价值的学习经历。

2025-03-05 16:25:06 1119

原创 Java SE 学习路径与关键概念总结

Java SE(Java Standard Edition)是Java平台的标准版,提供了构建桌面应用程序、服务器端应用以及嵌入式系统的必要工具和库。它包含了Java编程语言的核心功能,并且是其他版本(如Java EE和Java ME)的基础。Java SE的核心组件包括Java编程语言本身、Java虚拟机(JVM)以及标准类库。Java编程语言是一种面向对象的高级编程语言,支持多线程和网络编程。

2025-02-27 18:05:48 1331

原创 继承:掌握Java面向对象编程的核心扩展机制

Java中的继承是一种机制,允许一个类(子类)从另一个类(父类或超类)继承字段和方法。

2025-02-25 17:53:13 471

原创 封装:深入理解Java面向对象编程的三大支柱之一

封装是面向对象编程(OOP)中的三大基本概念之一,与继承和多态并列。它是指将对象的状态信息(属性)尽可能地隐藏在对象内部,不允许外部程序直接访问或修改这些状态信息,而是通过对象提供的接口进行访问和修改。

2025-02-24 17:13:41 812

原创 Java的一些习题

获取一个数二进制序列中所有的奇偶数位, 分别输出二进制序列递归求解汉诺塔问题求斐波那契数列的第n项。(迭代实现)

2025-02-22 16:23:30 474

原创 Java编写程序数一下1到100的所有整数中出现多少个数字9

为了计算从1到100的所有整数中数字9出现的次数,我们将个位和十位上的数字9分别进行统计。在个位上,数字9出现在以下整数中:9, 19, 29, 39, 49, 59, 69, 79, 89, 99,共10次。在十位上,数字9出现在以下整数中:90, 91, 92, 93, 94, 95, 96, 97, 98, 99,也共10次。因此,将个位和十位上的数字9出现次数相加,总共是20次。所以,从1到100的所有整数中,数字9出现了20次。还有错误的示范,以下这种情况少算一个9,因为99有2个9。

2025-02-20 19:14:32 433

原创 初识C语言——C语言语言类型

C语言中的基本数据类型及其长度、有符号与无符号类型的差异、以及算术操作符的使用。首先介绍了内置和自定义数据类型,随后通过代码展示了如何用sizeof函数获取各种数据类型的大小。接着,解释了有符号(可表示正负数)和无符号(仅非负数)整数的区别及应用场景。最后,详细说明了常见的算术操作符如加法、减法、乘法、除法、取余等,并举例说明了前缀与后缀递增操作符的不同使用方法及其效果。

2025-02-19 16:36:52 540

原创 初知C语言—C语言常见概念

C语言是由Dennis M. Ritchie在1972年开发的,专为UNIX操作系统设计。它高效、灵活,支持低层硬件控制和高级语言特性。通过ANSI和ISO标准(如C90、C99),C语言成为广泛使用的编程语言,影响了C++等语言的发展。它以执行效率高、对硬件支持好著称,并且拥有丰富的库函数和强大的字符串处理能力。

2025-02-18 21:58:55 797

原创 编写未来:一名新手程序员的学习之路

编程对我来说不仅仅是一项技能,更是一种探索未知世界的方式。我期待着在这个旅程中不断成长,并且希望能在不久的将来分享更多关于C语言和其他技术领域的见解。

2025-02-18 19:59:50 333

空空如也

空空如也

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

TA关注的人

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