自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 面试官问你索引失效场景怎么回答显得比较真实捏?

我会用explan 关键子放在查询语句前面查看执行计划,观察到底哪块出了问题,比如rows,预计尧都区的行数,possible_keys:可能执行到的索引,key:实际用到的索引.这样就可以看到那块索引失效,而且能看出为什么失效.如果面试官继续问你见过哪些失效场景,你在回答什么%放前面啦,函数列上用or了,参与计算了这些即可.

2024-04-19 09:09:43 111 1

原创 mybatis和mybatis-plus的区别

mybatis-plus提供了官方代码生成器,可以根据数据库自行生成实体类 mapper接口 xml文件,我们只需要配置以下相关信息即可.mybatis-plus提供类很多扩展功能,比如通用的curd方法 分页插件 代码生成器减少开发者的重复劳动提高了工作效率.mybatis-plus提供了分页插件,可以方便的实现分页功能,只需要调用分页方法即可。mybatis需要手动编写大部分CURD操作的sql语句,包括插入,更新,删除.mybatis-plus提供了通用的curd操作,无需手动编写sql.

2024-04-18 14:29:25 172

原创 hashcode与equals

因此,equals方法被覆盖后,则hashcode方法也必须被覆盖.两个对象相等,两个对象分别调用equals方法都返回true。如果两个对象相等,则hashcode一定也是相同的.两个对象有相同的hashcode值,他们也不一定相等。

2024-04-18 11:41:38 79

原创 sleep和wait的区别

wait()是Object的一个方法,用于使当前线程进入等待状态,并释放对象的锁,直到被唤醒或者等待时间结束才会继续执行.wait()通常与notify()和notifyAll()方法仪器使用,用于线程间的同步和通信。sleep是一个简单的暂停功能,而wait更加复杂,通常与线程间的锁和条件等待相关联.是一种多线程编程中用于线程同步的方法,通常用于等待某个条件满足或其他线程结束。sleep是一个种暂停程序的执行的方法,通常用于在一段时间之后继续执行.sleep函数通常接受一个参数,表示暂停的时间长度.

2024-04-18 10:31:31 107

原创 最左匹配原则一句话解释

最左匹配原则指的是在正则表达式中,当有多个可能匹配的子模式时,会选择最左边(最先出现)的匹配结果.

2024-04-18 09:41:30 222

原创 最左匹配原则一句话解释

最左匹配原则指的是在正则表达式中,当有多个可能匹配的子模式时,会选择最左边(最先出现)的匹配结果.

2024-04-18 09:40:16 346

原创 线程的状态

新建就绪运行阻塞等待超时等待终止。

2024-04-17 14:50:41 335

原创 如何避免死锁?

根据不同的业务基于不同的锁的粒度,减少获取锁的时间。

2024-04-17 14:36:13 72

原创 B树和B+树的区别

B+树的key只有key,数据在叶子结点上,B+树的叶子结点是相互之间有一个引用链路,元素是按顺序存储的。B树的key和数据是在一起的,B树的叶子结点是没有任何关系的。B+树必须查找叶子节点才能查找到数据,

2024-04-17 14:28:26 67

原创 @Autowired和@Resource的区别

Resource: 默认按名称注入,如果名称找不到,会按类型来注入.@Autowired: 默认按类型注入,如果存在多个类型则按名称注入.

2024-04-17 14:08:41 70

原创 List和Set的区别

List: 有序,按对象进入的顺序来保存的,可重复,允许多个null对象.可以使用Iterator来取出所有元素,Set: 无序,不可重复,最多允许有一个null元素,取元素是只能使用Iterator接口取得所有元素。逐一遍历,也可以使用get(int index)获取指定下标元素,支持随机访问.

2024-04-17 14:00:57 85

原创 常用的设计模式简介

