- 博客(41)
- 收藏
- 关注
原创 计算机网络
当发送方收到接收方对部分数据的确认(ACK)后,窗口会向前滑动,将已确认的数据移出窗口并纳入新的可发送数据,未收到确认的数据则留在窗口中,等待通过重传机制处理,以此实现高效且可靠的数据传输,同时避免接收方缓冲区溢出。若延迟的旧报文后来到达服务器,服务器会误认为是新请求,直接发送确认并建立连接,但客户端此时已不需要该连接,会忽略确认,导致服务器一直等待,浪费资源。自己理解:流量控制就是当发送包,发送方发送很多数据,数据包时,此时会,可能发送太多,会导致接收方的缓冲区放不下,它就会提醒发送方速度减慢。
2025-09-25 14:35:46
835
原创 jvm之【垃圾回收器】
代分工:新生代 / 老年代专用,或跨代(G1)。目标侧重:吞吐量优先(Parallel 系列)、低延迟(CMS、G1)、简单场景(Serial 系列)。并发能力:单线程(Serial)、多线程并行(ParNew、Parallel)、并发(CMS、G1)。实际应用中,需根据业务场景(如服务端低延迟 vs 后台批处理)选择搭配,G1 因 “可预测停顿” 和 “大内存适配”,逐渐成为主流替代方案。
2025-09-22 15:10:05
458
原创 常见的【垃圾收集算法】
在可回收的对象(垃圾对象)多时,大量的标记清除特别耗时(由于标记过程需要全堆遍历,会使得 GC 停顿时间较长,比较耗时)标记-整理算法:标记过程和标记清除过程一样,首先是从GC Roots出发标记存活的对象,但后续过程它是将存活的对象移到内存一端,然后直接清除边界以外的内存。标记-复制算法:将内存分为两个大小相同的区域,每次只使用其中一个,当垃圾回收时将存活的对象复制到另一块区域,然后清除正在使用的区域。标记清除算法:从GC root出发扫描,并标记所有存活的对象,之后清除没有标记的对象。
2025-09-22 14:37:35
555
原创 子查询及其分类
子查询的核心价值是 “拆分复杂逻辑”—— 把 “需要先算的条件 / 数据” 放在子查询中,主查询专注于 “最终筛选 / 展示”,所有例子的本质都是 “先算子查询,再用子查询结果帮主查询干活”,理解业务场景后就能灵活套用。
2025-09-20 15:15:54
1425
1
原创 栈的主要知识
栈的核心是“先进后出 + 仅栈顶操作”,结构简单、操作可控,虽功能有限,但在需要 “回溯”“临时缓存” 的场景中效率极高,是编程中最基础且常用的数据结构之一。
2025-09-19 18:52:58
1122
1
原创 JWT的工作流程
的哈希算法,它速度很慢(可以通过“工作因子”调整),并且内置了盐的处理,能有效抵御暴力破解和彩虹表攻击。而 MD5/SHA 速度太快,不适合用于密码哈希。密码验证成功后,服务器需要一种方式来记住用户已经登录过了。传统的做法是用 Session/Cookie,而 JWT 是一种更现代、无状态的替代方案。:服务器不比较密码本身,而是比较用同样方法和盐计算出的哈希值。即使两个用户密码相同,因为他们的盐不同,最终存储的哈希值也完全不同。存储明文密码是极其危险的,一旦数据库泄露,所有用户密码都将暴露。
2025-09-18 18:55:44
901
原创 网络四层模型和七层模型的区别
对比维度四层模型(TCP/IP 模型)七层模型(OSI 模型)起源背景源于 20 世纪 60 年代美国军方 ARPANET 项目,从实际网络通信需求中演化而来由国际标准化组织(ISO)1984 年制定,为统一全球网络通信标准而生设计导向实用导向:以 “解决真实网络通信问题” 为核心,不追求理论完美,优先保证效率与可实现性理论导向:以 “标准化、通用性” 为核心,试图统一不同厂商设备的兼容性,侧重框架完整性分层数量4 层(简化设计,合并冗余功能)7 层(细粒度拆分,每层职责单一)
2025-09-16 22:28:23
853
原创 synchronized的实现原理
利用对象头的Mark Word存储锁状态,实现锁升级(无锁→偏向锁→轻量级锁→重量级锁)。基于监视器锁(Monitor)保证互斥性,通过monitorenter/monitorexit指令控制锁的获取与释放。这种设计在保证线程安全的同时,通过锁升级机制优化了不同并发场景下的性能。
2025-09-16 12:05:50
890
原创 乐观锁~悲观锁
乐观锁典型的一个例子是CAS(比较和交换),主要看内存值和预期值一样吗(这个过程是实时查看的),一样的话就说明没有别的线程来修改资源,那么自己可以将内存值改为新值。:冲突概率低、追求高性能 → 乐观锁;冲突概率高、追求强一致性 → 悲观锁。综上,乐观锁和悲观锁的选择主要取决于。
2025-09-15 15:37:02
1100
原创 【spring MVC】的执行流程
DispatcherServlet 将 ModelAndView 传递给 ViewResolver(视图解析器),ViewResolver 根据视图名称(如 user/list )解析出具体的 View(视图对象,如 JSP、Thymeleaf 页面)。:DispatcherServlet 调用 HandlerMapping(处理器映射器),根据请求 URL、请求方法等信息,找到对应的 Handler(处理器,即 Controller 中的方法) 及拦截器(Interceptor)。
2025-09-15 10:28:00
223
原创 垃圾回收器之【CMS-G1】
回收机制:基于“标记-整理”算法(局部“复制”),核心是分区回收(将堆内存划分为多个大小相等的Region),优先回收垃圾占比高的Region(“Garbage-First”由来)。重新标记:再次暂停应用线程进行快速重新标记,修正并发标记期间因用户程序运行导致的标记变动,处理新增加或删除的引用关系,确保不遗漏存活对象,停顿时间比初始标记长,但远短于并发标记时间。回收机制:基于“标记-清除”算法,核心是并发回收(回收阶段与用户线程同时执行),仅在“初始标记”和“重新标记”阶段短暂停顿。
2025-09-15 09:54:00
1067
原创 多表联查的例子
select * from student where sid in (学号1,学号2) and sid <> 1-- 结果:只剩下学号2。
2025-09-14 12:38:17
655
原创 mysql基础知识
eg: 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来 自动赋值。timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss。double:小数类型 eg:score double(5,2) 小数5位,小数点后2位。datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss。date:日期,只包含年月日,yyyy-MM-dd。
2025-09-11 18:05:49
325
原创 数据库的回表
当我们通过非主键索引查询数据时,如果查询的字段超出了非主键索引本身存储的内容(即需要“完整数据”或“非索引字段”),就必须通过索引叶子节点中的“主键”,再去主键索引中查询一次,这个“二次查询”的过程就是回表。回表的本质:通过非主键索引找到主键后,再去主键索引查询完整数据的“二次查询”过程;触发条件:查询字段超出非主键索引的存储范围(非覆盖索引查询);核心影响:增加磁盘 I/O,降低查询性能;优化方案:设计合理的覆盖索引(如联合索引),让查询字段都包含在索引中,避免回表。这个主键索引为啥也叫聚簇索引。
2025-09-11 17:36:10
1161
原创 mysql的索引
alter table 表名 add index index_name(‘column1’,‘column2’,‘column3’);alter table 表名 add index 索引名(字段名);(一张表只有一个主键索引)
2025-09-10 23:24:35
365
原创 mysql的事务
简言之,ACID 特性是数据库事务可靠性的基石:原子性保证 “操作完整性”,一致性保证 “数据合法性”,隔离性保证 “并发安全性”,持久性保证 “结果永久性”。:多个事务同时执行时,每个事务的操作应 “隔离”,不会被其他并发事务的中间状态影响,避免出现 “脏读、不可重复读、幻读” 等问题。:事务执行前后,数据库的 “业务规则” 和 “数据完整性” 需保持一致(如数据约束、逻辑校验等),不会出现非法数据。幻读:第一个读的和第二个读的数据不一样,例如新增不会加排他锁,增加后前后读的数据就不一样了。
2025-09-10 18:48:46
1532
原创 【递归算法】
*案例需求:**计算n的阶乘,比如5的阶乘 = 1 * 2 * 3 * 4 * 5;6 的阶乘 = 1 * 2 * 3 * 4 * 5 * 6。
2025-09-05 14:57:10
150
原创 【redis的核心知识点】
Redis是一款开源,基于内存的key_value存储,缓存的非关系型数据库,相比于MySQL将数据存储在磁盘上,resdis将数据存储在内存上,读写速度特别快,每秒可以处理10万次读写操作,支持字符串、哈希、列表,集合等多种数据结构,通过RDB和AOF实现持久化避免数据丢失,同时具备主从复制、哨兵、集群等高可用与分布式能力,广泛用于缓存、分布式锁、计数器、消息队列等场景。
2025-09-02 14:41:34
724
原创 shiro进行解密
解密时的 算法(AES/Blowfish)、模式(CBC/ECB)、填充方式(PKCS5Padding)、编码格式(Base64/Hex) 必须与加密时完全一致,否则会解密失败。解密失败时(如密钥错误、密文篡改),仅返回通用错误提示(如 “认证失败”),不要暴露具体原因(如 “密钥错误”“密文格式错误”),防止攻击者通过异常信息猜测加密逻辑;使用 Shiro 最新稳定版本(如 1.12.0),旧版本(如 1.3.2,你日志中使用的版本)存在已知安全漏洞(如 RememberMe 反序列化漏洞);
2025-08-26 19:05:45
1213
原创 Shiro介绍以及一个原始例子
若比对成功:Realm 返回包含用户角色 / 权限的 AuthenticationInfo 对象,SecurityManager 会将认证状态更新到 Subject,此时 subject.isAuthenticated() 结果为 true。//整个流程的核心是 自定义 Realm,它同时处理认证(验证用户身份)和授权(分配角色权限),是 Shiro 与业务数据的桥梁。认证结果处理:后端根据是否抛出异常,向前端返回登录成功 / 失败的响应,成功后 Subject 可后续进行授权校验。
2025-08-26 18:39:32
1150
原创 搞懂^静态~动态代理
本文介绍了Java中的两种代理模式实现方式。静态代理通过创建代理类来实现,代理类持有被代理对象并添加增强逻辑,示例展示了前置/后置日志增强功能。动态代理部分重点讲解了JDK动态代理,通过InvocationHandler接口实现方法调用拦截,可以在运行时动态生成代理类。文中提供了完整的代码示例,包括UserService接口实现、代理逻辑处理类以及动态代理对象的创建过程,展示了如何在方法调用前后插入增强逻辑。动态代理相比静态代理更具灵活性,无需为每个类编写代理代码。
2025-08-14 19:44:38
319
原创 单例模式的理解
摘要:本文介绍了Java中四种线程安全的单例模式实现方式。1)饿汉式:类加载时初始化实例,线程安全但不支持懒加载;2)懒汉式:首次调用时创建实例,使用synchronized方法保证线程安全,但性能较差;3)双重校验锁:通过volatile和双重检查机制实现延迟加载和线程安全,兼顾性能和安全性;4)静态内部类(推荐):利用JVM类加载机制保证线程安全,实现懒加载且代码简洁高效。通过对比分析,静态内部类方式因兼具线程安全、懒加载和性能优势,成为日常开发的首选方案。
2025-08-13 23:21:01
596
原创 反射的详解
本文介绍了Java反射机制的核心概念与应用。主要内容包括: JDK、JRE、JVM的关系:JDK包含JRE和开发工具,JRE包含JVM和运行时类库,JVM负责执行字节码实现跨平台。 反射机制:允许运行时动态获取类信息、创建对象和调用方法,是框架(如Spring)实现依赖注入的基础。 获取Class对象的三种方式:类名.class、对象.getClass()和Class.forName(),三种方式获取的是同一实例。 Class类的常用方法:包括获取类名、父类、接口、判断继承关系和类型(普通类、接口、枚举、数
2025-08-13 23:14:45
689
原创 Spring框架如何解决循环依赖
Spring通过三级缓存机制解决循环依赖问题。一级缓存存储完全初始化的单例Bean,二级缓存存储半成品Bean,三级缓存存储Bean工厂。当A依赖B、B依赖A时,Spring会:1)创建A工厂存入三级缓存;2)创建B时发现依赖A,从三级缓存获取A的半成品放入二级缓存;3)B完成初始化存入一级缓存;4)A注入B后完成初始化。对于更长的循环链(如A→B→C→A),同样通过三级缓存的协作逐步解决。该机制能处理任意长度的单例Bean循环依赖,关键在于提前暴露对象引用并合理管理不同状态的Bean缓存。
2025-08-12 20:22:17
1123
原创 AQS的理解
摘要:AQS(AbstractQueuedSynchronizer)是Java并发包的核心框架,采用CLH队列和volatile状态变量实现锁机制。其核心设计包含两次抢锁:第一次直接CAS尝试获取锁(性能优化),第二次处理锁重入场景。失败后线程进入CLH队列排队,公平锁严格遵循FIFO,非公平锁允许插队。这种设计既保证了并发性能,又支持锁重入和公平性兜底,是ReentrantLock等同步器的基础实现原理。
2025-08-12 18:50:25
715
原创 Spring---->Bean的生命周期
容器通过反射创建 Bean 的实例(内存中分配空间),此时还未设置属性。在这个阶段,Spring会根据配置或注解创建Bean的实例。这可以通过构造函数实例化(默认)、工厂方法或者Bean容器中的其他方式来实现。底层:Spring容器在进行初始化时,会将xml配置的的信息封装成一个BeanDefinition对象,所有的 BeanDefinition存储到一个名为beanDefinitionMap的Map集合中去,Spring框架在对该Map进行遍历,使用反射创建Bean实例对象,创建好的Bean对象存储
2025-07-27 20:40:13
1032
原创 MyBatis的运行原理
SqlSessionFactory:创建 SqlSession 的工厂,基于配置文件初始化。- SqlSession:代表一次数据库会话,提供增删改查方法,内部依赖 Executor。- Executor:执行器,负责实际 SQL 执行,内置一级缓存。- Mapper 代理:动态代理对象,将接口方法与 SQL 语句绑定。- Configuration:存储所有配置信息,是 MyBatis 的核心配置容器。
2025-07-22 19:37:30
383
原创 day03 jdbc
JDBC是Java连接数据库的标准接口,通过统一API屏蔽不同数据库差异。其核心包括DriverManager管理驱动、Connection建立连接、Statement执行SQL及ResultSet处理结果集。学习重点应掌握基础操作(增删改查)、事务管理(commit/rollback)、防SQL注入(PreparedStatement)及批处理优化。此外需理解连接池原理(如HikariCP)和JDBC底层机制(驱动加载、TCP连接等)。实际开发中,JDBC是ORM框架基础,掌握其原理和性能优化对求职大有裨
2025-07-17 23:37:32
1221
原创 day06继承
什么是继承?Java允许一个类通过extends与另一个类建立父子-关系,这就是继承。继承的格式:子类extends父类继承的特点:类继承父类后,就可以得到父类的属性和行为。继承的核心优点:提高代码的复用性,多个子类的相同代码可以放在父类中,增强了类的扩展性。
2025-01-19 19:44:37
1197
原创 day04数组的基本概念
1.一组相同数据类型的数据,在内存中开辟连续的内存空间,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。
2025-01-19 01:26:02
502
原创 day04类与对象基础--方法
a.方法定义的语法规则:(方法定义在类的内部,其他方法的外面)修饰符返回值类型方法名(参数类型参数名)方法体return;b.修饰符:publicstatic---->有static直接调用,不用对象调用。任意的数据类型,void-无返回值,如果方法有返回值,return返回。d.方法名:小驼峰命名(eg:printMessage)参数:参数类型(所有数据类型)参数名(和变量名一样)e.方法调用:值的个数,顺序,类型要保持一致方法名(参数值)—无返回值。
2025-01-18 17:19:36
432
原创 day04(java方法的编程练习)
/ 如果m为3、4、5,则显示”春天”;如果为6、7、8,则显示”夏天”;// 如果为9、10、11,则显示”秋天”;// 如果为12、1、2,则显示”冬天”;// 如果为其他值,则显示任何内容。
2025-01-14 23:34:22
696
原创 day03循环基础编程练习
随机的字母和数字组合,可以通UUID.randomUUID().toString()产生。每次产生后,由用户决定是否继续产生?(Y/N),如果输入Y后,则继续生成;如果用户输入N,程序结束。● 输入用户名和密码,判断是否正确。假设正确的用户名是root,密码是wbjxxmy。● 如果错误,继续输入,直到输入正确。
2025-01-13 22:46:53
606
原创 字符串(String)知识总结加代码解释
1.字符串类型String是我们开发中最常使用的引用数据类型,我们用双引号"…"引起来的内容是字符串。//可以是空字符串String str1 = "main中国12@";//字符串可以包含任意的字符内容String str2 = "main中国\"12@";//字符串",转义操作,\//将任意数据类型转成字符串System.out.println("你好,我叫"+"小张");System.out.println("年龄为"+23);
2025-01-13 01:23:56
829
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