- 博客(115)
- 收藏
- 关注
原创 MySQL EXPLAIN 全面解析:优化SQL查询的终极指南
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的sql语句的。分析你的查询语句或是表结构的性能瓶颈。
2025-07-20 23:31:47
692
原创 面试必问:反射机制的核心问题与回答思路
反射在运行状态中,对于任意一个类,都知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射。
2025-07-16 18:03:52
308
原创 ThreadLocal原理解析:如何实现线程安全的变量隔离?
(6)holder.get()方法返回的是ThreadLocalTest的实例对象,将形参msg使用集合List的add()方法给实例对象的message属性赋值。然后获取当前的线程,查找当前线程的ThreadLocalMap,如果map为空,则调用createMap()方法创建,不为空则将value赋值给map。代码片段创建了10个线程,分别调用add()方法给ThreadLocalTest对象的messages属性赋值,最后将messages打印出来。,也就是说每个线程有一个自己的。
2025-07-15 01:29:03
386
原创 从进程到协程:详解程序运行的 “三驾马车”
进程是操作系统中分配资源的最小单位,每个进程都有独立的内存空间、数据和资源。进程就像是一个独立的 “小王国”,每个 “小王国” 都有自己的领地和资源,互不干扰。线程是操作系统中调度的最小单位,是进程中的一个执行流。一个进程可以包含多个线程,它们共享进程的资源。线程可以看作是进程这个 “小王国” 里的 “工作人员”。协程是比线程更轻量级的执行单元,它由程序自行调度,不依赖操作系统内核。协程在单线程内实现多任务协作。协程可看做是”小国王“中工作人员的助手。
2025-07-14 15:10:06
637
原创 用Java设计模式优化代码:策略模式真实案例
设计模式是指解决问题的通用方案,是一种抽象化的思维模式,用于解决各种不同的软件设计问题。设计模式不是完整的代码,而是一种描述问题和解决方案之间关系的模板。
2025-07-14 00:40:49
961
原创 打破并发瓶颈:虚拟线程实现详解与传统线程模型的性能对比
定义:(1)虚拟线程是Java19提出来的一个概念,Java19提供特性预览,开放实装是Java21。(2)虚拟线程是一种由JVM而非操作系统直接管理的线程。它独立于操作系统。虚拟线程是依附于主线程的,如果主线程销毁了,虚拟线程也不复存在。特性(优点):1.轻量级:虚拟线程的创建和销毁代价极低,与传统线程相比内存占用少。2.高并发:支持数百万级别的并发进程,不会因线程数量限制系统性能。3.与传统线程兼容:完全兼容现有的线程API,无需修改代码即可引入虚拟线程。
2025-07-13 23:20:43
797
原创 深入剖析HashMap:get与put方法的核心实现逻辑
(1)put方法的作用是将一对key-value插入到HashMap中,若HashMap中已经存在这个Key,则用新的value替换旧的value。Node是定义了一个静态内部类,包括hash值、key、value、next指针。具体的代码都封装在getNode方法中,该方法接收两个参数,分别是key的hash值、key本身。(1)get方法的作用是传入我们需要节点的key,然后将这个节点的value值返回。
2025-07-09 21:25:27
326
原创 128陷阱详解(源码分析)
在Integer的valueOf()方中,当数值在-128-127之间时,数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。
2025-07-08 19:34:33
204
原创 redis面试题(一)
Redis是一个使用C语言编写的,开源的高性能非关系型的键值对数据库。Redis可以存储键和5种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。与传统数据库不同的是Redis的数据是存在内存中的,所以读写速度非常快,因此Redis被广泛应用于缓存方向。
2025-07-03 17:01:13
949
原创 Java基础面试题(三)
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为jva语言的反射机制。静态编译和动态编译静态编译:在编译时确定类型,绑定对象动态编译:运行时确定类型,绑定对象。
2025-07-03 16:10:36
730
原创 Java基础知识面试题(二)
Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中"没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
2025-07-02 17:22:35
538
原创 银行家算法
检查P0:Need (7, 4, 3) > Work (3, 3, 2) → 不可执行。- 检查P2:Need (6, 0, 0) > Work (5, 3, 2) → 不可执行。- 检查P1:Need (1, 2, 2) ≤ Work (3, 3, 2) → 可执行。- 检查P3:Need (0, 1, 1) ≤ Work (5, 3, 2) → 可执行。- 检查P4:Need (4, 3, 1) ≤ Work (7, 4, 3) → 可执行。定义了系统中n个进程中的每个进程对资源的最大需求。
2025-02-11 20:49:23
595
原创 B树(类似红黑树)、B+树
由于B树的每一个节点都包含key和value,因此我们根据key查找value时,只需要找到key所在的位置,就能找到value,但B+树只有叶子结点存储数据,索引每一次查找,都必须一次一次,一直找到树的最大深度处,也就是叶子结点的深度,才能找到value。减少寻址次数,增加对比次数(B树);磁盘寻址时间较长,所以要减少寻址次数,用B树。B+树的叶子结点都是相连的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。,只当做索引使用,因此在内存相同的情况下,能够存放更多的key。数据以文件的形式存储。
2025-02-04 00:22:21
633
原创 Java基础(六)
new方法创建的对象不在字符串常量池中,并且k5,k6有自己独立的空间和地址,即使k5和k6的数据一样。除非String k7=k6,这样k7和k6指的是同一块内存,同一块地址。将aaa改成kk,需要两个边界,不然读出来的数据是kka,两个边界比较麻烦。所以原来的空间是不能用的。字符串包括:汉字、字母、数字、几何图形(%)、换行、空格。如果是一个单等于号,意思是保持指向相同。中,常量池内没有被指向的数据空间不会被。码点,输出的数字为哈的编码值。==基本类型,比较的是。==引用类型,比较的是。
2025-02-04 00:20:06
443
原创 输入、输出(tomcat)
类名+包名.getDeclaredAnnotation(WebServlet.class)用来获取servlet的url。(servlet是动态资源,html是静态资源)servlet容器就是MapHash。servlet什么时候加载动态资源?
2025-02-04 00:14:04
223
原创 Java异常详解
Class clazz=class.forName("com.qcby.demo.Animal") //这也是由编译器找到的,但是这个属于异常,这是程序给我们的提示。String a=1;//编译出错-----》这个是由编译器给我们找到的错误。主方法中用try-catch,不影响后面代码的执行。
2025-02-04 00:08:28
380
原创 Java基础(五)
将变量私有化设置get,set方法可以控制此变量的可读可写,get,set方法没有任何安全的性质,变量只设置可读有安全性,但是数组不具有安全性,因为可设置另一个数组指向相同的数组地址进行修改数据。所以在改动后需要将数据设置为无效,将内存回收。Java会自动回收,有定时检测器。调用方法也就创建了对象。类中有一个没有返回值,方法名与类名相同的就是构造方法。getage()访问器,setage()更改器。指的是方法的名字相同,但是入参不一样。这样更改就不会修改数据。对方法的调用是拷贝使用;
2025-02-04 00:05:46
427
原创 创建链表详解
因为listnode所定义指针存的地址还必须是listnode类的存储结构。head==null,head相当于普通变量,存放的是地址。ListNode next并没有创建对象,只是存放地址。1.如何创建链表---------->类与对象。无参构造器listnode()listnode类型。
2025-02-02 17:12:49
183
原创 Java基础(三)
(根据电压高低,电阻发生变化,可在绝缘体、导体间来回切换),强电压作用到半导体的时候,它的化学键被击穿,它就变成导体了。当弱电压的时候,化学键又很稳定,打不穿了,是绝缘体。与运算只有1-1=1,其它都是0;:与电路(两个高电压输出一个高电压)、异或电路、或电路、非电路(只有一个入);有一组寄存器,一件事情分为好几步,寄存器告诉小电路下一步要做的事情)(<<)左移(补0)、(>>)右移(补符号位,符号位是1补1,是0补0。11.移位运算(移出内存的被舍弃,空缺的补数)有。(在没有超范围的计算下是成立的);
2025-02-02 17:08:09
268
原创 Java基础(二)
电脑申请空间最低是一字节(8bit),那为什么不用1字节来表示。在操作系统上运行的只有C,java的布尔类型其实是用C语言的int来实现的。C语言有6种类型:char,short,int,long,double,float。在操作系统中运行的时候只有这六种变量。在内存也只有这6种变量。2.国内的编码有:asscii,unicode,utf-8,jbk(ANSI),utf-16,utf-32。编码是每一种几何图形。的,ascii编码只能表示英文字母和一些符号不够用。都是一套编码,编码只跟几何图形的形状有关。
2025-02-02 17:05:05
339
原创 Java基础(一)
float表示的越精确,绝对值越大。进制的表达方式:0b-----二进制开头;0-----八进制开头;0x------十六进制(0~15),10~15(A~F)例子:(七进制) 6543 = 6000+500+40+3=6*7^3+5*7^2+4*7^1+3(十进制):每个英文的首字母大写,其他字母小写,第一个单词全部小写-------文件名、变量名、方法名。是程序样例,别人给你写了套代码让你用,里边加上各种说明,怎么调用,什么意思,就是SDK;:每个英文的首字母大写,其他字母小写--------类名。
2025-02-02 17:00:50
220
原创 内存图详解
上,硬盘上只能存储文件,硬盘中有虚拟内存也是以文件的形式存储变量、函数等;内存存储变量函数,在内存上运行程序。必须经过操作系统内核调用硬件,不经过操作系统内核单独调用会有干扰。栈、方法区、堆、程序计数器、本地方法栈。:调度硬件,使硬件协同工作。每个程序都是独占一块内存。
2025-02-02 16:54:35
341
原创 冒泡排序算法
对存放原始数组的数据,按照从前往后的方向进行多次扫描,每次扫描都称为一趟。当发现相邻两个数据的大小次序不符合时,即将这两个数据进行互换,如果从小大小排序,这时较小的数据就会逐个往前移动,好像气泡网上漂浮一样。
2025-02-02 16:43:46
191
原创 递归算法详解
那么问题就转化成了第四节台阶和第三节台阶的跳法既: f(n) = f(n-1) + f(n-2)假设现在有5节台阶,那么跳上第五节台阶有两种方案。第二节台阶:有每次都跳一节和一次跳两节两种跳法。1.确定递归函数的参数和返回值。第一:从第四节台阶向上跳一节,第二:从第三节台阶上向上跳两节。3.确定单层递归的逻辑。第一节台阶:只有1种跳法。
2025-02-02 16:40:01
210
原创 双指针算法详解
双指针技巧主要分为两类:左右指针和快慢指针对于单链表来说,大部分技巧都属于快慢指针,在数组中并没有真正意义上的指针,但我们可以把索引当做数组中的指针。
2025-02-02 16:36:59
242
原创 有效的括号
遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false。
2025-02-02 16:32:13
475
原创 用一个数组实现两个栈
3.如果需要对第一个栈执行元素入栈操作,那么将元素赋值到左边下标变量指示的位置。4.如果需要对第二个栈执行元素入栈操作,那么将元素赋值到右边下标变量指示的位置。2.左边的下标指示第一个栈,右边的下标指示第二个栈。1.初始化两个下标变量分别指向数组的左右两端。5.第一个栈向右增长,第二个栈向左增长。用一个数组实现两个栈。
2025-02-02 16:14:43
610
原创 用队列实现栈
2.入栈的时候,找到不为空的队列,出size-1个元素到重新插入到队列当中,剩下的这个元素就是出栈的元素。2.入栈的时候,找到不为空的队列,出size-1个元素到另一个队列中,剩下的这个元素就是出栈的元素。第二种是用一个队列实现一个栈。基本思路:使用两个队列,其中一个队列用来存放元素,另一个用来做辅助输出。基本思路:使用两个队列,其中一个队列用来存放元素,另一个用来做辅助输出。,刚开始都为空指定入到一个队列。,刚开始都为空指定入到一个队列。1.入栈的时候,入到不为空的。1.入栈的时候,入到不为空的。
2025-02-01 23:20:53
322
原创 用栈去实现队列
我们要用栈的先进后出,来模拟实现队列的先进后出。我们需要借助两个栈去实现,分别叫做栈1和栈2。栈1主要是用来存储数据的,我们将要插入的数据全部存放在栈1当中。首先判断栈2当中是否有数据,如果有,怎直接返回栈2的顶部元素。如果没有,则将栈1当中的数据全部放入到栈2当中。队列的特点:先进先出。
2025-02-01 23:19:06
201
原创 String、StringBuffer基本用法——字符串处理
byte[] getBytes() 将一个字符串转换成字节数组。int length() 得到一个字符串的字符个数。
2025-02-01 23:16:59
373
原创 Spring框架的介绍
Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE.Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。
2025-02-01 23:08:38
244
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