自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 个人总结八股文之-基础篇(持续更新)

负载因子越大,数组中元素填满成都越高,越容易出现哈希冲突;负载因子越小,数组中元素填满成都越低,空间利用率低。避免频繁扩容。可以使阈值是整数,因为阈值=容量*负载因子,容量通常是2的幂次方,优化位运算操作,提高计算效率。

2025-06-02 23:08:27 720

原创 个人总结八股之Spring篇

IoC(控制反转),AOP(面向切面编程)IoC:一种设计模式,将对象的创建和依赖管理交给外部容器来管理。AOP:一种编程思想,将横切关注点与业务逻辑解耦。IoC好处:解耦对象依赖关系,提高代码的可测性,便于代码复用。

2025-05-19 23:40:55 330

原创 Java实习生面试题(2025.3.23 be)

v-show` 和 `v-if` 都是 Vue 中的条件渲染指令,它们的主要区别在于渲染策略:`v-if` 会根据条件决定是否编译元素,而 `v-show` 则始终编译元素,只是通过改变 CSS 的 `display` 属性来控制显示与隐藏。:分页插件通过拦截 SQL 查询,在执行前修改 SQL,自动添加分页条件,例如 LIMIT 和 OFFSET。:返回的数据会封装到 IPage 对象中,包括分页数据、总记录数、总页数等。构造器注入、静态工厂的方法注入。setter 方法注入。第一条:查询分页数据。

2025-03-23 22:51:16 705

原创 ApplicationContext和BeanFactory有什么区别

ApplicationContext继承了BeanFactory,它拥有BeanFactory的所有特点,也是一个Bean工厂,除此之外它还继承了EnvironmentCapable、MessageSource、ApplicationEventPublisher等接口,使其拥有了获取系统环境变量、国际化、事件发布等功能,这是BeanFactory所不具备的。BeanFactory是Spring中非常核心的组件,表示Bean工厂,可以生成Bean,维护Bean。

2025-03-17 13:23:16 121

原创 Spring中的事务是如何实现的

3.当调用代理对象的方法时,会先判断该方法是否加了@Transactional注解。2.首先对于使用了@Transactional注解的Bean,Spring会。5.并且修改数据库连接的autocommit属性为false,10.Spring事务的传播机制是Spring事务自己实现的。来做的,一个数据库连接一个事务,如果传播机制配置为需要新开一个。8.如果出现了异常并且需要回滚就回滚事务,否则仍然提交事务。9.Spring事务的隔离级别对应的就是数据库的隔离级别。,这是实现Spring事务非常重要的一步。

2025-03-10 13:58:52 239

原创 Spring中Bean是线程安全的吗

另外,Bean是不是安全的,跟Bean的作用域没有关系,Bean的作用域只是表示Bean的生命周期范围,对于任何生命周期的Bean都是一个对象,这个对象是不是线程安全的,还是得看这个Bean对象本身。2.如果Bean是有状态的,那么Bean则不是线程安全的。1.如果Bean是无状态的,那么Bean则是线程安全的。

2025-03-03 14:07:09 122

原创 Spring事务什么时候会失效

2、方法不是public。@Transactional只能用于public的方法上,否则事务会失效,如果要用在非public方法上,可以开启AspectJ代理模式。类里面使用this调用本类方法(this通常省略),此时这个this不是代理类,而是UserService本身。5、异常被吃掉,事务不会回滚。(或者抛出的异常没有被定义,默认为RuntimeException)Spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了!4、没有被Spring管理。

2025-02-24 15:19:59 175

原创 深入浅出理解Redis缓存雪崩、缓存击穿、缓存穿透及其解决方案

3、缓存穿透:某一时刻访问Redis缓存的大量key在Redis中不存在(比如黑客伪造大量乱七八糟的key进行攻击)。也会给数据造成压力。它的作用就是判断key在Redis中是否存在,如果不存在就将该key拦截。1、缓存雪崩:缓存中某一时刻大量的热点数据同时过期,导致大量请求直接访问mysql。2、缓存击穿:缓存中某一时刻某一个热点key失效,也会导致大量请求直接访问mysql。解决办法就是对这个热点key不设置过期时间。缓存中存放的大多是热点数据,目的就是可以直接从缓存中获取数据而不用访问数据库。

2025-02-21 16:36:25 173

原创 Spring事务传播机制

多个事务方法互相调用时,事务如何在这些方法间传播,方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体执行造成影响,同时方法A的事务对方法B的事务执行也有影响,这种影响具体是什么就由两个事务定义的事务传播类型所决定。1.REQUIRED(Spring默认的事务传播机制):如果没有事务,就自己创建事务;7.NESTED:如果当前事务存在,就在嵌套事务中执行,否则和REQUIRED一样。6.NEVER:不使用事务,如果存在事务,就抛出异常。

2025-02-21 16:04:25 134

原创 浅谈自己对RPC的理解

RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,它允许程序调用另一个地址空间(通常是在不同计算机上)的过程或函数,而不需要程序员显示地编写网络通信代码。

2025-02-11 13:36:05 476

原创 单例模式和单例Bean

单例模式是一种软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。

2025-02-09 17:22:26 488 1

原创 谈谈对IOC的理解

所有这些都是我们程序员做的,以为我们只是写了类而已,所有的这些都是Spring做的,它才是幕后黑手。所以我们可以发现,我们自己控制比交给Spring来控制,我们的代码量以及代码复杂度是要高很多的,反言之,将对象交给Spring来控制,减轻的程序员的负担。如果我们不用Spring,那我们得自己来做这两件事,反过来,我们用Spring,这两件事就不用我们做了,我们要做的仅仅是定义类,以及定义哪些属性需要Spring来赋值(比如某个属性上加@Autowired),而这其实就是第二个问题的答案,这就是。

2025-02-05 13:05:18 283

原创 浅谈对AQS的理解,以及如何用AQS实现可重入锁

2、AQS由一个信号量state和一个由线程组成的双向链表队列组成。其中的线程队列就是给线程排队的,而state就像一个红绿灯,用来控制线程的排队和放行。在不同的场景下有不同的意义。3、在可重入锁这个场景下,state表示加锁数量,state=0表示无锁。每加一个锁state就加1,每释放一个锁state就减1。1、AQS是Java的线程同步机制,是JDK中许多锁工具的核心实现框架。

2025-02-02 19:47:45 142

原创 Synchronized和ReentrantLock的区别

3、Synchronized底层是JVM层面的锁,ReentrantLock底层是API层面的锁。2、Synchronized会自动加锁与释放锁,ReentrantLock需要手动加锁与释放锁。4、Synchronized是非公平锁,ReentrantLock可以选择是公平锁或非公平锁。1、Synchronized是关键字,ReentrantLock是类。5、Synchronized锁的是对象,锁信息保存在对象头中;6、Synchronized底层有一个锁升级的过程。

2025-02-02 19:39:45 254

原创 进程和线程的区别

进程是程序的一次,是的基本单位;线程是进程中的一个,是的基本单位。

2025-01-26 18:03:00 200

原创 Sychronized的偏向锁、轻量级锁、重量级锁

2、轻量级锁:由偏向锁升级而来,当线程获取到锁后,此时这把锁是偏向锁,如果此时有第二个线程来竞争该锁,偏向锁就会升级为轻量级锁,之所以叫轻量级锁,是为了与重量级锁区分,轻量级锁底层是通过自旋来实现的,并不会阻塞线程。1、偏向锁:在锁对象的对象头中记录一下当前获取到该锁的线程ID,该线程下次获取锁就会直接获取到该锁。3、如果自旋次数过多仍然没有获取到锁,则会升级为重量级锁,重量级锁会阻塞线程。

2025-01-21 13:10:46 152

原创 ReentrantLock 相关

ReentrantLock 的公平锁和非公平锁底层都是用AQS来排队的,它们的区别在于:在使用lock()方法加锁时,公平锁会检查AQS队列中是否有线程在排队,如果有就直接排队;不管是公平锁还是非公平锁,竞争不到锁都会去排队。当锁释放时,都是唤醒最前面的锁,这一点两者是相同的。tryLock()是尝试加锁,可能加到锁也可能加不到锁,该方法不会阻塞线程,加锁成功返回true,加锁失败返回false。另外,ReentrantLock 是可重入锁,不管是公平锁还是非公平锁都是可重入的。

2025-01-17 12:56:48 223

原创 线程池底部工作原理

如果线程池中的线程数量大于corePoolSize,缓冲队列workQueue已满,并且线程数量等于maximumPoolSize,那么通过handler指定的策略来处理被添加的错误。如果线程池中的线程数量大于等于corePoolSize,缓冲队列workQueue已满,但是线程数量小于maximumPoolSize,那么创建新的线程来处理被添加的任务。如果线程池中的线程数量大于corePoolSize,当线程空闲时间大于keepAliveTime,就将这个线程终止,这样线程池就可以动态调整池中线程数量。

2025-01-15 15:21:16 436

原创 基于springboot+mybatis-plus的线上订餐系统项目

前端:html+css+js+JQuery+BootStrap(做样式)+Axios(发送请求)后端:SpringBoot+Mybatis+Mybatis-plus+Spring MVC+Maven数据库:Mysql这里我主要介绍后端controller:表现层,定义控制类,负责与用户进行交互,接受用户请求,并调用业务逻辑层(service)的方法处理请求,然后将结果返回给用户。

2025-01-14 12:02:33 992

原创 项目如何排查JVM的问题?

5.首先,初步猜测频繁发送fullgc的原因,如果频繁发送fullgc但又一直没有出现内存溢出,那么表示fullgc实际上是回收了很多对象了,所以这些对象最好在younggc过程中就回收掉,避免这些对象进入老年代,对于这种情况,就要考虑这些存活时间不长的对象是不是比较大,导致年轻代放不下,直接进入到了老年代,尝试加大年轻代的大小,如果改完之后fullgc减少,则证明修改有效。6.同时,还可以找到占用CPU最多的线程,定位到具体方法,优化这个方法的执行,看是否能避免某些对象的创建,从而节省内存。

2024-12-03 23:31:12 189

原创 类加载器双亲委派机制

JVM在加载类时,会使用AppClassLoader中的loadClass方法来加载类,在这个方法中又会使用ExtClassLoader中的loadClass方法来加载类,在这个方法中又会使用BootstrapClassLoader中的loadClass方法来加载类。如果BootstrapClassLoader加载到了就直接成功,如果BootstrapClassLoader没有加载到,那么ExtClassLoader就会⾃⼰尝试加载该类,如果没有加载到,那么则会由AppClassLoader来加载这个类。

2024-11-25 15:03:22 197

原创 医疗大数据可视化面板

{"lng":118.099355,"lat":24.471346,"url":"http://www.baidu.com","id":1,"name":"厦门中山医院"},{"lng":118.088017,"lat":24.451038,"url":"http://www.mi.com","id":2,"name":"厦门第一医院"},{"lng":118.140631,"lat":24.500477,"url":"http://www.csdn.com","id":3,"name":"厦门中医院"}

2024-11-21 13:42:01 704

原创 Java面试必问的异常体系(简单易懂)

所以我们在写一个方法时,我们需要考虑的就是,本方法能否合理的处理该异常,如果处理不了就继续向上抛出异常,包括本方法在调用另外一个方法时,发现出现了异常,如果这个异常应该由自己来处理,那就捕获该异常并进行处理。异常相当于给出一种提示,如果我们抛出异常,就相当于告诉上层方法,我抛了一个异常,我处理不了这个异常,交给你来处理,而对于上层方法来说,它也需要决定自己能不能处理这个异常,是否也需要交给它的上层。二、在Java异常处理机制中,什么时候应该抛出异常,什么时候应该捕获异常?

2024-11-21 13:31:59 216

原创 说说CopyOnWriteArrayList的底层原理是怎样的

但是由于添加元素时需要复制新数组,CopyOnWriteArrayList会比较占用内存,同时可能读到的数据不是实时最新的数据,所以不适合实时性要求很高的场景。1.首先CopyOnWriteArrayList内部是基于数组实现的,在向CopyOnWriteArrayList添加元素时,会先复制一个新数组,写操作在新数组上进行,读操作在原数组上进行,换句话说,就是读取原数组的数据后将该数据写入新数组。2.并且,在执行写操作时会加锁,为了避免并发写入时产生的数据丢失等问题。

2024-11-19 13:11:10 215

原创 深拷贝和浅拷贝

深拷贝和浅拷贝是在复制对象或数据结构时所使用的两种不同的拷贝方式,它们的区别在于拷贝程度和对原始对象内部结构的影响。

2024-11-11 00:19:43 572

原创 HashMap相关

ii.如果是链表节点,则将key和value封装成一个链表Node并通过尾插法插入到链表末尾,因为是尾插法,所以需要遍历链表,在遍历链表的过程中会判断是否存在当前key,如果存在则更新value,当链表遍历完成后,将新链表Node插入到链表中,最后看当前链表节点个数,如果大于等于8,就将链表转成红黑树。2、1.7中链表插入使用的是头插法,1.8中链表插入使用的是尾插法,因为1.8中插入key和value时需要判断链表元素个数,所以需要遍历链表统计链表元素个数,正好使用尾插法。

2024-11-04 00:31:01 905

原创 final

【代码】final。

2024-10-27 15:57:22 473

原创 hashCode与equals

对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,看该位置是否有值,如果没有,HashSet会假设对象没有重复出现。如果不同的话,就会重新散列到其他位置。hashCode()定义在JDK的Object.java中,Java中的任何类都包含有hashCode()函数。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使指向相同的数据)。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速检索出对应的“值”。

2024-10-21 15:49:05 243

原创 通信的应用场景

读取 解析 处理请求的线程之间保证线程安全 ,每个环节都可以使用线程池处理。- A服务需要使用B服务时,先去注册中心拿到B服务的地址,直接连接B服务。- 分布式服务: 提供多个服务,每个服务之间会有一定的业务交叉。- 监听连接是否支持并发,可以更大程度的提升连接速度。- 接收服务端的请求响应,与A端建立连接。- 服务注册中心 提供所有服务的信息。- 一台服务器的性能 空间都是有限的。- 客户端与服务器之间通信(C-S B-S)- 读取客户端的请求。- 解析客户端的请求。- 处理客户端的请求。

2024-10-20 12:31:02 343

原创 什么是socket?

从概念上来说,Socket 就像是一个通信的端点,类似于一个电话插孔,通过它可以建立连接并进行数据交换。在分布式系统中,不同的节点可以通过 Socket 进行通信,协同工作。它提供了一种在不同计算机之间进行双向通信的方式,可以在不同的进程或不同的计算机之间传输数据。通过定义特定的消息格式和通信规则,可以在不同的应用程序之间进行高效的数据交换。总之,Socket 是实现计算机网络通信的重要工具,它使得不同的计算机和进程能够进行数据交换,为各种网络应用提供了基础。

2024-10-12 22:01:32 389

原创 什么是http?列出常见方法并解他们?

HTTP 方法是客户端(通常是浏览器)用来向服务器表明其意图的方式。

2024-10-12 21:57:00 617

原创 三次握手与四次挥手

这就是A向B发送syn,此时你知道老板能发数据,老板什么都不知道;接着你要告诉老板你能听见,这就是B向A发送syn-ack,此时老板知道你可以收也可以发,但是你只知道老板能发,不知道他能不能收;举个例子:A 和 B 打电话,通话即将结束后,A 说 “我没啥要说的了”,B 回答 “我知道了”,于是 A 向 B 的连接释放了。但是 B 可能还会有要说的话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,于是 B 向 A 的连接释放了,这样整个通话就结束了。A发送ack,B收到。

2024-10-12 21:49:57 515

原创 TCP与UDP

通过序列号、确认号、重传机制等一系列技术,确保数据准确、准时、无错、不丢、不重复。TCP:首部开销大,至少20字节。包含更多控制信息,如序列号、确认号、窗口大小、校验和等,以便实现可靠连接和流量控制。不保证数据能被对方收到,发送的数据可能丢失、重复、乱序,但他传输速度快,实时性强。TCP:由于需要建立连接、维护、确认、重传等操作,传输效率相对低,尤其对于小数据量。UDP:实时性要求高,接受一定的数据丢失和错误,如IPTV、视频会议、广播等。UDP:支持一对一、一对多、多对一、多对多的通信模式,更加灵活。

2024-10-12 21:37:33 449

原创 ==与equals比较

在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当我们创建一个对象(new Object)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,与此同时在栈内存中生成对应的引用,当我们在后续代码中调用的时候用的都是栈内存中的引用。还需注意的一点,基本数据类型是存储在栈内存中。

2024-10-08 13:19:19 484

原创 一个简易Javaweb学生/教务管理系统(适合新手)

<button onclick="doFenshu('${stuTask.getTaskAccount()}',${stuTask.getStudentAccount()},'${stuTask.getIsFinish()}')">点击批改</button>

2024-09-29 23:21:27 1105

原创 类加载机制

• 负责加载 JAVA_HOME\lib 目录下的核心类库,或通过 -Xbootclasspath 参数指定的路径中的类库。• 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。1. 实现了 Java 的动态性:可以在运行时根据需要加载新的类,从而实现动态扩展程序的功能。3. 实现了类的隔离:不同的类加载器可以加载同名的类,这些类在不同的命名空间中,互不干扰。• 确保类文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

2024-09-18 09:53:21 276

原创 JMM内存模型

如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before 线程A执行操作ThreadB.join()并成功返回。定义Java程序中各变量间的访问规则,特别是在多线程环境下,确保线程间对共享变量的读写操作能以一种可预测和一致的方式进行,从而保证程序的稳定性和正确性。如果线程A执行ThreadB.start()启动线程B,那么线程A的ThreadB.start() happens-before 线程B的任何操作。线程对变量的读写操作必须在工作内存中进行。

2024-09-10 09:59:05 390

原创 何为JRE

如果想要运行一个Java程序,就必须在计算机上安装JRE,JVM负责将Java字节码转换为特定操作系统的机器码并执行。而核心类库则包含许多提前写好的功能,如输入输出操作,网络通信,图形界面等,方便开发者在Java编程时直接调用。JRE主要包含Java虚拟机(JVM),Java核心类库和支持文件,其作用是运行计算机运行Java应用程序。总的来说,JRE是Java生态系统中至关重要的组成部分,为Java程序运行提供必要的基础环境。

2024-09-02 15:26:41 310

原创 Java简易聊天工具(网络通信)

System.out.println("转发消息成功..."+user.getUsername()+":"+chatMsg);// if(user.getUsername().equals(username)){//用户名存在。// System.out.println("注册成功并登录");// System.out.println("注册失败");System.out.println("登录成功");

2024-08-21 12:45:36 758

原创 浅谈垃圾回收机制

但过度频繁的垃圾回收可能会影响程序的性能,因此在实际开发中需要合理优化对象的创建和使用,以减少不必要的垃圾回收操作。2、复制算法:将内存分成两块,每次只使用其中一块,当一块内存使用完成后,将仍存活的对象复制到另一块内存,并把使用过的内存清理掉。例如,如果频繁使用该算法,可能导致内存空间被分割成许多不连续的小块,影响后续大对象的分配。4、分代收集算法:根据对象的生命周期将对象分为新生代和老生代,不同的代采用不同的算法。3、标记-压缩算法:在标记完成后,将存活的对象向一端移动,清理端边界以外的对象内存。

2024-08-18 17:35:47 420

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除