自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ConcurrentHashMap原理,idk7和idk8版本的区别

Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。锁:Segment分段锁 Segment继承了ReentrantLock,锁定操作的Segment,其他的Segment不受影响,并发度为segment个数,可以通过构造函数指定,数组扩容不会影响其他的segment。锁:锁链表的head节点,不影响其他元素的读写,锁粒度更细,效率更高,扩容时,阻塞所有的读写操作、并发扩容。

2024-05-23 16:21:26 467

原创 Java面试基础

封装的主要目的是实现信息隐藏和安全性,通过将数据隐藏在类的内部,可以防止外部直接访问和修改对象的内部状态。总的来说,内连接返回两个表中交集的行,而左连接返回左表中的所有行,以及右表中满足条件的行,如果没有匹配的行,则为 NULL 值。即使是不同的子类对象,如果它们继承自同一个父类并且重写了相同的方法,那么可以根据实际对象的类型来调用相应的方法,从而实现不同行为的表现。抽象类的存在主要是为了定义一个通用的模板或者接口,子类通过继承抽象类,并实现其中的抽象方法,来提供具体的功能实现。关键字来修饰该方法。

2024-05-09 21:14:58 474

原创 Java面试基础

解释一 下Java中的HashMap和HashTable 的区别。总的来说,HashMap 在大多数情况下比 HashTable 更常用,因为它在性能上更优秀,并且允许键值对为 null。但在多线程环境下,如果需要线程安全的操作,可以选择使用 HashTable 或 ConcurrentHashMap。在Java中,反射机制指的是在运行时动态地获取类的信息以及操作类的属性、方法和构造函数的能力。

2024-05-09 19:48:23 827

原创 Java面试基础

什么是Java 中的多态性?在Java中,多态性(Polymorphism)是指同一个方法名字但是有不同的行为。它允许我们使用一个统一的接口来处理不同类型的对象,从而提高了代码的灵活性和可重用性。多态性在Java中主要通过两种方式实现:编译时多态性(静态多态性):也称为方法重载(Overloading)。在编译时,编译器会根据方法名和参数列表的不同来决定调用哪个方法。运行时多态性(动态多态性):也称为方法重写(Overriding)。在运行时,Java虚拟机(JVM)会根据对象的实际类型来确定调用哪个方法。

2024-05-09 19:37:39 1188

原创 Vue基础

在 Vue.js 中实现路由跳转通常使用 Vue Router,它是 Vue.js 的官方路由管理器。总的来说,computed 适用于简单的数据变化计算,而 watch 则适用于需要在数据变化时执行一些异步或复杂操作的场景。是 Vue.js 中的一个内置组件,用于缓存动态组件的状态,以便在组件切换时保留其状态,避免重新渲染和销毁。:在你的项目中创建一个路由配置文件,通常命名为。的方法很简单,只需要将需要缓存的组件放置在。如何在Vue.js中实现路由跳转?在 Vue.js 中,在 Vue.js 中,

2024-05-01 16:27:21 541

原创 Vue基础

具体来说,当你将一个普通的 JavaScript 对象传给 Vue 实例作为 data 选项时,Vue 将遍历此对象的所有属性,并使用 Object.defineProperty() 将它们转为 getter/setter。Vue.js 中的响应式原理是其核心特性之一,它使得数据的变化能够自动地反映到视图上,而不需要手动更新 DOM。,Vue 会检测到数据的变化,然后通知相关的组件进行重新渲染。用于双向数据绑定,将表单控件元素的值与Vue实例的数据属性进行双向绑定。当你修改 Vue 实例的数据时,例如。

2024-05-01 16:17:44 265

原创 MyBatis执行流程和延迟加载的原理

3.把order查询上来,然后调用user.setOrderList(List<Order>orderist),接着完成user.getOrderlist()方法的调用。2.当调用目标方法user.qetOrderlist0时,进入拦截器invoke方法,发现user.getOrderlist0是nul值,执行sql查询order列表。2.当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询3.获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了。

