- 博客(58)
- 收藏
- 关注
原创 破解HTTP无状态:基于Java的Session与Cookie协同工作指南
HTTP协议本身是无状态的,但实际开发中常需维护请求间的关联关系。Session机制通过在服务器端存储令牌(SessionID)与用户信息的映射关系来解决这一问题,而Cookie则在客户端保存SessionID。文章详细介绍了Session和Cookie的工作原理及区别,包括如何在Java中通过HttpServletRequest/Response获取和设置Cookie、使用注解简化操作、Session的存储与获取方式,以及Header信息的获取方法。
2025-06-04 21:31:03
1611
28
原创 Spring MVC参数绑定终极手册:单&多参/对象/集合/JSON/文件上传精讲
本文介绍了SpringMVC中处理不同请求参数的多种方式。主要内容包括:基本参数传递(单个/多个参数及注意事项)、 对象参数绑定和自动赋值、 参数重命名@RequestParam的使用、数组和集合参数的接收、JSON数据处理(格式转换和@RequestBody注解)、 URL路径参数获取@PathVariable、 文件上传@RequestPart。文章通过代码示例详细说明了各种参数处理方式的实现方法及注意事项,包括参数必传性、类型匹配等常见问题,为SpringMVC开发中的参数处理提供了全面指导。
2025-06-01 17:20:06
1701
57
原创 TCP协议:现代网络数据传输的守护者——十大核心机制赋能高效可靠通信
本文介绍了UDP和TCP两种传输层协议的核心特性。UDP是一种无连接、不可靠的协议,具有16位长度限制(最大64K数据),适用于简单传输场景。TCP则通过十大核心机制确保可靠传输:1)确认应答保证数据有序到达;2)超时重传处理丢包问题;3)三次握手/四次挥手管理连接;4)滑动窗口提高传输效率;5)流量控制匹配接收方处理能力;6)拥塞控制适应网络状况;7)延时应答优化吞吐量;8)捎带应答减少网络负载;9)应用层解决字节流粘包问题;10)异常处理机制保障连接可靠性。两种协议各具特点,适用于不同的网络通信需求。
2025-05-30 09:46:36
1322
57
原创 Spring MVC极简入门:从@Request到Postman的全链路开发
SpringMVC是基于ServletAPI的Web框架,采用MVC架构模式,将系统分为模型(Model)、视图(View)和控制器(Controller)三部分。通过@RequestMapping注解实现URL路由映射,支持GET/POST等请求方式。学习SpringMVC主要涉及建立连接、处理请求参数和返回响应三方面内容。开发测试中可使用Postman工具模拟请求,支持普通传参、表单数据和原始文本等参数传递方式。SpringMVC作为SpringBoot的Web实现方案,是Java后端开发的核心技术之一
2025-05-28 13:03:20
1561
52
原创 深入Java TCP流套接字编程:高效服务器构建与高并发实战优化指南
本文介绍了TCP流套接字编程的实现方法。首先讲解了ServerSocket和Socket的API使用方法,详细说明了服务器端和客户端的实现流程,包括建立连接、处理请求和响应数据等核心功能。同时指出了编程中可能遇到的问题,如缓冲区刷新、请求标识符设置等,并提供了解决方案。针对服务器并发处理能力不足的问题,提出了引入多线程和线程池的优化方法。最后对比了TCP长短连接的特点及适用场景,短连接适合低频请求,长连接适合频繁通信场景。文章系统性地介绍了TCP套接字编程的关键技术点和优化思路。
2025-05-26 10:00:00
1235
39
原创 Java UDP套接字编程:高效实时通信的实战应用与核心类解析
网络编程是通过程序实现计算机间通信和数据交换的技术,主要分为基于TCP的流套接字和基于UDP的数据报套接字两种方式。TCP提供可靠、面向连接的字节流传输,而UDP则是无连接、面向数据报的不可靠传输。文章详细介绍了Java中实现UDP通信的DatagramSocket和DatagramPacket类,并提供了完整的客户端-服务端示例代码。TCP通信则通过ServerSocket和Socket类实现。文中还强调了端口冲突的解决方法及网络编程中的注意事项,包括IP地址、端口号等概念,为网络应用程序开发提供基础指导
2025-05-24 10:00:00
1992
25
原创 五元组+协议分层:拆解网络通信的底层密码
网络发展经历了从独立模式到网络互联的演变。独立模式下,计算机相互独立;随着需求增长,网络互联应运而生,通过技术和协议连接多个网络,实现资源共享和通信。网络分为局域网(LAN)和广域网(WAN),前者覆盖小范围后者连接多个局域网,覆盖更广。网络通信基础包括IP地址和端口号,用于标识主机和进程,确保数据准确传输。协议是网络通信的规则,规定数据格式和传输方式。网络协议分层设计,如OSI七层模型和TCP/IP五层模型,各层独立运作又协同配合,提升网络通信的效率和可维护性。网络中传输经历封装和分用过程,确保数据传递
2025-05-22 13:00:00
1016
8
原创 新手必看!用Java玩转文件读写:File类+字节流核心技巧解析
本文全面解析Java文件操作的核心技术,从文件路径(绝对/相对路径)的底层逻辑切入,深入讲解File类的构造方法、属性及文件创建/删除等关键操作。结合丰富代码示例,演示如何通过字节流(InputStream/OutputStream)实现文件读写,剖析flush()方法保障数据完整性的原理,并详解try-with-resources自动释放资源的高效实践。无论是文本处理还是二进制文件操作,文章通过场景化案例拆解常见误区,助开发者掌握文件系统交互的规范写法,适合Java初学者及需巩固I/O知识的进阶者阅读。
2025-05-19 11:58:59
1072
9
原创 手写Java线程池与定时器:彻底掌握多线程任务调度
本文围绕Java线程池与定时器展开。线程池通过复用线程减少创建销毁开销,Java标准库提供Executors工具类快速创建(如newFixedThreadPool),其核心参数包括核心线程数、任务队列等。通过模拟实现MyThreadPool,展示线程池基本逻辑:任务队列管理及线程复用。定时器方面,标准库通过Timer和TimerTask实现延迟任务,模拟实现中定义MyTimerTask(含时间戳及任务)和MyTimer类,使用优先级队列按任务时间排序,结合锁机制实现任务调度
2025-04-25 09:30:00
1047
12
原创 高并发架构三剑客:单例模式×阻塞队列×生产者消费者实战秘籍
本文系统探讨了单例模式、阻塞队列及生产者消费者模型的核心实现与优化。单例模式通过饿汉式(类加载时实例化)和懒汉式(延迟实例化)确保全局唯一实例。针对多线程场景,懒汉模式引入双重检查锁定(外层判空减少锁竞争,内层判空确保原子性)与volatile关键字(禁止指令重排序),兼顾性能与线程安全。阻塞队列通过同步锁与wait/notify机制实现线程协作:put方法在队列满时循环等待,take方法在队列空时阻塞,避免虚假唤醒。基于数组的循环队列设计提升了存储效率。
2025-04-19 10:00:00
1140
24
原创 探讨多线程环境下的并发安全性问题及常见解决方法
线程安全是指在多线程环境下,程序能够保持预期的行为,而不会发生数据竞争、死锁等问题,那么可以说这个程序是线程安全的; 当一个方法或者代码块被synchronized关键字修饰时,同一时刻只有一个线程能够访问该方法或者代码块,其他线程需要等待当前线程执行完毕后才能进行访问。volatile 和 synchronized 有本质上的区别synchronized 能够保证原子性和互斥访问;volatile 则可以保证内存可见性。
2025-04-08 10:52:10
815
6
原创 深入Java多线程:5种创建方式+全状态解析
一个线程就是一个 "执行流",每个线程之间都可以按照顺序执行自己的代码,多个线程之间 "同时" 执行着多份代码在之前我们写的Java代码中,都必然包含一个main()方法,对于单线程来讲,一个程序的执行从main()方法开始,直到main()方法执行结束,这其中就是一个线程的开始到结束。也可以说,在单线程程序中,main线程是程序的入口和主线程。
2025-03-25 20:53:34
642
2
原创 解锁MySQL的潜力:掌握修改、删除和约束的关键技巧
Update 修改,Delete 删除,增删查改总结,数据库约束,约束类型,NOT NULL 非空约,UNIQUE 唯⼀约束,DEFALUT 默认值约束,PRIMARY KEY 主键约束,CHECK 约束
2024-10-17 10:00:00
2774
38
原创 MySQL中的增查操作:探索数据的奥秘,开启数据之门
在MySQL中,增加数据可以通过INSERT INTO语句来实现。INSERT INTO语句可以将数据插入到表中的一行或多行中。可以通过指定列名和相应的值来插入数据,也可以省略列名,但必须按照表的列顺序来插入值。例如:INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1, 值2, 值3);查询数据可以通过SELECT语句来实现。SELECT语句可以从一个或多个表中检索数据。可以使用通配符*选择所有列的数据,也可以指定具体的列。可以使用WHERE子句来添加过滤条件,以限制返回的结果。
2024-10-14 21:21:36
3932
42
原创 蓝桥备战题后总结(2)
1、StringBuilder 类;2、StringBuffer 类、3、Arrays.toString() 方法、4、Arrays.equals() 方法
2024-10-13 19:09:46
467
5
原创 MySQL中表的操作
存储效率:char 类型在存储和检索时效率更高。由于 char 类型是固定长度的,所以在存储和读取数据时更快。而 varchar 类型由于可变长度,存储和读取时可能需要更多的操作。所以在需要频繁读写数据的场景下,char 类型更适合。存储空间:在存储相同数据的情况下,char 类型占用的存储空间通常会比 varchar 类型大。由于 char 类型是固定长度的,所以无论存储的数据长度是多少,都会占用固定长度的存储空间。
2024-10-12 20:12:13
1779
6
原创 蓝桥备战题后总结(1)
sort() 方法给数组排序;equals 方法和 ==;HashMap中 values() 方法;HashMap中 KeySet()方法;Java中如何输入字符串;Java中字符串如何转化为字符数组
2024-10-12 15:38:15
646
1
原创 MySQL中库的操作
本篇章起,我们将进入新的阶段“MySQL”的内容更新和讲解,本篇及之后的博客内容,小奥奇将带你彻底熟悉数据库中的基本操作。一、那么,接下来我们来创建一个数据库,但在实际场景中,建库之前,我们先要确定一些事情:1、观察当前的数据库是否已经存在需要建立的数据库2、根据语法规则创建一个数据库3、检查数据库是否创建成功这时,我们再来查看数据库:2.2.2、自定义一个数据库名,如果数据库不存则创建其中为不存在的意思此时2.2.1 中的aokey。
2024-10-11 19:05:37
950
原创 Java中对象的比较(equals、Comparable、Comparator)
Comparable是Java中一个接口,它用于实现对象的比较。如果一个类实现了Comparable接口,就意味着该类的对象是可以排序的。equals是Java中一个方法,用于比较两个对象是否相等。Comparator是Java中一个接口,它可以用于实现两个对象的比较。Comparator接口中有一个方法compare(Object o1, Object o2),该方法用于比较o1和o2的大小关系。
2024-10-10 13:07:55
2599
1
原创 二叉树的构建与遍历
在介绍二叉树的篇章中,我们用方法简单创建了一个二叉树,如下代码:但如果给定一个字符串,我们照上述代码写的话就多而复杂,有人问,创建一个二叉树不是最少含有一个中序遍历和前(后)序遍历才能唯一确定吗?
2024-10-10 13:07:20
381
3
原创 逆波兰表达式求值
逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(JLukasewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。
2024-10-09 13:25:51
658
原创 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例 2:输入:root = [1]输出:[[1]]示例 3:输入:root = []输出:[]
2024-10-09 13:24:10
381
原创 优先级队列 ( PriorityQueue )
前几篇我们讲解过队列,其是一种先进先出(FIFO的数据结构,但在某些特殊情况下,我们操作的数据可能拥有优先级,在出队列时需要优先级高的数据先出。比如排队检票时,我们经常看到“军人优先”;或者我们在电脑玩游戏时,如果有电话打过来,我们会先处理未接电话。在此情况下使用队列显然很不合适。那么我们就要引入优先级队列(堆)。一、优先级队列1.1、概念提供返回最高优先级对象和添加新的对象的两个最基本的操作的数据结构就是优先级队列(Priority Queue)。
2024-10-08 12:26:28
1053
原创 出栈入栈次序匹配
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
2024-10-08 12:25:32
449
原创 探索二叉树的奇幻世界:解密二叉树的结构与遍历
本章习题中很多都是采用递归的方法,求树中节点的个数一样,通过遍历二叉树的每个节点,计算叶子节点的数量。3、分别用根节点的左子树和右子树分别判断是否与子树相同(注意:不用isSameTree的原因是isSameTree只会判断一次,就结束了)2、遍历改树的每一个节点,求每个节点的的左子树和右子树高度的差是不是大于2,是则返回false。,计算左子树和右子树的叶子节点数量。最终,函数返回叶子节点的数量,表示二叉树中叶子节点的数量。遍历二叉树的每个节点 ,使其左右节点进行互换,然后递归左右节点,返回根节点。
2024-10-07 10:03:25
1124
原创 括号匹配——(栈实现)
1、我们先初始化一个栈,对已有的字符串进行逐个遍历;2、进行判断是否为左括号,若为左括号,则存入栈中;若为右括号:此时先判断栈是否为空:3、最后,for 循环遍历完,检查栈是否还有元素(左括号多),若不为空,返回 false;最后返回true;表示全部匹配;
2024-10-07 09:50:15
422
原创 数据结构——List接口
在集合框架中,List是一个接口,通过其源码,我们可以清楚看到其继承了Collection。Collection 也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:List提供了很多方法,如下:(太多,仅截取部分)虽然方法比较多,但是常用方法如下:本篇内容较少,主要介绍了List接口,及其使用,下篇我们将介绍顺序表,及简单实现其部分方法。
2024-10-05 12:17:48
510
原创 双向无头非循环链表的简单实现及介绍
欢迎大家阅读小奥奇的新作,听说上一篇我们留下了一点点 “ 简单的题目 ” ,我们在本篇要干什么呢,请看本篇任务!1、解决 “ 简单的遗留题目 ”2、LInkedList(双向)的使用3、简单的自我模拟LinkedList的实现4、ArrayList和LinkedList的区别
2024-10-05 12:16:37
718
原创 栈和队列相互实现(Java)
若为空,则将Stack1中的所有元素逐个弹出并压入Stack2,然后弹出Stack2的栈顶元素。出栈操作时,将非空队列中的元素逐个取出并加入空队列,直到取出待出栈元素,然后将非空队列和空队列的角色互换,以便下一次操作。另一个栈用于出队操作,当需要出队时,将入队栈中的元素依次弹出并推入出队栈中,然后从出队栈中弹出元素即可实现队列的先进先出特性。使用一个栈来模拟队列时,所有元素都会被推入栈中,这意味着后入栈的元素会先出栈,与队列的先进先出特性不符。队列中的最后一个元素出队,即为栈Q顶元素。
2024-10-04 12:23:58
982
原创 构建自己的二叉树:探索创造力和思考的极限
文章目录一、树型结构1.1 树的概念1.2 概念1.3树的应用二、二叉树2.1概念2.2特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的遍历三、实现前中后序遍历3.1 NLR:前序遍历3.2 LNR:中序遍历3.3 LRN:后序遍历。
2024-10-04 10:22:09
1425
原创 盛最多水的容器
◦ 如果改变右边界,无论右边界移动到哪里,新的水面的高度⼀定不会超过左边界,也就是不会超过现在的水面高度,但是由于容器的宽度减小,因此容器的容积⼀定会变小的。◦ 由于左边界较小,决定了水的高度。如果改变左边界,新的水面高度不确定,但是一定不会超过右边的柱子高度,因此容器的容积可能会增大。枚举出能构成的所有容器,找出其中容积最大的值。,分别指向水槽板的最左端以及最右端,此时容器的宽度为。◦ 容器的宽度一定变小。
2024-10-03 09:29:50
343
原创 快乐数——双指针算法
根据上述的题目分析,我们可以知道,当重复执行 x 的时候,数据会陷入到⼀个”循环“之中。而”快慢指针“有⼀个特性,就是在⼀个圆圈中,快指针总是会追上慢指针的,也就是说他们总会相遇在⼀个位置上。如果相遇位置的值是 1 ,那么这个数⼀定是快乐数;如果相遇位置不是 1 的话,那么就不是快乐数。如下图:快乐数演变后范围已知,我们就要引入双指针算法中的快慢指针,也许大家看到上图,就可能想到我们学习链表时,我们便运用循环,当两指针不相等时,按上图进行移动,直至循环结束
2024-10-02 09:47:04
414
原创 ArrayList与顺序表
如下代码,我们上传一个整形data用于放在数组的最后,size表示数组中含有元素的个数,也是我们要放入元素的下标,最后使数组个数加一即可。如果这样写我们就错啦!我们学习数据结构需要明白:(1) 数据结构虽然抽象一些,但也得有大概的结构(2)逻辑需要非常严谨(也就是看似很简单,但写出来代码可能一大堆)所以,上述代码并不严谨,如果我们传入一个满元素的数组呢,那么新增的元素不就没内存了嘛,也就是无处安放,也就是开会喊了你,但你过去才发现,会议桌周围以及坐满了人,此时我们应该坐哪里?
2024-10-02 09:46:12
765
原创 时间和空间复杂度
我们在面对一个新的题型或复习之前的题时,往往脑洞大开,偶然间发现了新的解题方法,怎么判断不同方法的好坏呢,换句话说:该如何衡量一个算法的好坏呢?一、算法效率算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间。
2024-10-01 09:16:14
743
原创 复写零——双指针算法
(1)定义两个指针如下图,判断cur的值处是否为 0?为0dest后移两步dest后移一步(2)判断dest是否指向数组最后一个元素位置 ,如果是,则停止,不是cur后移一步(3) 最后cur指向即最后复写元素。
2024-10-01 09:14:39
379
原创 移动零——双指针算法
「数组分两块」是⾮常常⻅的⼀种题型,主要就是根据⼀种划分⽅式,将数组的内容分成左右两部分。这种类型的题,⼀般就是使⽤「双指针」来解决。
2024-09-30 18:35:19
1150
原创 Java中异常的认识和创建
Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我 们实际情况的异常结构.Java中已经存在丰富的异常类,但我们在实际开发中难免会遇到一些异常不能用已有的异常来正确表示,那么我们就可以根据实际情况自定义一个异常类。但要注意:自定义异常通常会继承自 Exception 或者 RuntimeException继承自 Exception 的异常默认是受查异常继承自 RuntimeException 的异常默认是非受查异常。
2024-09-30 18:34:22
1188
原创 JavaSE——继承
在Java中我们能够使用类对现实中的实体进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,不同事物之间可能会存在一些关联,那么在设计程序时就需要考虑这个问题。
2024-07-14 13:21:38
1115
2
原创 JavaSE——【封装】
基本规则在文件的最上方加上一个package语句指定该代码在哪个包中包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 )包名要和代码路径相匹配. 例如创建的包, 那么会存在一个对应的路径来存储代码.如果一个类没有package语句, 则该类被放到一个默认包中.操作步骤1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包2. 在弹出的对话框中输入包名
2024-06-08 21:51:06
867
28
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人