代理模式: 通过引入一个代理对象来对原始对象进行访问,代理对象充当了客户端和目标对象之间的中介,客户端通过代理对象访问目标对象,从而实现了对目标对象的间接访问。工厂模式: 定义一个用于创建对象的接口,但是让子类决定实例化哪个类,是一个类的实例化延伸到子类.抽象工厂模式: 提供一个创建一系列相关或互相依赖对象的接口,而无需指定其具体类。建造者模式: 讲一个复杂对象接口与其表示分离,是的同样的构建过程创建不同的表示。有点,可以隐藏真实对象的实现细节,降低了耦合度。

2024-04-17 11:46:32 102

原创 反射(一句话解释)

在运行时检查类,方法,字段等信息并动态调用它们的机制,是的程序可以在运行时获取和操作类的信息,从而实现灵活性和动态性。

2024-04-17 11:30:35 84

原创 静态代理和动态代理的区别

静态代理需要为每一个被代理类创建一个代理类,如果系统中有多个类需要代理,就会创建大量代理类,造成代码冗余.动态代理利用的是java反射机制,在运行时动态的代理类和对象,无需针对每个被代理类编写单独的代理类.动态代理可以更灵活的对多个类进行代理,减少了重复的代理类的创建,提高了代码的复用性和灵活性.在编译时就以确定好代理类和被代理类的关系,代理类是在编译期间就确定好的.指程序运行时动态省的代理类,而不是编译时就确定好的.CGLIB JDK动态代理.

2024-04-17 11:26:17 204

原创 多态(简述)

2.父类的引用指向子类对象 (比如你参数定义的是Animal类,传进来的参数可以多种多样,但必须是Animal的子类)它允许不同对象对同一消息做出不同的响应。父类当形参,子类当实参。重写就是一种多态的体现。多态是面向对象的核心。

2024-04-17 11:12:07 57

原创 接口和抽象类的区别

虽然抽象类的功能远高于接口,但是定义抽象类得代价较高,每个类智能集成一个抽象类,在这个类中,你必须继承或编写出所有子类的所有共性.虽然接口的功能较少,但是它只针对一个动作进行描述,在设计的难度上会小很多,设计成本较低,也可以把业务解耦。当我们发现这个类既可以继承抽象类又可以实现接口时,我们更倾向使用接口,因为这样子类的灵活,便于后期的修改和维护.当你关注一个事务本质的时候,可以用抽象类,当你关注一个操作的时候,可以用接口.一个类只能继承一个一个抽象类,一个类可以实现多个接口。接口和抽象类都不能被实例化。

2024-04-17 10:37:51 140

原创 栈和堆的区别

堆的大小一般受限于操作系统和硬件的限制,一般比栈大得多.(有钱了买台好电脑ヾ(◍°∇°◍)ノ゙)栈的操作速度比较快,因为栈的内存分配和释放都是在固定地址完成的,没有复杂的内存管理。堆的操作相对较慢,因为堆的内存分配和释放需要进行复杂的内存管理,如内存分配算法。栈的大小是有限的,当栈空间不足时会发生栈溢出(Stack Owerflow)栈的内存分配是连续的,以固定大小(几mb)分配给每个线程。堆是一种动态的数据结构,用于存储程序运行时动态分配的内存。堆的内存分布是不连续的, 可以动态的分配和释放内存空间。

2024-04-17 10:05:28 165

原创 值传递和引用传递的区别

指将参数的引用(内存地址)传递给函数或方法,在函数内部对参数的修改会影响到原始参数。指将参数的值复制一份传递给函数或方法,在函数内部对参数的修改不会影响到原始参数.值传递一般传递基本数据类型(整数,浮点,布尔值)和不可变对象(字符串)引用传递一般传递可变对象(字典,列表)

2024-04-17 09:53:54 62

原创 重载和重写的区别

指子类覆盖父类的方法逻辑,子类的重写方法必须与父类的被重写方法具有相同的方法名,参数列表返回类型,并且重写方法不能使用比被重写方法更严格的访问权限.重载可以修改返回类型和返回权限,但不能只修改其中一个,因为调用方不知道具体调用的哪个方法.只要能区分开方法.则构成重载.指在一个类中定义相同的名字,但参数不同的多个方法,调用时会根据不同的参数来选择对应的方法.重写: 英文override overwrite。重写发生在子类和父类之间,重写不能修改方法参数.重载发生在同一个类之间,重写必须要修改方法参数。