2024-05-01 13:40:10 6

原创 Springboot自动配置原理

2,其中@EnableAutoConfiguration是实现自动化配置的核心注解。内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。3,条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。

2024-05-01 13:36:36 5

原创 SpringMVC的执行流程

③ HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。③ HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet.② DispatcherServlet收到请求调用HandlerMapping(处理器映射器)② DispatcherServlet收到请求调用HandlerMapping(处理器映射器)⑥方法上添加了@ResponseBody。

2024-05-01 13:30:08 7

原创 Spring中的循环引用

循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖。原因:由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依。③ 三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的。① 一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象。构造方法出现了循环依赖怎么解决?

2024-05-01 13:22:48 7

原创 Sping事务

其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉。

2024-05-01 13:14:36 7

原创 Spring框架中的bean

因为一般在spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决。当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。面试官:Spring框架中的单例bean是线程安全的吗?Spring框架中的单例bean是线程安全的吗?不是线程安全的,是这样的。

2024-05-01 13:05:28 64

原创 MySQL分库分表

1,前提,项目业务数据逐渐增多,或业务发展比较迅速单表的数据量达1000W或20G以后。1,水平分库,将一个库的数据拆分到多个库中,解决海量数据存储和高并发的问题。按id也就是范围路由,节点1(1-100万)节点2(100万-200万)3.I0瓶颈(磁盘10、网络I0)、CPU瓶颈(聚合查询、连接数太多)1.根据自己简历上的项目,想一个数据量较大业务(请求数多或业务累积大)3,垂直分库,根据业务进行拆分,高并发下提高磁盘I0和网络连接数。2,水平分表,解决单表存储和性能的问题。

2024-05-01 12:53:49 9

原创 MySQL主从同步原理

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据査询(SELECT、SHOW)语句。2.从库读取主库的二进制日志文件 Binlog,写入到从库的中继日志 Relay Log。从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log。MySQL主从复制的核心就是二进制日志,二进制日志记录了所有的 DDL语句和 DML语句。2.从库读取主库的二进制日志文件 Binlog,写入到从库的中继日志 Relay Log。

2024-05-01 12:44:13 6

原创 MVCC解释

readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判新该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。RC隔离级别下,在事务中每一次执行快照读时生成ReadView。

2024-05-01 12:14:25 394 1

原创 MySQL事务

所以,我们一般使用的都是mysql默认的隔离级别:可重复读。我举个例子:A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要么都成功,要么都失败在转账的过程中,数据要一致,A扣除了500,B必须增加500在转账的过程中,隔离性体现在A像B转账,不能受其他事务于扰在转账的过程中,持久性体现在事务提交后,要把数据持久化(可以说是落盘操作)事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

2024-05-01 12:05:15 623 1

原创 SQL优化

候选人:嗯,这个也有很多,比如SELECT语句务必指明字段名称,不要直接使用select*,还有就是要注意SOL语句避免造成索引失效的写法;候选人:这个我们主要参考的阿里出的那个开发手册《嵩山版》,就比如,在定义字段的时候需要结合字段的内容来选择合适的类型,如果是数值的话,像tinyint、int、bigint这些类型,要根据实际情况选择。如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响 可以采用读写分离的架构。读写分离解决的是,数据库的写入,影响了查询的效率。

2024-05-01 11:47:16 552

原创 MySQL索引

候选人:MVSQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索引,选择B+树的主要的原因是:第一阶数更多,路径更短,第二个磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据,第三是B+树便于扫库和区间查询,叶子节点是一个双向链表。候选人:嗯,索引在项目中还是比较常见的,它是帮助MVSQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的10成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。

2024-05-01 11:37:00 969

原创 MySQL如何定位慢查询

2、如果,项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,一般项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。type 这条sql的连接的类型,性能由好到差为NULL、system、const、eg_ref、ref、range、index、all。eq _ref:主键索引查询或唯一索引查询。

