- 博客(49)
- 收藏
- 关注
原创 深入理解 TCP 三次握手与四次挥手
三次握手是为了确认双方的收发能力并协商初始序列号,确保数据传输的可靠性。四次挥手是为了确保数据传输完成后再安全断开连接,避免数据丢失。2MSL 等待机制保证了网络中的延迟数据包不会干扰新连接,是 TCP 保证可靠性的重要机制。理解 TCP 的这些机制对网络编程、系统优化和面试应对至关重要。掌握这些知识,能够更好地理解 TCP 协议的精妙设计。
2025-03-20 15:46:41
1218
原创 深入理解计算机网络:OSI 与 TCP/IP 各层结构与功能
OSI 模型和 TCP/IP 模型是理解计算机网络的关键。OSI 模型结构更清晰,适合教学和理论研究,而 TCP/IP 模型更贴近实际应用,是现代互联网的核心。理解两者的区别和联系,有助于更深入地掌握网络协议,提高网络编程和故障排查的能力。
2025-03-20 15:41:46
1020
原创 深入理解 Redis SDS:高效字符串存储的秘密
int len;// 字符串的实际长度int free;// 未使用的字节数char buf[];// 字符数组,末尾以 '\0' 兼容 C 字符串函数解释len:存储字符串当前的长度(不包括\0free:记录buf数组中未使用的空间,便于后续字符串增长。buf[]:存储字符串数据,末尾保留\0以兼容 C 标准库字符串函数。SDS 作为 Redis 专门设计的字符串结构,解决了传统 C 字符串在性能、安全性和内存管理方面的问题。通过空间预分配和惰性空间释放。
2025-03-20 15:39:00
864
原创 Java中的synchronized关键字与锁升级机制
是 Java 中最基础的线程同步机制,适用于保证多线程环境下共享数据的安全。理解锁的工作原理以及锁升级机制,对于编写高效的并发程序至关重要。通过合理使用和其他并发工具,我们可以在保证线程安全的同时,优化性能。
2025-02-13 23:53:30
882
原创 操作系统中的任务调度算法
不同的任务调度算法各有优缺点,根据系统类型和任务特性选择合适的算法至关重要。随着应用场景的复杂化,新的调度算法不断出现,以适应日益复杂的性能需求。在实际系统中,综合考虑任务的响应时间、执行效率和资源利用率,合理调度任务,以实现最佳的操作系统性能。这样的一篇博客对任务调度算法的介绍更加详细,且示例、分析更加清晰。
2025-02-11 21:10:47
545
原创 银行家算法详解:避免死锁的经典解决方案
银行家算法通过对资源的合理分配和安全状态的检查,有效地避免了死锁的发生。它的优势在于能够确保在多进程环境下,系统能够始终处于安全状态。然而,该算法也存在一些局限性,如需要预先知道每个进程的最大资源需求,并且算法的计算复杂度较高,尤其在资源种类和进程数量较多时,性能会受到影响。尽管如此,银行家算法依然是操作系统中资源管理的经典算法,为解决死锁问题提供了重要的理论依据和实践指导。
2025-02-11 21:02:10
983
原创 maven私服架构
正式开发,不同的项目组开发不同的工程。maven-dao 工程开发完毕,发布到私服maven-service 从私服下载 dao。公司在自己的局域网内搭建自己的远程仓库服务器,称为私服, 私服服务器即是公司内部的 maven 远程仓库, 每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载。
2025-02-06 23:10:08
806
原创 Maven进阶
比如我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的公共模块,比如说每个模块都需要javaseo-utils,在编译的时候,maven-compiler-plugin插件也要被引入,maven仓库地址以及发布目录都是相同的配置。我们可以使用Maven的继承功能,把公共的配置信息写到父模块中,子模块只要继承了该父模块,也会继承父模块的配置信息。Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。
2025-02-06 23:02:57
553
原创 Java中Integer的128陷阱
在 Java 中,自动装箱(autoboxing)是指将基本类型(如int)转换为相应的包装类(如Integer)的过程。例如,当你将一个int类型的值赋给一个Integer// 自动装箱// 自动拆箱Integer 128 陷阱是 Java 中一个容易被忽视的细节,它源于Integer类的缓存机制。对于值在-128到127范围内的Integer对象,==运算符比较的是同一个对象,而对于值大于等于 128 的Integer对象,==运算符比较的是不同的对象引用,导致比较结果可能出乎意料。
2025-02-06 22:52:49
1315
原创 Java 中接口和抽象类的异同
接口(Interface):接口是一种完全抽象的类,它只能包含常量、抽象方法、默认方法和静态方法。接口不能包含实例变量或实现方法(除非是默认方法或静态方法)。接口的主要作用是提供一种契约,强制实现该接口的类去实现接口中定义的抽象方法。抽象类(Abstract Class):抽象类是一种不能被实例化的类,它可以包含抽象方法(没有方法体)和具体方法(有方法体)。抽象类允许类继承并扩展它,从而提供部分实现。抽象类可以有构造方法、成员变量以及其他非抽象方法。接口。
2025-02-06 22:48:17
742
原创 为什么需要同时重写equals方法和hashCode方法
在 Java 中,同时重写equals和hashCode方法是非常重要的。通过正确实现这两个方法,可以确保对象的相等性比较和哈希表功能的正常运行,遵循 Java 的规范和契约,减少代码的复杂性和维护成本。重写这两个方法时,需特别注意它们的关系,确保equals和hashCode一致,以保证对象在哈希表等数据结构中的正确使用。
2025-02-06 22:45:15
945
原创 数据库连表查询
一对一:最优解决方案是通过在其中一张表中添加外键,避免数据冗余。一对多:通常在多方表中添加外键,这样既保持数据独立性,又能确保数据一致性。多对多:最优解决方案是创建一个中间表来存储两者的关系,这样可以有效管理关联关系,避免冗余数据。
2025-02-05 14:05:53
938
原创 SQL注入详细解析
SQL注入是指Web应用程序对用户输入的数据未做有效的过滤或验证,导致攻击者可以在Web应用程序的SQL查询语句中插入恶意SQL代码,从而让数据库执行非授权的SQL语句。通过SQL注入,攻击者可以实现数据泄露、篡改、删除、甚至控制数据库服务器。SQL注入是一种常见的网络安全攻击手段,开发人员应始终保持警惕,确保对用户输入进行严格的验证和过滤,采用预编译语句、参数化查询和ORM框架等安全措施,防止SQL注入漏洞的发生。通过采取这些安全措施,可以有效地提高Web应用程序的安全性,避免遭受SQL注入攻击。
2025-02-05 13:57:12
631
原创 Tomcat启动流程与前端请求处理详解
Tomcat是一个Servlet容器,它负责将Web应用程序中的Servlet与外部HTTP请求进行交互。Tomcat启动时会加载所有的Web应用和Servlet,并通过扫描和反射机制将其映射到适当的Servlet类上。Tomcat会扫描项目中的。当浏览器发送HTTP请求时,Tomcat会根据请求的URL查找对应的Servlet并处理请求。:根据匹配的Servlet类,Tomcat会通过反射机制创建一个Servlet对象。Tomcat通过分析HTTP请求的URL路径,并与Servlet容器中的。
2025-02-05 13:47:09
1066
原创 MyBatis中的#{}与${}的区别和应用详解
{}是MyBatis中的占位符语法,表示参数值会被替换成SQL语句中的参数,同时它会将传入的参数进行预编译。MyBatis会自动为参数值做类型转换,并且防止SQL注入。具体来说,`#{}会通过PreparedStatement绑定参数,在SQL执行前对参数进行处理和转义,从而避免了SQL注入的问题。#{}是MyBatis中最常用的占位符,适用于大多数情况,能够防止SQL注入并提高SQL性能。${}适用于动态拼接表名、字段名等结构性内容,但要小心SQL注入风险。在实际开发中,尽量使用#{}
2025-02-05 13:43:34
508
原创 Maven架构项目管理工具
Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。什么是理想的项目构建?高度自动化,跨平台,可重用的组件,标准化的什么是依赖?为什么要进行依赖管理?自动下载,统一依赖管理A1.0 依托于 B 2.0 依托于 C3.0有哪些项目信息?项目名称描述等,开发人员信息,开发者信息等依赖管理指的是Maven如何管理项目所需的外部依赖。
2025-02-05 13:39:43
1154
原创 MyBatis 注解开发详解
使用 MyBatis 注解开发可以快速完成简单的数据库操作,减少 XML 配置的复杂性。但在实际开发中,注解方式的灵活性和可维护性较差,不适用于复杂业务场景。因此,推荐使用 XML 配置方式,以便于更好地管理和维护 SQL 语句。
2025-01-21 22:53:05
659
1
原创 MyBatis 详解
MyBatis 是一个强大的持久层框架,提供了灵活的 SQL 操作和丰富的配置选项,适合需要精细控制 SQL 语句和性能优化的场景。尽管在一些简单的 CRUD 操作中,MyBatis 可能显得过于复杂,但在复杂查询和动态 SQL 生成场景下,其优势明显。
2025-01-21 22:48:28
977
原创 Java 前端详解
Java 前端开发主要涉及使用 Java 相关技术和框架来创建用户界面和处理用户交互。虽然 Java 原本是后端开发的主力语言,但它也提供了许多前端开发工具和框架。以下是 Java 前端开发的主要内容和技术栈。Java 前端技术适用于需要稳定、安全和企业级应用的场景,尽管在现代 Web 开发中,JavaScript 及其框架更为流行,但 Java 前端在特定场景下仍然有其独特的优势。
2025-01-21 22:42:42
942
原创 前后端交互过程
jQuery 提供了一套简洁的 API,大大简化了 JavaScript 的常见操作,如 DOM 操作、事件处理、动画效果等。jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档操作、事件处理、动画以及 AJAX 交互。前端的构建包括开发和构建工具的使用,以提高开发效率和优化项目性能。前后端交互是指客户端(前端)与服务器(后端)之间的数据通信。通过这些工具和技术,前端开发者可以更高效地构建现代化的网页应用,提高用户体验。:选中特定 Class 的元素。:选中所有指定元素。
2025-01-21 22:38:13
1339
原创 javascript基础语法
格式var 变量名 = 变量值注意:字符串类型的变量值需加上双引号("")或单引号(''命名函数:使用function关键字定义。console.log("函数执行啦");// 调用函数匿名函数:将函数赋值给变量。console.log("函数执行啦");// 调用函数。
2025-01-21 22:30:00
651
原创 MySQL 事务
事务:事务是一个最小的不可再分的工作单元,通常对应一个完整的业务操作。例如,银行账户转账业务就是一个最小的工作单元。一个完整的业务通常需要多个 DML(INSERTUPDATEDELETE)语句联合完成。事务主要与 DML 语句相关,DML 语句之间可以形成一个事务,以保证业务逻辑的完整性。
2025-01-21 22:23:36
1171
原创 Java中的错误与异常详解
Error表示严重错误,通常不由程序员处理。Exception是可以被程序员捕获和处理的异常,分为运行时异常和非运行时异常。使用 try-catch机制来捕获和处理异常,使用 finally块进行清理操作。throws关键字用于声明方法可能抛出的异常。
2025-01-21 22:05:11
417
原创 Java中的构造器
构造器(Constructor)是一种特殊的方法,用于在创建对象时初始化对象的状态。构造器的名字必须与类名相同,且没有返回类型,连void也不能使用。构造器是用于初始化对象状态的特殊方法。Java 提供默认构造器,但程序员可以定义自己的构造器。构造器可以重载,提供多种方式初始化对象。this关键字可以用来在一个构造器中调用另一个构造器。构造器是对象创建过程中的关键步骤,通常用于初始化对象属性和设置初始状态。
2025-01-20 23:48:18
315
原创 Java中的类与对象
在Java中,类是对象的蓝图或模板。它定义了对象的属性(变量)和行为(方法)。类包含字段和方法,用于创建和操作对象。通过类,我们可以创建多个对象,每个对象都有其独立的数据和共同的行为。int age;在这个例子中,Student是一个类,具有name和age两个属性,以及一个study方法。对象是类的实例,是具体存在的实体。声明:声明一个对象。实例化:使用new关键字来创建对象。初始化:调用构造函数进行初始化。int age;
2025-01-20 23:33:40
268
原创 KMP算法
KMP算法的核心思想是利用字符串中已经匹配的部分信息来优化匹配过程,减少回溯操作。KMP算法的关键是使用“部分匹配表”(也叫做“前缀表”或者“失配函数”),该表记录了每个子串的前缀与后缀的相似信息。通过这个表,可以在字符匹配失败时,跳过一些无意义的比较,直接跳到下一个可能匹配的位置。我们从模式串的第二个字符开始,逐个计算出每个位置的最长前缀后缀匹配长度。部分匹配表(也叫“失配函数”)记录了模式串中每个位置的前缀和后缀的最长匹配长度。特别是,对于模式串中的每个位置,我们需要知道它的最大前缀和后缀的匹配长度。
2025-01-20 23:21:04
781
原创 Java中的代理
动态代理是指在运行时动态生成代理类,不需要手动编写代理类的代码。Java 中常见的动态代理有两种实现方式:基于 JDK 的动态代理:只能代理实现了接口的类。基于 CGLIB 的动态代理:可以代理未实现接口的类,通过生成子类实现代理。基于上述问题就引出了动态代理。以上述问题为例(衣服工厂、鞋子工厂)。一个代理类可以实现多个的代理对象,每个代理对象只匹配一个目标对象,即代理类动态的生成一个代理对象去匹配一个目标对象。
2024-09-05 13:55:18
953
原创 Java中的反射
反射是一种能够在运行时获取类信息的能力。它可以让程序在不知道类的情况下,通过类的全限定名来获取类的字节码文件,并在运行时对类的各种属性进行操作。这些信息包括类的构造器、方法、变量、接口、父类、注解等。
2024-09-03 19:00:20
946
原创 Java中的接口
接口(Interface)在Java中是一种抽象类型,是对行为的一种规范。它定义了类可以做什么事情,但不提供这些事情的具体实现。换句话说,接口只包含方法的声明,不包含方法的具体实现。接口的设计使得Java可以实现多重继承的效果,即一个类可以实现多个接口。
2024-09-03 18:59:52
1055
原创 Java泛型
泛型是一种在编程中广泛使用的概念,特别是在面向对象编程中。它允许开发者在编写代码时使用类型参数,这些参数在实际使用时才会被具体的类型所替换。简单来说,泛型就是将类型参数化,使得一个类或方法能够操作多种数据类型,而不仅仅是预先定义的某一种或几种类型。泛型的本质是参数化类型,这意味着所操作的数据类型被指定为一个参数,延迟到代码运行时才确定具体的类型。泛型是Java中非常强大的特性,它提供了编译时的类型检查,增加了代码的复用性和安全性。理解并熟练使用泛型,对于编写高质量的Java代码至关重要。
2024-08-28 14:00:45
1690
1
原创 Java包装类
包装类(Wrapper Class)是Java编程语言中的一个重要概念,用于将基本数据类型封装为对象类型。Java是一种面向对象的编程语言,但其基本数据类型(如int、byte、float等)并不支持面向对象的特性,如继承、多态等。为了弥补这一不足,Java为每种基本数据类型都提供了一个对应的包装类,这些包装类位于java.lang包中。包装类的主要作用是允许基本数据类型像对象一样使用。包装类在Java中是一个重要的特性,允许基本数据类型拥有对象的特性,从而支持更多的操作和方法调用。
2024-08-28 14:00:25
955
原创 Java抽象类
在Java中,抽象类(Abstract Class)是一种无法直接实例化的类,通常用于被其他类继承。抽象类可以包含抽象方法(没有方法体,只有方法签名,并用abstract关键字声明)和非抽象方法(普通方法,有方法实现)。如果一个类包含至少一个抽象方法,那么这个类必须被声明为抽象类。不过,即便一个抽象类没有包含任何抽象方法,它仍然可以被声明为抽象类,以限制其不能被直接实例化。使用abstract关键字修饰的类就是抽象类。
2024-08-28 14:00:05
2505
原创 This、Final关键字与Java的值传递
this 关键字代表当前对象的引用。它用于在对象的方法或构造器中引用当前对象。this 关键字用于引用当前对象的实例变量或方法,通常在需要区分局部变量和实例变量时使用。final 关键字用于定义不能更改的类、方法和变量。在使用 final 修饰变量时需要小心,特别是在对象引用和基本数据类型之间的差异。Java 中的参数传递是值传递,意味着方法操作的是传递的变量副本,而不是变量本身。这一点在理解 Java 的内存管理和对象操作时非常重要。
2024-08-25 00:00:00
685
原创 Java中的多态
多态是指父类的引用(数据类型)指向子类的对象。这种特性允许同一个方法在不同的对象中具有不同的实现。在Java中,多态的实现是通过继承和方法重写来实现的。示例// 父类// 子类// 测试类在上述示例中,A ad = new B();展示了多态的概念。ad是父类A的引用,但它实际指向的是子类B的对象。这种情况下,ad只能访问A中声明的方法和属性,但是如果B类重写了A类中的方法,调用时会执行子类B中的重写方法。Java中的多态通过继承和方法重写实现,允许同一个方法在不同的对象中具有不同的行为。
2024-08-25 00:00:00
2154
原创 类的继承、方法的重写与重载
方法是类中的一个功能块,它被定义来执行特定的任务。在Java中,方法通常由访问修饰符、返回类型、方法名和参数列表组成。
2024-08-23 13:58:56
721
原创 static关键字
在 Java 中,static 是一个修饰符,用于将类的某些成员(变量或方法)定义为静态的。静态成员是属于类本身的,而不是某个对象的。这意味着,不需要创建类的实例(对象),就可以直接通过类名来访问这些静态成员。
2024-08-22 19:01:40
649
原创 java基础
余数反转:将所有得到的余数按相反的顺序排列(即最先得到的余数放在最后,最后得到的余数放在最前)数据直接转化成对应的二进制形式,然后根据数据类型进行补充,正数最高位为0,负数最高位为1。磁盘中的数据既是以二进制形式存储的,又是通过文件和文件系统的结构来组织和管理的。当磁头划过磁颗粒时,磁颗粒的磁场使磁头产生电流,根据电流的方向判断数据内容。寻找当前数据在那个区间,在区间左侧标1,用原数据减去标一的数值,取差继续步骤。图中磁头带了S极,异性相斥,使下方电磁粒带了N极,在磁颗粒上存了数据1。
2024-08-21 22:46:40
807
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人