2024-04-17 09:08:03 130

原创 final(关键字)

注意: 如果修饰的是引用类型,则代表该引用只有一次指向对象的机会,即不能更改变量所指向的对象,但是对象的成员属性是可以修改的.当我们需要使用一些固定不变的数据时,就会将其设置为静态常量,以方便复用.这种静态常量我们就可以用final来修饰.用于修饰变量,则该变量的值被赋值后无法修改,无论是成员变量,静态变量还是局部变量都是如此.final是java的一个关键字,用于修饰.用在不同的地方有不同的效果。用于修饰方法,则该方法不能被子类重写。用于修饰类,表示这个类不能被继承。

2024-04-17 08:55:34 87

原创 continue break return的区别

return作用于方法用来结束方法体,return可以单独被调用用于没有返回值的方法,也可以携带一个值,用于有返回值的方法.将return用于循环内,也可以结束循环,但是要注意用return结束循环,循环体后面的语句也不会被执行。continue只会结束当前循环,然后执行下一次循环。break是跳出整个循环,继续执行循环体后面的语句。我们如果想提前结束循环就会用到这几个关键字。

2024-04-17 08:40:54 96

原创 简单说一下HashMap

hashmap的阈值为0.75,当数组容量使用了75%需要扩容,默认长度是16,也就是元素达到12时就会扩容.1.hashmap里的数据是没有顺序的。2.hashmap的键和值可以是空的。3.hashmap不是线程安全的。HashMap的底层实现。1.8数组+链表+红黑树。4.key是不可重复的。HashMap的特点。

2024-04-16 20:18:33 60

原创 JavaScript的数据类型

Symbol: ES6引入的新类型 表示独一无二的值,主要用于对象属性的标识符;undefined(未定义),String(字符串),boolean(布尔),Number(数字),Object(对象);

2024-04-15 15:35:56 81

原创 常用注解讲解:接口中的@RequestMapping的用处

当你在写接口时,需要写一些特定的处理器方法来响应特定的HTTP请求,@RequestMapping方法可以将一个处理器方法映射到特定的请求URL上.并指定该方法应处理的HTTP请求类型(GET.POST等)@RequestMapping用于将getUser方法映射到"/user/info"URL上,并制定该方法处理GET请求,因此,当客户端发送一个 GET 请求到 "我这里讲的接口值的是controller层,用来接收参数的类。URL 时,Spring MVC 将调用。方法来处理该请求,并返回用户信息。

2024-04-12 09:53:04 134

原创 MyBatis

MyBatis是一个java数据持久层框架,通过将sql语句与java对象的映射配置在xml文件中,实现了简化数据库操作的功能,使得开发者更方便的对数据库进行操作.当执行相同查询时,mybatis会将查询结果缓存到内存中,下次查询时,会直接上缓存中获取数据,而不会去数据库中执行查询操作。mybatis本地缓存是默认开启的,指在同一个sqlSession中,对相同的查询进行缓存。${}是字符串替换的方式在sql语句中,{}会直接替换成参数的值,不会进行预编译处理。${}和#{}都是用来传参的。

2024-04-11 13:06:00 245

原创 springMVC

浏览器的请求会先经过核心控制器dispatchServlet,主要是吧请求分发到对应的controller里,controller里面处理完业务逻辑之后会返回一个modulandview,然后dispatchServlet回去寻找一个或多个viewResolver的视图解析器找到modulandview指定的视图并且把数据展示给客户端.目的是为了简化servlet+jsp模式下的web开发方式,其次springMVC是对java web里面的MVC框架模式做了一些增强和扩展。

2024-04-11 11:13:23 237

原创 Stream流