2024-05-01 11:05:11 248 1

原创 HashMap

线程一先将A移入新的链表,再将B插入到链头,由于另外一个线程的原因,B的next指向了A,所以B->A->B,形成循环,当然,JDK8将扩容算法做了调整,不再将元素加入链表头(而是保持与扩容前一样的顺序),尾插法,就避免了idk7中死循环的问题。扩容 resize()时,红黑树拆分成的树的结点数小于等于临界值6个,则退化成链表。如果是链表,则需要遍历链表,可能需要拆分链表,判断(e.hash & oldCap)是否为0,该元素的位置要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上。

2024-04-30 23:55:28 880 1

原创 ArrayList和LinkedList的区别是什么?

ArrayList按照下标査询的时间复杂度O(1)【内存是连续的,根据寻址公式】,LinkedList不支持下标查询查找(未知索引): ArrayList需要遍历,链表也需要链表,时间复杂度都是O(n)其他都需要遍历链表,时间复杂度是O(n)查询操作时查询头尾结点的时间复杂度是O(1)、平均的查询时间复杂度是O(n)、给定节点找前驱节点的时间复杂度为O(1)增删操作时头尾结点增删的时间复杂度为O(1)其他部分结点增删的时间复杂度是 O(n)给定节点增删的时间复杂度为O(1)

2024-04-30 23:26:30 130 1

原创 Java集合

Arrays.asList转换list之后,如果修改了数组的内容,list会受影响因为它的底层使用的Arrays类中的一个内部类ArrayList来构造的集合,在这个集合的构造器中,把我们传入的这个集合进行了包装而已,最终指向的都是同一个内存地址。list用了toArray转数组后,如果修改了list内容,数组不会影响,当调用了toArray以后,在底层是它是进行了数组的拷贝,跟原来的元素就没啥关系了,所以即使list修改了以后,数组也不受影响。因为如果从中间插入或者删除元素,后面的元素都会进行移动。

2024-04-30 23:02:32 509

原创 SpringBoot项目和传统Tomcat项目有什么区别

总的来说,Spring Boot 通过简化配置、提供依赖管理、自动装配等功能,使得项目开发更加快速和便捷。传统的 Tomcat 项目则需要更多手动配置和管理,相对而言更为繁琐。

2024-04-30 22:27:49 107

原创 Vue的生命周期

Vue的生命周期就是vue实例从创建到销毁的全过程,也就是new Vue() 开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom -> 渲染、更新 -> 渲染、卸载 等⼀系列过程,称这是Vue的⽣命周期。Vue有8个钩子函数,实际上就创建、挂载,更新、销毁时提供的函数。1、beforeCreate( 创建前 )7、beforeDestroy(销毁前)3、beforeMount( 挂载前)5、beforeUpdate(更新前)

2024-04-30 22:18:34 84

原创 MyBatis中的resultMap与resultType 是什么?如何使用?

ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo(普通Java对象)中必须有和它相同的字段对应,而resultType中的内容就是pojo在本项目中的位置。ResultType适用于简单的查询,当查询结果较少且结构简单时比较方便,当返回POJO类的时候由于需要完全和数据库字段进行对应,存在不灵活、问题排查难等问题。1、resultType介绍。

2024-04-30 22:08:27 83 1

原创 MyBatis 中的 #{}和 ${} 的区别是什么?

2、Mybatis 在处理#(}时,会将 sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。3、Mybatis 在处理${}时,就是把${}替换成变量的值。4、使用#{}可以有效的防止 SQL注入,提高系统安全性。1、#{}是预编译处理,${}是字符串替换。

2024-04-30 21:40:27 28

原创 MyBatis 中的一级缓存和二级缓存有什么区别?

一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session进行增删改之后,该Session中的所有Cache(缓存)就将清空,默认打开一级缓存。1,对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。3,只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中。Mybatis的一级、二级缓存的区别?

2024-04-30 21:30:54 76

空空如也

空空如也

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

TA关注的人

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