- 博客(54)
- 收藏
- 关注
原创 基于springboot实现文件的上传
本文介绍了基于Spring Boot实现文件上传的完整步骤。首先需要添加Thymeleaf依赖,然后在配置文件中设置文件上传大小限制。重点说明了Controller需使用@Controller而非@RestController注解,并提供了上传接口的实现方法,包括获取文件名、指定存储路径等。最后给出了前端HTML表单的编写要点,强调表单action要与Controller中的PostMapping路径对应,并设置enctype为multipart/form-data。通过这四步即可完成简单的Spring B
2025-07-17 00:08:05
170
原创 线程-->你必须知道的基本使用(2)
本文介绍了Java多线程的基本概念和使用方法。首先分析了继承Thread类和实现Runnable接口的区别,指出后者更适合共享资源场景。通过售票系统案例展示了多线程共享变量时可能出现的数据竞争问题。然后讲解了线程终止的两种方式:自动结束和通过变量控制。最后详细介绍了常用线程方法,包括设置线程名称、优先级、休眠和中断等操作,并通过代码示例演示了如何中断休眠中的线程。文章帮助读者理解多线程的基本原理和常见操作。
2025-07-15 14:25:02
367
原创 ThreadLocal深度解析:结构、存储机制与最佳实践
摘要:ThreadLocal是Java实现线程隔离的关键工具类,通过为每个线程创建独立变量副本确保线程安全。其核心在于Thread内部的ThreadLocalMap结构,以ThreadLocal实例为弱引用键存储强引用值。使用中需注意内存泄漏风险,最佳实践包括:1)配合try-finally调用remove();2)用static final修饰实例;3)避免存储大对象。典型应用包括Spring事务管理和上下文传递,但不适用于线程间数据共享场景。正确理解其存储机制(弱键强值)和清理策略是避免泄漏的关键。
2025-07-14 22:08:20
844
原创 线程--->你必须知道的概念和基本使用
本文介绍了Java线程的基本概念和使用方法。首先解释了线程相关术语:程序、进程、线程、单线程/多线程、并发/并行。然后详细讲解了两种创建线程的方法:1)继承Thread类并重写run()方法;2)实现Runnable接口。通过Cat和Dog两个示例代码演示了两种方法的具体实现,并分析了调用start()而非run()方法的原因(start()会启动新线程)。文章还使用ThreadProxy模拟了Thread类的代理模式实现原理,最后展示了多线程交替执行的示例。这些内容为理解Java多线程编程提供了基础指导。
2025-07-14 17:08:45
729
原创 这几种【存储引擎】你不会不知道吧?
存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势。可以使用 show engines;命令来查看当前数据库所支持的所有的存储引擎。
2025-07-11 21:56:27
430
原创 关于MySql索引,你需要知道!!!
本文摘要: MySQL索引实战总结:1.聚集索引规则:InnoDB必有且仅有一个聚集索引,优先主键,次选非空唯一键,最后隐藏row_id。2.索引创建原则:散列度低的字段(如性别)不宜建索引,联合索引遵循最左匹配原则。3.覆盖索引与回表:查询字段包含在索引中可避免回表,提升性能。4.索引失效场景:包括使用函数、类型隐式转换、左模糊查询、负向查询等。5.优化建议:在WHERE、JOIN、ORDER BY字段建索引,避免冗余,推荐自增ID而非随机值作主键。索引创建需平衡查询性能与维护成本。
2025-07-11 21:54:42
296
原创 JVM-----【并发可达性分析】
并发可达性分析是垃圾收集的基础,通过三色标记法(白、灰、黑)来识别可达对象。在并发标记过程中,可能因引用关系变化导致漏标问题,如删除引用2-3同时新增1-3。解决方法有两种:增量更新(记录新增引用1-3,重新扫描黑色对象1)和原始快照(记录删除的引用2-3,通过记录恢复可达性)。这两种方法分别通过破坏引用变化的条件来保证标记准确性。
2025-07-11 21:51:44
347
原创 经典的垃圾收集器!!!
摘要:本文介绍了三种垃圾收集器。Serial是最早的单线程收集器,简单高效但停顿时间长。CMS采用标记-清除算法,追求低停顿,但存在处理器敏感、浮动垃圾和内存碎片问题。G1收集器采用标记-整理算法,划分堆为多个Region,精确控制停顿时间,避免了内存碎片,是未来取代CMS的解决方案。三种收集器各有特点,G1在平衡吞吐量和低停顿方面表现最优。
2025-07-11 21:49:17
457
原创 对象已死?
特性句柄访问直接指针访问访问速度较慢(3次)较快(2次)对象移动影响reference不变需修改reference内存占用额外句柄池空间更节省空间实现复杂度较高较低HotSpot虚拟机主要采用直接指针访问方式,因为访问速度是对象访问的主要性能考量因素。理解这些底层机制有助于我们更好地优化Java应用性能,特别是在处理大量对象创建和访问的场景时。
2025-07-10 22:13:20
651
原创 关于垃圾收集算法你需要知道的是!!!
摘要:垃圾回收主要采用三种算法:1)标记-清除算法简单但会产生内存碎片;2)标记-复制算法无碎片但内存利用率低,适合存活率低的场景;3)标记-整理算法解决碎片问题但计算开销大。实际应用中会根据新生代和老年代的特点组合使用这些算法,以平衡效率和资源利用率。
2025-07-10 22:06:01
191
原创 Java基础面试题及答案!!面试直接答这些
在a和b进行比较是否相等的时候,因为Integer和int涉及到自动拆装箱,所以Integer a=Integer.valueOf(128)与Integer a=128是一个意思,valueOf的内部是有取值范围了,是-128~127,如果超出了这个范围,需要重新new对象,那么两个的地址就不一样了所以a和b是不相等的。Java支持静态代理(手写编写代理类)和动态代理(运行时生成),动态代理包括JDK动态代理和CGLIB动态代理,JDK动态代理要求目标类实现接口,而CGLIB通过继承继承生成子类代理。
2025-07-10 16:25:12
265
原创 HashMap源码分析:put与get方法详解
1. 哈希计算:HashMap通过hash方法优化了key的哈希值分布2. 冲突解决:使用链表和红黑树解决哈希冲突3. 动态扩容:当元素数量超过阈值时自动扩容4. 树化优化:链表过长时转换为红黑树提高查询效率通过深入分析HashMap的put和get方法源码,我们不仅理解了其工作原理,也掌握了性能优化的关键点。HashMap的设计体现了空间换时间和分治思想,是Java集合框架中的经典实现。理解这些底层机制有助于我们在实际开发中更合理地使用HashMap,并能够针对特定场景进行优化。
2025-07-09 23:41:45
407
原创 128陷阱(源码分析)
那么我们就可以来查看valueOf这个方法的源码是怎样的了,下面就是valueOf方法的源码了,可以看到是先进行一个if条件,如果i是大于IntegerCache的最小或者最大才会返回他的本来的一个值。我们知道在包装类型和基本类型中涉及到自动拆装箱,所以我们看到的Integer a=128这一行代码本质上应该是Integer a=Integer.valueOf(128);而且我们知道的是“==” 在比较引用类型的时候是看内存的地址,因此上面代码当a和b都是128的时候才会输出false。
2025-07-08 14:02:38
281
原创 云服务器安装redis
第一步:上传redis压缩安装包到服务器可以在官网上下载,记得要下载.tar.gz结尾了,这是在Linux上进行安装的第二步:将压缩安装包解压第三步:进入安装包,编译redis:make第四步:安装redis: make install第五步:根据需要修改redis的配置文件,redis.conf 下面是对配置文件中关键参数的说明①bind: 127.0.0.1(注释掉):bind指令用于设置Redis服务器监听的IP地址。当bind被设置为。
2025-03-13 13:33:49
755
原创 Java并发编程:从基础到实践
Java并发编程是提高系统性能的重要手段,但也伴随着复杂性。通过掌握线程、同步机制、线程间通信以及并发工具类,你可以编写出高效且安全的并发程序。希望本文能帮助你更好地理解Java并发编程的核心概念和实践技巧!
2025-02-12 19:57:19
587
原创 银行家算法:避免死锁的资源分配策略
银行家算法是一种死锁避免算法,通过模拟资源分配过程,判断系统是否处于安全状态,从而决定是否分配资源。在分配资源之前,检查分配后系统是否仍然处于安全状态,如果是,则分配资源;否则,拒绝分配。算法名称来源于银行家的借贷行为:银行家在放贷时需要确保手头有足够的资金满足所有客户的提款需求,避免资金链断裂。银行家算法是一种经典的死锁避免算法,通过模拟资源分配过程,确保系统始终处于安全状态。尽管其实用性受到一定限制,但其思想对理解资源分配和死锁问题具有重要意义。
2025-02-12 19:51:35
1325
原创 任务调度算法
不同的调度算法适用于不同的场景,选择调度算法时需要综合考虑系统的目标(如响应时间、吞吐量、公平性等)以及任务的特点(如长任务、短任务、实时任务等)。现代操作系统通常采用多种调度算法的组合,以适应多样化的任务需求。
2025-02-12 19:48:31
1170
原创 一、lambda表达式处理stream操作
通过stream()方法创建流,再使用collect(Collectors.toSet())将流中的元素收集到Set中,set的特性会自动去掉重复元素。//Person::getName是键 p->p是值 转换为map集合键值对的形式。reduce是将流中的元素组合成一个单个的值,并通过指定的二元操作符来不断地将元素进行合并和积累。//分组是流里面的groupingBy然后里面是根据年龄分的组。把map转为list,对键值对进行统一的处理,通过entry进行了统一的处理。//map转为list集合。
2025-02-07 23:41:35
661
原创 基于python的豆瓣电影TOP250-可视化数据分析平台
首先爬取豆瓣电影TOP250的电影数据存储到数据库中,然后通过echarts图进行可视化展示,下面是图片。电影评价人数TOP20。
2025-02-07 17:53:56
327
2
原创 128陷阱
在上面的代码运行中发现当a和b是127的时候输出是true,当a和b是128的时候输出的是false,这里就涉及到了128陷阱二、128陷阱详解整数缓存机制: Java 对于值在 -128 到 127 之间的Integer对象会自动缓存。这意味着如果你使用自动装箱创建了一个Integer对象,并且该值在 -128 到 127 之间,Java 会使用相同的实例。他们指向的是同一处地址超出缓存范围的对象: 对于超出 -128 到 127 范围的值,Integer对象不会被缓存,每次都会创建新的对象。
2025-02-06 22:57:15
327
原创 数据结构-八大排序
快速排序:(是经常用的一种排序方式)第一步,假设将待排序数组当中的第一个数字作为基准数,把35作为基准数,第二步,定义i和j游标,分别指向待排序数组的第一位和最后一位。第五步,判断i和j游标是否相遇 5.1未相遇,i和j指向的值进行交换,然后继续进行3 4 5步 5.2当i和j游标相遇,相遇位置的数和基准数进行位置交换,现在的数中,前面的一定比基准数小后面的一定比基准数大。插入排序过程中,如果后面的数据比较小,前边的数据比较大,那么就可能会导致小数据向前移动的次数比较多,进而将整个算法的效率降低。
2025-01-16 12:15:07
263
原创 Java内存图
将来面试要考内存分成了五大区:方法区、栈、堆、计数器、本地方法栈,意思就是将整个大的数组分为了五大区,不管什么语言到内存中就变成了C语言,计算机只能识别C语言,Java虽然转成了C但是操作系统还是不认识,最后必须换成操作系统属性的语言,利用本地方法栈进行翻译,只有这个时候才能运行,语言一样的程序不一定能调用,程序的运行就是操作系统的调用,操作系统最终在硬件运行,任何程序在电脑的运行,最终体现在硬件上,操作系统内核提供方法,只有翻译成操作系统内核的方法,才能操作硬件,驱动才能认识。
2025-01-16 12:11:17
696
1
原创 Docker(属于C/S架构软件)属于app的东西
一、简介与概述 容器就相当于是一个平台,里面打包了所有的东西,是一个工具包,使其运行环境能够做到一层封装,到处运行 跨平台服务器,可以一键部署 就是一个完整的centos系统,只不过更轻量,一个虚拟化轻量级linux服务器,可以解决我们在开发环境中运行配置问题 二、为什么使用 docker:虚拟化容器技术 docker主要解决开发环境配置迁移的问题 你的项目到任意到其他的无环境的电脑上,docker会自动安装环境 docker最终解决了运行中环境配置的问题,自动配置好了,不用
2025-01-16 12:09:22
1027
原创 Web开发
在resources创建包来实现, 一、springboot对静态资源的映射规则 这些自动装配先在pom导依赖,然后springboot的autoconfiguration就自动配置,在外部资源中找xxxproperties就是该资源的自动配置文件 有css html文件夹 springboot对静态资源也做了映射的规则 :实现了资源的 加载 做了一些整合 1.所有的/webjars/**,都去classpath:/META-INF/resouces/webjar
2025-01-16 12:08:05
951
原创 springmvc是表现层 和客户端进行数据的交互 底层是servlet
springmvc框架 一、三层框架 持久层:jdbc、mybatis、jdbctemplet springmvc代替了之前的servlet M:model javabean(实体类) V:view(呈现给前端的页面) jsp C:controller(前端的登录) 二、springmvc的概述 基于Java实现的mvc设计模型 三、流程 因为涉及到和前端页面的交互了,所以写的是javaweb项目 1.创建maven的web项目,导入开发的坐标 2.编写ind
2025-01-16 12:07:26
664
原创 springboot整合mvc
一、springboot自动管理springmvc组件 springmvc是组件化的 所有的请求发给dispatcherservlet,分给处理器映射器,然后给处理器 controller->service->dao->数据库,数据库查到之后返回到dispatchservlet,然后发给视图解析器,视图解析器带着数据返回视图 spring boot自动管理这些组件化的东西,再springboot项目搭建的时候,没有配置mvc,但是@contoller认识,因为是spring,扫描器被
2025-01-16 12:06:33
504
原创 Spring IOC
一、spring spring的核心是控制反转(ioc)和面向切面编程(aop),spring是一个分层的一站式轻量级开源框架 ioc讲将我们之前的new的事情交给ioc来管理 aop:jdk的动态代理 优点: 1.方便解耦,简化开发,spring是一个大工厂,将所有对象创建和依赖关系的维护交给spring管理 ioc的作用 2.aop面向切面编程,对程序进行权限拦截、运行监控 3.声明事务的支持,只需要通过配置就可以完成对事务的管理,无需手动编程 4.方便程序的测试,spring对ju
2025-01-16 12:05:00
815
原创 Maven项目管理工具
一、什么是maven 跨平台 不需要考虑版本的问题 进行依赖管理 以及项目信息管理 说白了就是一个架子来管理项目 maven依赖自动下载,统一依赖管理 二、什么是依赖管理 对于第三方依赖包的管理,可以连接互联网下载项目所需要的第三方jar包 但是有了maven之后就不用自己联网下载了,maven会自动在网上下载 三、传统的加载依赖 /// maven的加载依赖 maven只要编写pom文件然后引入坐标即可就配置好了 传统的需要这个官网那个官网找jar包,然后再本地的文件包中
2025-01-16 12:02:37
565
原创 MVCC(多版本并发控制)
问题:如果有人从数据库中读数据的同时,有另外的人写入数据,有可能读数据的人会看到【半写】或者不一致的数据。解决:1)通过加锁,让所有的读者等待写者完成工作,但是效率会非常的差2)利用mvcc,mvcc使用了一种不同的手段,每个连接到数据库的读者,在某个瞬间看到的是数据库的一个快照,写着写操作造成的变化在写操作完成之前(数据库事务提交之前)对于其他的读者来说是不可见的。
2025-01-16 12:00:43
425
原创 git版本控制
一、gitignore文件 屏蔽文件,有一些文件没有必要上传到远程仓库 git add.提交的是新文件和被修改的文件,不包括被删除的文件 git add -A 提交所有的变化 git add -U 提交被修改和被删除的文件,不包括新文件 删除不进工作区,直接进了暂存区, 新建或者修改都会到了工作区 为什么用add.不用add-A 因为删除本身直接进入的是暂存区,所以只需要保证把修改和新增弄到暂存区就行,那就是直接add.就可以 创建一个名为.gitignore的文件,列出要忽略的文件
2025-01-16 11:59:07
1114
原创 Java反射
一、反射的定义 在运行的过程中,对于任意的一个类,都能知道这个类的所有的方法和属性 二、Class类 Class就是类, 类:具有相同属性或者行为的一类事物 (类都有属性 构造器 方法 都能调用方法) getclass返回的是一个class对象。 当一个类被加载的时候,会产生这个类的类对象,通过类对象获取类的方法属性构造器 三、Class类中要掌握的方法 获取类对象的三种方式 forname .class getclass() 1.通过class.forName("全路径") 获取类对
2025-01-16 11:57:21
286
原创 XML详细记录
xml文档约束是用另一个文件来约束xml文档的结构,例如要求xml文档的根元素必须是<students>,在<students>元素下可以包含0~n个<student>元素,每个<student>元素必须有一个number属性,而且还要有三个子元素,分别为<name>、<age>、<sex>,这三个子元素的内容必须为文本内容,而不能是子元素。通常应用程序都会要求xml文件的结构是固定的,以满足自己的需求,这就说明,不同的应用程序要求自己的xml文档必须符合一定的要求。我们要学习的还是1.0版本!
2025-01-16 00:00:21
831
原创 Nginx快速入门
1.Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2.其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
2025-01-15 23:51:15
747
空空如也
zookeeper完全分布式
2024-11-29
打印m行n列的任意字符
2022-10-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