- 博客(49)
- 收藏
- 关注
原创 网络编程:自定义协议设计&IO多路复用
本文深入探讨网络编程两大主题:自定义协议设计与IO多路复用。首先阐述了协议设计的核心步骤:明确传输内容与选择信息组织格式,对比分析了行文本、XML、JSON、Protobuf及自定义二进制的优缺点与场景,强调权衡要素及消息边界处理。接着以“买饭”类比解释IO多路复用(Java NIO Selector)相对BIO和NIO轮询的优势,拆解register、select、处理selectedKeys及remove操作,突出其省资源、高效率、快响应的特性。最后提供Java NIO代码示例,展示多路复用实践,助开发
2025-04-05 22:34:31
856
原创 TCP/IP五层模型:网络界的“俄罗斯套娃“大剧场
在互联网的底层架构中,TCP/IP五层模型(应用层、传输层、网络层、数据链路层、物理层)如同一个协同运作的“数字邮差系统”,以分层设计实现高效通信。应用层作为用户接口,通过HTTP、DNS等协议接收需求;传输层的TCP/UDP协议负责端到端可靠性保障,如同“数据保险公司”;网络层的IP协议扮演“导航专家”,规划跨网络路由路径;数据链路层通过MAC地址确保相邻节点精准投递;物理层则将数据转化为比特流进行光电传输。数据封装如同“俄罗斯套娃”:发送端自上而下逐层打包(消息→TCP段→IP包→MAC帧→比特流).
2025-03-31 22:02:00
634
原创 网络编程套接字:从快递包裹到智能客服
在UDP协议中,服务器像固定快递站(DatagramSocket 绑定端口),客户端如同流动快递员(端口由OS自动分配),通过数据包(DatagramPacket)传递信息,内核自动封装地址头。UDP无连接特性要求每次通信必须携带完整地址,如同包裹上的快递单。而TCP则像专业电话客服:服务器通过 ServerSocket 建立服务热线(三次握手),客户端 Socket 拨号连接。使用 Scanner 和 PrintWriter 包装字节流,实现从原始分拣到自动化流水线的升级——自动处理字符编码、缓冲区优化
2025-03-29 12:39:26
643
1
原创 Spring框架中的四层架构:一场代码世界的“办公室喜剧“
Spring框架的四层架构(Controller、Service、DAO、Model)如同公司中的四个部门,共同演绎高效协作的“代码喜剧”。Controller层是“前台接待”,通过@RestController处理HTTP请求,引导用户至正确服务;Service层扮演“中层经理”,以@Service封装业务逻辑,协调数据加工与流转;DAO层作为“数据专员”,通过@Repository专注数据库操作,提供原始数据支持;Model层则是“信息载体”
2025-03-17 22:05:38
938
原创 位图思想详解:用一个小小的比特征服整个世界
位图——用比特位征服海量数据!这种极简数据结构通过二进制位(0/1)高效。本文深入剖析位图原理:将元素映射到整数位,利用位运算实现O(1)复杂度操作。通过Java代码示例,演示如何用long[]数组管理千万级用户活跃状态,仅需传统布尔数组1/8内存!更拓展至布隆过滤器,揭示其如何通过多哈希位标记实现高效查重(允许误判,绝不漏判)。实战环节,以LeetCode“判断字符唯一性”为例,结合鸽巢原理与位图技巧,仅用26个比特位轻松解题。无论是海量数据处理,还是算法优化,位图以四两拨千斤的姿态,证明:小比特,大世界
2025-03-16 12:32:19
736
原创 JavaEE:多线程编程中的同步与并发控制
本文深入探讨了多线程编程中常见的同步与并发控制技术。首先介绍了 Callable 接口和 ReentrantLock 锁机制,展示了如何实现带有返回值的异步任务和可重入锁的使用。接着讨论了 Semaphore 信号量和 CountDownLatch 的应用场景,分别用于限制资源访问和协调多个线程的任务完成。在多线程操作集合时,分析了 ArrayList 和哈希表(如 HashMap、Hashtable、ConcurrentHashMap)的线程安全问题,并提出了多种解决方案,包括自行加锁等等
2025-01-27 13:34:13
1292
原创 JavaEE:多线程进阶
在多线程编程中,锁机制是确保线程安全的关键。我们探讨了可重入锁与不可重入锁的区别,前者允许同一线程多次获取锁,避免死锁;后者则限制了重复获取的可能性。公平锁和非公平锁的选择影响线程调度的效率与响应时间,公平锁按顺序分配资源,而非公平锁提高了吞吐量但可能导致“饥饿”。CAS(Compare-And-Swap)操作通过原子比较和交换实现无锁编程,适用于低竞争场景,但需注意ABA问题和自旋开销。自旋锁利用CAS不断尝试获取锁,适合短时间持有锁的情况,减少上下文切换开销。
2025-01-20 12:33:27
2003
原创 JavaEE:多线程初阶
在 Java 中,线程是独立的执行单元,多个线程共享进程的内存空间。通过继承 Thread 类或实现 Runnable 接口,可以创建并启动线程。然而,多线程环境可能引发线程安全问题,如数据竞争和不一致性。为解决这些问题,可使用同步机制(如 synchronized 关键字)或显式锁(如 ReentrantLock)。等待/通知机制(wait/notify)允许线程协调执行顺序,避免资源争用。在实际应用中,单例模式确保全局唯一实例,阻塞队列(如 BlockingQueue)用于实现生产者-消费者模型。
2025-01-16 19:25:10
616
原创 Optimal Algorithms:滑动窗口+二分查找
在技术探索的征程中,算法的优选与精析尤为关键。本文聚焦于五道经典算法题。二分查找凭借有序数组特性,以特定循环条件与中间元素计算策略,实现高效的 O(log n)时间复杂度查找。针对排序数组中元素区间查找,细致解读左右端点查找时循环条件设置与中间元素计算的巧妙差异,确保精准定位起始与结束位置。而无重复字符的最长子串、找到字符串中所有字母异位词以及串联所有单词的子串等题目,则从字符串处理角度出发,运用滑动窗口结合哈希表等技巧,深度挖掘其中的算法逻辑与优化思路,
2024-12-19 18:54:34
828
原创 Optimal Algorithms:滑动窗口
滑动窗口是一种高效的算法策略,在诸多字符串与数组处理问题中发挥关键作用。如在 “最大连续 1 的个数 III” 里,通过滑动窗口精准统计翻转 0 的数量以确定连续 1 的最大长度;“将 x 减到 0 的最小操作数” 借助其从两端逼近目标和;“水果成篮” 依据规则利用滑动窗口灵活处理水果采摘;“找到字符串中所有字母异位词” 则结合哈希表,滑动窗口高效定位异位词子串。它通过合理设定窗口边界并动态调整,有效减少计算冗余,在优化时间复杂度上表现卓越,为解决一系列复杂问题提供了简洁而有力的思路,值得深入探究与应用。
2024-12-09 17:17:14
963
原创 DataStructure.包装类&简单认识泛型
本文介绍了Java泛型的基本概念及其在编程中的重要作用。首先解释了什么是泛型,即允许在定义类、接口和方法时使用类型参数,提高了代码的复用性和类型安全性。接着,文章详细阐述了基本数据类型对应的包装类以及装箱和拆箱操作,展示了泛型如何支持基本类型。此外,文章还探讨了泛型的语法、使用方式以及类型推导机制,并通过示例代码展示了如何在类和方法中应用泛型。最后,文章提到了泛型的擦除机制和类型边界,以及如何在实际开发中有效使用泛型,避免常见的错误和陷阱。通过这篇技术博客,读者将能够深入理解Java泛型的核心概念。
2024-06-25 18:00:10
1170
原创 DataStructure.时间和空间复杂度
时间复杂度和空间复杂度的技术博客文章摘要时间复杂度和空间复杂度是衡量算法性能的两个关键指标。时间复杂度反映了算法执行速度,通过计算基本操作次数并用大O表示法简化,我们可以评估算法在不同输入规模下的运行效率。空间复杂度则关注算法执行过程中所需额外空间的大小,通常用变量个数衡量。尽管早期计算机存储容量有限,空间复杂度曾备受关注,但随着硬件发展,空间复杂度已不再是主要考量因素。然而,对于递归等算法,空间复杂度依然重要,因为递归调用会占用系统栈空间。在实际应用中,了解时间复杂度和空间复杂度有助于我们选择合适算法
2024-06-23 19:03:33
939
原创 Javase.图书管理系统基本框架
本文深入探讨了一个灵活且可扩展的图书系统的设计与实现。该系统基于面向对象的设计原则,通过继承、多态和接口等关键技术,构建了一个能够支持不同类型用户执行特定操作的逻辑框架。我们详细介绍了User类作为基础结构的重要性,并通过AdminUser和NormalUser两个子类展示了如何定制不同用户角色的功能和操作。此外,我们还剖析了操作集合与菜单系统的设计理念,以及如何通过接口实现操作的多态调用。该系统不仅满足了图书管理的基本需求,更在扩展性与灵活性方面表现出色,为未来功能的增加和修改提供了便捷的途径。
2024-06-23 13:08:37
2125
原创 Javase.认识异常
在Java开发中,异常处理是确保程序稳定性和可靠性的关键环节。这篇blog深入解析了Java异常的概念、体系、处理策略及自定义异常类。它介绍了异常的基本概念与分类,详细阐述了异常抛出、捕获与处理的最佳实践,包括防御式编程策略、try-catch结构的使用、以及finally块在资源清理中的作用。此外,还涵盖了自定义异常类以满足特定业务需求的重要性。通过学习本blog,读者可以深入理解Java异常处理机制,提升代码质量。
2024-06-21 22:23:19
2367
原创 Javase.String类的课后作业
本文探讨了Java中String类的核心知识点,通过一系列精选习题,深入分析String的不可变性、字符串比较、拼接和分割等常见操作。首先,文章强调了String类在Java编程中的重要性,随后通过习题的形式,展示了如何正确使用String类的方法。文章还讨论了String与StringBuilder、StringBuffer的性能差异,并提供了优化字符串操作的建议。最后,通过习题解答和技巧分享,旨在帮助读者加深对String类的理解,提高编程能力。
2024-06-21 13:16:59
970
原创 Javase.String 类
在Java编程中,String类无疑是最基础和最常用的类之一。本文档详细讲解了String类的重要性、基本用法、常见操作、字符串常量池的概念,以及StringBuffer和StringBuilder的区别。首先,我们认识到String类在面向对象编程中的优越性,其提供了丰富的构造方法和操作字符串的方法,如equals、compareTo、charAt等。接着,文档深入探讨了字符串比较的不同方式,包括==、equals、compareTo等,并强调了字符串的不可变性特性及其对性能的影响。最后,通过引入Stri
2024-06-20 23:08:15
919
原创 Javase.抽象类和接口
深入理解Java中的抽象类和接口在Java编程中,抽象类和接口是构建可扩展和灵活软件架构的重要工具。抽象类允许我们定义一种只能被继承而不能直接实例化的类结构,其中可以包含抽象方法和普通方法,用于提供部分实现或作为框架基类。接口则定义了多个类必须遵循的行为规范,其中所有方法都是抽象的,并允许实现多继承的概念。通过学习和掌握抽象类和接口,我们可以更好地设计出符合开放-封闭原则的系统,使得代码更易于维护和扩展。本文档深入探讨了抽象类和接口的概念、语法、特性及其在Java编程中的应用场景,为开发者提供了一份详尽
2024-06-19 23:26:55
1226
原创 Javase.继承和多态的课后练习题
当子类继承父类需要先初始化继承过来的父类的成员,此时需要通过super来完成。很明显在子类的构造方法当中,并没有通过super调用父类的构造方法。通过super.data就能知道访问的是父类的data。当子类继承父类之后,在实例化子类对象的时候,先要调用父类的构造方法,来帮助父类初始化。子类继承父类之后,会继承父类私有的数据,但是由于private访问修饰符的问题,子类没有办法直接访问该数据。主要疑问就是注释3处,此时A虽然不是C的直接父类,但是C依然间接继承了A的内容的,此时可以发生向上转型的。
2024-06-18 15:21:33
485
原创 Javase.继承和多态
这篇文章深入探讨了Java中的继承和多态概念。首先,文章解释了继承作为面向对象编程中代码复用的重要手段,通过子类继承父类来抽取共性,简化代码结构。接着,介绍了多态的概念,即同一操作作用于不同对象产生不同结果,并阐述了实现多态的必要条件。此外,还详细探讨了子类对父类方法的重写规则,以及向上转型和向下转型的应用场景和注意事项。最后,总结了多态带来的代码简化与扩展性强等优点,同时提醒开发者避免在构造方法中调用重写的方法,以保证代码的健壮性。
2024-06-17 14:34:53
688
原创 Javase.类与对象
在Java SE中,类与对象是面向对象编程的基石。类定义了对象的属性(成员变量)和行为(成员方法),而对象则是类的具体实例。通过实例化类,可以创建具有特定属性和行为的对象。封装是面向对象的重要特性,通过访问权限控制成员变量的可见性,实现数据的隐藏和保护。此外,静态成员变量和方法属于类本身,所有对象共享,而非静态成员则与具体对象相关联。Java中的内部类为封装提供了更灵活的方式,可以在一个类的内部定义另一个类。通过掌握类与对象的概念和特性,我们可以更有效地设计、扩展和维护大型Java程序
2024-06-13 22:54:27
913
原创 Javase.数组的基本语法
Javase数组技术博客文章摘要本文详细解读了Javase中的数组技术。数组,作为一种基础的数据结构,用于存储同类型数据的集合。我们将深入探讨Javase数组的声明、初始化、访问和修改等核心操作,以及多维数组的特性。通过具体的实例和代码片段,旨在帮助读者全面理解数组的概念和应用,从而在实际编程中更高效地运用这一数据结构,提升编程技能。
2024-06-09 16:51:22
1117
原创 C语言.数据结构.双向链表
本文详细介绍了如何使用C语言实现一个双向链表数据结构。双向链表相比单向链表提供了更好的功能性和灵活性,允许双向遍历。文章首先阐述了双向链表的基本概念,随后逐步展示了如何定义链表节点结构体,以及如何创建、插入、删除和遍历节点。通过阅读本文,读者将能够全面掌握C语言中双向链表实现的精髓,进而在实际编程中灵活运用,提升数据结构的运用能力和程序的效率。
2024-06-06 20:52:48
848
原创 C语言.数据结构.单链表经典算法
技术博客摘要:本博客深入探讨了单链表相关的经典算法题,包括移除链表元素、反转链表、查找链表的中间节点、合并两个有序链表等。同时,我们还解决了环形链表的约瑟夫问题和链表分割等高级问题。通过详细解析和算法实现,读者可以深入理解链表操作的核心原理,并提升解决链表相关问题的能力。这些算法不仅是数据结构课程的基础知识,也是软件工程师解决实际问题的有力工具。掌握它们,将能更高效地处理链表数据,优化程序的性能和稳定性。
2024-06-04 15:31:56
996
原创 C语言.数据结构.单链表
C语言数据结构单链表技术博客文章摘要本文深入探讨了C语言中的数据结构——单链表。首先,文章介绍了链表的概念及结构,强调了链表作为一种物理存储结构上非连续、非顺序的存储结构,其数据元素的逻辑顺序是通过链表中的指针链接次序实现的。通过将链表与火车车厢的类比,形象地展示了链表节点之间的独立性和链接关系。接着,文章详细阐述了单链表的实现方法,包括定义链表节点结构体、实现基本的链表操作(如头部插入、删除、尾部插入、删除、查找、在指定位置插入/删除节点等),以及链表的销毁等功能。
2024-05-31 14:14:06
859
原创 C语言.顺序表.通讯录
本文介绍了基于C语言的顺序表实现通讯录的方法。通过构建顺序表数据结构,有效管理联系人信息,包括姓名、电话等。文章详细阐述了通讯录的创建、添加、删除、查找和修改联系人等功能的实现过程,为读者提供了一个简单高效的通讯录管理方案。
2024-05-28 23:27:58
619
原创 C语言.数据结构.顺序表
线性表()是个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2024-05-25 20:11:22
613
原创 C语言.动态内存管理
栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。数据段(静态区):(static)存放全局变量、静态数据。程序结束后由系统释放。
2024-05-16 14:05:08
675
原创 C语言.自定义类型:联合和枚举
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用一块内存空间。上述的结构其实设计的很简单,用起来也方便,但是结构的设计中包含了所有礼品的各种属性,像结构体一样,联合体也是有一个或多个构成,这些成员可以是不同的类型。因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。,这样就可以介绍所需的内存空间,一定程度上节省了内存。枚举顾名思义就是⼀⼀列举,把可能的取值⼀⼀列举。{}中的内容是枚举类型的可能取值,也叫。这些数据的表示就可以使用枚举。输出的三个地址一模一样,
2024-05-05 09:25:59
1109
原创 C语言.自定义类型:结构体
位段的成员必须是intunsignedint或signedint,在C99中位段成员的类型也可以选择其他类型。位段的成员后面有一个冒号和一个数字。//单位是字节int _b : 3;int _c : 4;A就是一个位段类型。那位段A所占内存空间大小是多少?
2024-04-30 22:51:28
990
原创 C语言.字符函数与字符串函数
是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在。通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回。中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在。这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量。是能够判断参数部分的。
2024-04-22 21:26:49
752
1
原创 C语言.指针(6)
这是上一节指针(5)最后的七道代码题的详解。这七道题目,是对前面五节课关于指针内容回顾的综合题目,难度比较大,耐心一点看,尽量把题目吃透,对以后的数据结构的分析有帮助。
2024-04-13 18:22:34
2427
原创 C语言.指针(5)
计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。只关注占用内存空间的大小,不在乎内存存放的是什么数据。是C语言库函数,功能是求字符串长度。字符,直到找到为止,所以可能存在越界查找。之前字符串中字符的个数。中这个地址开始向后,
2024-04-11 09:08:55
486
1
原创 C语言.指针(4)
只有调用函数的逻辑是有差异的,可以把调用的函数的地址以参数的形式传递过去,使用函数指针接收,函数指针指向什么函数就调用什么函数,这里其实使用的就是。,有一部分代码是重复出现的,其中虽然执行计算的逻辑是区别的,但是。使用回调函数,模拟实现qsort(采用冒泡的排序方式),有没有办法,简化⼀些呢?
2024-04-06 13:11:08
663
1
原创 C语言.指针(3)
如果我们将函数的地址存放起来,就得创建函数指针变量,函数指针变量的写法与数组指针非常类似。那要把函数的地址存到一个数组中,那这个数组就叫的函数指针数组,用函数指针的数组如何定义?数组指针变量是用来存放数组地址的,那怎么获得数组的地址呢?确实打印出了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过。这里的实参是二维数组,形参也可以写成二维数组的形式,还有其他的写法吗?调试之后,发现 p与 &arr 的类型是完全一致的。指针数组是一种数组,数组中存放的是地址(指针)。是数组,数组的内容是什么呢?
2024-04-02 23:19:45
858
1
原创 C语言.指针(2)
这里我们使用输出结果:我们发现数组名和数组首元素的地址打印出的结果一摸一样,。这时候有同学会有疑问?数组名如果是数组首元素的地址,那下面的代码怎么理解呢?,如果arr是数组首元素的地址,那输出应该的应该是才对。三个打印结果一摸一样,这时候又纳闷了,那和有啥区别呢?
2024-03-30 21:35:37
636
1
原创 C语言.指针的基本语法(1)
我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的。处理后的数据也会放回内存中。那我们买电脑的时候,电脑上内存是8G/16G/32G等,那这些内存空间如何高效的管理?其实,每一个内存单元,一个字节空间里面能放,而每个内存单元也都是有一个编号,有了这个内存单元的编号,。在计算机中我们把。
2024-03-24 20:51:27
746
1
原创 C语言.操作符的基本语法(2)
代码1:变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//代码2struct Stu//名字int age;//年龄//初始化//指定顺序初始化//代码3int date;//结构体嵌套初始化//结构体嵌套初始化使用方法:结构体变量.成员名即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别复杂的表达式,可拆开写。
2024-03-19 23:23:46
832
1
原创 C语言.扫雷游戏
扫雷游戏代码的实现主要基于前面学习的数组和函数,进行一个阶段性的总结。函数的调用、数组传参、VS调试等内容。写体量大的代码时,学会把整体分成几部分来写,好处是:效率高,整体性更好(容易梳理代码);写完一部分时,记得调试一下,确定代码跑起来符合预期时,再继续往下写。在写扫雷的时候,会遇到各种各样的问题,一定要调试。还有就是给自己一些时间来适应。
2024-02-09 17:47:40
981
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人