List<String> list = Arrays.asList("hello,lambda","陈兰","nihao");// .filter(str -> str.length() >= 5) //数据处理。Stream流的原理和lambda表达式差不多,本质上都是语法糖.// list.stream() //获取数据源。

2024-04-11 11:02:03 380

原创 run()和start()的区别

调用start()时,回信创建一个线程,并在新线程中调用对应线程对象的run()来执行任务。run() 是java.lang.Runnable接口中定义的方法,用于执行线程逻辑。总结,run()只会执行当前线程中的任务,而start()回信创建一个线程来执行任务。start()是java.lang.Thread继承类中定义的方法,用于启动线程。直接调用run方法会在当前线程中执行,不会创建新的线程。这两个方法都与线程有关,但是用法和功能不同。

2024-04-10 09:25:57 96 1

原创 面向对象和面向过程

面向过程编程: 打开洗衣机->放衣服->放洗衣粉->按启动->清洗->甩干。人: 打开洗衣机 放衣服 放洗衣粉 按启动按钮。总结: 面向过程更注重于效率,方便理解,清晰。面向对象编程: 将人和洗衣机分开来看。面向对象更注重复用性,扩展 维护。洗衣机: 清洗 甩干。封装 继承 多态。

2024-04-10 08:42:40 88 1

原创 面向对象和面向过程

面向过程编程: 打开洗衣机->放衣服->放洗衣粉->按启动->清洗->甩干。人: 打开洗衣机 放衣服 放洗衣粉 按启动按钮。总结: 面向过程更注重于效率,方便理解,清晰。面向对象编程: 将人和洗衣机分开来看。面向对象更注重复用性,扩展 维护。洗衣机: 清洗 甩干。

2024-04-10 08:41:49 91 1

原创 aop底层原理

通知定义了在切点处执行的代码,常见的通知类型包括前置通知、后置通知、环绕通知、异常通知和最终通知。aop面向切面编程, 将横切关注点从核心业务逻辑中分离出来,使得代码更加模块化,可维护和可重用.切点定义了在何处应用通知的条件,通常是通过表达式或注解来制定特定的方法或代码段.CGLB: 基于继承的代理,通过继承类重写其方法完成动态代理。JDK: 基于接口的代理,通过反射机制动态生成代理类和对象。

2024-04-09 17:13:41 149

原创 微服务架构的优缺点

缺点: 加大了运维的难度 在事务执行过程中会频繁的调用其他服务可能会引发安全问题,在单体架构中可以用spring注解@Transactional即可完成。可能在队规模促销中交易功能需要进行扩容,如果是单体架构的情况下,扩容是针对于整个网站,而微服务可以在单独的服务商加机器提高利用率.微服务可以避免这点,保证核心功能的高可用性,把侧重点放到核心业务上,其余服务挂了,影响也不大确保核心服务能正常使用即可。微服务的好处: 如果传统的单体项目出现了小bug例如OOM内存溢出,导致`整个程序无法使用.这样影响很大.

2024-04-02 16:31:32 351 2

原创 路由器拦截器

路由就是nignx提供的可以动态跳转页面的一种方案,在以前没有nginx时,我们使用tomcat服务器来进行页面的跳转的,毕竟他也是可以提供静态页面.拦截器顾名思义,就是在方法的前后进行操作的这么一个东西,就和tomcat中的过滤器和MVC中的拦截器一样.而vue路由拦截器主要是查看用户是否是登录状态(看是否携带token)来进行相应的页面跳转。可以存储在cookie里,域名就是key,举个例子:能在百度里但不能在网易里。可以存储在session里,缺点页面关闭就没有了。

2024-04-02 16:29:22 242 1

原创 线程池(个人理解)

然后再了解一下池化技术: 他是一个思想,比如我们在平时用对象时,需要进行频繁地创建和销毁,非常麻烦而池化技术就是先创建好几个常用的对象放到池子里,我们要用时,直接从池子里拿现成的就ok了,拿来就用,节省了频繁创建和销毁的开销,提高了复用性,也增强了性能。当一个任务来时,看核心线程是否已满,如果满了,就会进入阻塞队列,阻塞队列也满了,就会临时创建一个线程来执行任务,临时线程过段时间没有任务处理后就会自动销毁,如果临时线程也满了,就会执行拒绝策略来对多余的线程进行处理。// 创建自定义线程类的实例。

2024-03-28 11:54:16 341

原创 sql优化方案

尽量少的使用join 阿里开发手册规定最多使用join三次 但是在实际的业务场景中,需要用到join的地方会很多,有的时候仅仅三次是远远不足以支撑业务的.所以很多时候是不会按照规定来的,再比如三大范式.规矩是死的人是活的。索引优化: 意思就是sql语句尽量使用到索引,因为索引可以加快查询效率 但同时索引的数量不能太多,因为索引也是占内存的,内存太多也会影响性能。尽量使用union all 它会查询出两个表所有的数据,而union会去掉两表之间重复的内容,这就要意义进行比较,增加了磁盘的负担。

2024-03-28 11:24:56 138

原创 如何将多个bean注入到controller里

我们知道要注入bean的话需要用到。

2024-03-27 16:44:16 182

原创 maven

他可以多以来进行管理,在以前程序员进行开发时下载依赖需要自己上网上去找,自己下下来手动导入到我们的开发环境中.而有了maven之后,我们会在本地生成一个仓库,当我们需要依赖时可以直接从远程仓库上拉取到本地上进行下载,开发者可以在pom文件中声明自己所需要的依赖的类型版本,maven会自动下载,这极大的节省了我们在开发时在依赖上所耗费的时间.另外,maven还定义了一套完整的生命周期(如编译,测试,打包,部署),开发人员还可以在此基础上进行扩展.Maven用于管理java项目的构建,依赖和部署。

2024-03-27 16:39:04 103

原创 AOP(切面)

他是把一套通用的业务给他组合到一起,统一的在某个方法前后执行,这样我们就避免了很多重复的代码减少了代码冗余,利于后期项目上线的维护.它在实现了它原本功能的基础上,还不会干预正常的业务代码,做到了解耦.around: 环绕通知,在方法执行前后都可以正常的执行自定义操作。他是一个设计思想,是为了满足我们在开发过程中解耦和开闭原则.在方法执行后执行的返回通知,方法正常返回时触发。在方法执行后执行的异常通知,方法抛出异常时触发。before:在执行方法前通知。after:在执行方法后通知。

2024-03-27 16:30:50 203

原创 java中的异常体系

运行时异常一般是在程序运行之后发生的异常,可能是方法调用之类的错误,这类异常我们可以人为的进行抛出和捕获.还有一种业务异常,一般这种异常使我们在开发项目的时候自定义的异常.为什么要自定义这种业务异常呢?而error一般是比较严重的错误,比如内存不足,栈溢出.这类错误一般不是开发者导致的,而是虚拟机自己出现的,需要终止程序并恢复。检查时异常顾名思义,是编译器在编译的时候发生的异常,一般是语法错误导致机器无法识别,这类异常实在程序开始之前就发出的.异常的顶级父类: Throwable。

2024-03-27 16:21:49 148

原创 什么是上下文? 什么又是上下文切换呢?

大家在计算机领域可能经常会看到一个名词"上下文",那什么是上下文呢?上下文我理解为是一个思想.我们先想一下在语文中什么是是如何理解上下文的? 是不是上一个段落和下一个段落?我总结为: 上下文是一个贯穿全过程的一个概念,是能控制住一个整体.就比如spring中的ioc容器,是一个整体,每个节点我都能控制.那什么是上下文切换呢?经过上文的描述,我们就不难理解上下文切换就是由一个整体切换到另一个整体的过程就比如线程的切换,从一个线程切换到另一到另一个线程就可以叫上下文切换.但这种切换就必然会出现成本的损耗我从吃饭

2023-12-22 12:54:40 361

空空如也

空空如也

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

TA关注的人

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