- 博客(36)
- 收藏
- 关注
原创 SpringMVC执行流程
流程:所有请求先到达前端控制器,前端控制器到处理器映射器中查询对应的控制器方法并返回给返回,前端在请求处理器适配器执行控制器方法(期间涉及方法参数处理、返回值处理),执行完后返回ModelAndView,前端拿着ModelAndView请求视图解析器解析逻辑视图ModelAndView转化为物理视图对象View,最后渲染视图。流程:与上面流程类似,不同于执行完控制器handle方法后执行返回JOSN数据给前端即可。
2025-02-11 11:17:16
227
原创 Mybatis中#{}和${}的区别
2、Mybatis在处理#{}时,会将sql中的#{}替换为?,调用PreparedStatement来赋值。3、处理${}时,会把${}替换成变量的值,调用Statement来赋值。1、#{}是预编译处理,是占位符;${}是拼接处理,是拼接符。4、使用#{}可以防止Sql注入。
2025-01-25 10:38:07
92
原创 Mybatis的一级缓存和二级缓存
1、一级缓存:基于PrepetualCache的HashMap本地缓存,其存储作用域是。2、二级缓存:基于PrepetualCache的HashMap本地缓存,其存储作用域是。,当session进行flush和close时,的所有cache都将清空,默认的是一级缓存。操作时,(一级和二级)cache将被清空。时,一级缓存才会转移到二级缓存中。(2)二级缓存的数据需要实现。session回话关闭。
2025-01-25 10:25:30
161
原创 Spring Bean的生命周期
4、处理Aware接口,执行Bean实现的Aware(BeanNameAware、BeanFactoryAware、BeanApplicationContextAware)接口重写的方法。6、执行初始化方法(InitializingBean、自定义的init方法)。5、执行Bean的后置处理器BeanPostProcessor的前置方法。7、执行Bean的后置处理器BeanPostProcessor的后置方法。2、调用构造方法创建Bean实例。3、Bean的依赖注入。8、Bean的销毁。
2024-11-27 15:33:20
440
原创 JAVA线程状态
2、RUNNABLE:可运行状态,线程正在JVM中执行,等待操作系统的调度。5、TIMED_WTING:超时等待状态,在WTING基础上增加超时时间。1、NEW:初始状态,线程被创建,但还调用start方法。4、WTING:等待状态,线程正在等待其他线程通知或中断。3、BLOCKED:阻塞状态,线程正在等待获得监视器锁。6、TERMINATED:终止状态,线程已经执行完毕。JAVA线程在运行的生命周期有以下6种状态。
2024-11-25 15:53:19
333
原创 JDK、JRE、JVM的区别
JDK是JAVA开发工具包。里面包含了JAVA编译器javac、JAVA打包工具jar、JAVA运行环境JRE、文档生产工具Javadoc以及许多开发工具等。JVM是Java运行环境的核心,它负责Java的运行。JVM是JRE的一部分,位于程序员的最前沿,将字节码转化为机器代码。JRE是Java运行环境。JRE包括JVM以及Java类库。JRE是运行环境,它让编写好的Java程序可以被运行。JDK是最大的,它包含JRE,JRE又包含JVM。JDK是开发工具,它让程序员编写Java程序。
2024-11-23 20:15:30
797
原创 数据库:幂等方案
若userId为主键的话,该操作只能执行一次,保证幂等。若userId不是主键的话,该操作可以被执行多次。3、分布式锁:可以使用redis分布式锁,key为controller请求的信息和入参。每次请求先查询redis是否存在该key,若不存在则为第一次请求;4、去重表:把唯一主键插入去重表,再进行业务操作。这样就保证重复请求时,因为去重表有唯一约束,导致请求失败。1、唯一索引:利用数据库唯一索引约束,解决插入操作幂等情况。2、乐观锁:添加version字段,每次修改前先查询先查询出version。
2024-11-23 10:16:51
261
原创 Mysql存储引擎:MyISAM和InnoDB的区别
Mysql有许多存储引擎,包括:InnoDB、MERGE、MEMORY、BDB、EXAMPLE、FEDERATED、CSV、BLACKHOLE。MyISAM占优势的项是支持全文索引,但Mysql5.6之后,InnoDB也支持全文索引了。
2024-11-23 09:49:10
414
原创 Mysql的事务隔离机制及其脏读、不可重复读、幻读
插入与事务A修改的那些行之前的数据,然后先于事务A提交,当事务A提交后进行查询操作时,还能查到修改的数据。使得A产生一种修改不成功的幻觉。MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的。(2)幻读:假设事务A对某些行执行修改操作,但事务A修改后还未提交,此时事务B。(2)不可重复读:是指在同一事务,同一个sql查询操作的结果不同。(1)脏读:是指读到其他事务未提交的数据。Mysql的四种隔离机制。
2024-11-22 21:25:58
451
原创 Mysql锁机制
(2)间隙锁:锁定索引间隙记录(不包含改记录),左开右开区间,确保索引间隙记录不变,防止其他事务在该间隙insert,避免产生幻读(前后读的数据集不同),在RR隔离级别下支持。意向共享锁(IS):与表锁共享锁兼容(read),与表锁排他锁互斥。(1)行锁:锁定的是某行记录,防止其他事务对其进行update或delete操作,在RC、RR隔离级别下都支持。(2)写锁:又称排他锁,当前客户端操作没有完成,会阻塞其他客户端的读写操作。(1)读锁,又称贡献锁,多个读操作可以同时进行,但不能进行写操作。
2024-11-22 20:59:02
768
原创 JAVA访问修饰符
访问级别从小到大:private -> default -> protected -> public。protected:可以在同一个包下访问,还可以被其他包的子类访问。public:可以被同一包下或不同包下访问。private: 只能在同一个类内部访问。default:只能在同一个包下访问。
2024-11-20 09:41:57
204
原创 重载与重写的区别
重载:重载是发生在同一个类中不同方法之间的,同名方法如果有不同的参数列表(参数类型、参数个数、参数顺序)则可视为重载,重载对返回类型没有要求,可相同可不同。重写:重写是发生在子父类之间,重写是子类将父类中已有的方法重写一遍(方法名、返回类型、参数列表都相同,方法体不同)。
2024-11-20 09:32:41
116
原创 Redis的过期策略
2、定时删除:可以通过maxmemory限制redis的内存使用量,在内存满时,redis会对内存中的键值对进行删除,会优先删除过期时间最短的键值对。3、惰性删除:在使用某键值对时,redis会先检查改键值对是否超过过期时间,若超过过期时间则直接删除。1、过期时间:在设置键值对的同时设置一个过期时间,在改过期时间后redis会自动删除该键值对。
2024-11-19 16:54:07
370
原创 TCP和UDP的区别
1、连接方式:TCP是面向连接的协议,每次通讯传输都需要先建立连接,传输后需要释放连接;UDP是无连接协议,通讯传输不需要建立连接。2、可靠性:TCP是可靠的,当数据丢失或损坏时,TCP会自动重传数据,保证数据的完整性。UDP是不可靠的,不保证数据的完整性。4、应用场景:TCP一般用于文件传输、邮件传输等可靠性要求较高的传输场景;UDP则用于音频、视频等实时性较高的场景。3、传输速度:UDP传输速度比TCP快,因为不需要建立连接和重传丢失和损坏的数据。
2024-11-19 16:45:58
727
原创 JVM调优--常用配置
7、-XX:SurvivorRatio=n设置年轻代中Eden区和两个Survivor区的比值。6、-XX:NewRatio=n设置年轻代和老年代比值。9、-XX:MaxMetaspaceSize=n最大元空间大小。5、-Xmn<size>设置年轻代初始大小和最大大小。8、-XX:MetaspaceSize=n元空间大小。4、-XX:NewSize=n设置年轻代大小。1、-Xms<size> 初始堆大小。2、-Xmx<size>最大堆大小。3、-Xss<size>线程栈大小。
2024-11-13 16:52:36
188
原创 JVM--JDK默认垃圾回收器
有以下几种垃圾回收器: UseSerialGC UseParallelGC UseConcMarkSweepGC UseParNewGC UseParallelOldGC、UseG1GC。
2024-11-13 16:32:19
401
原创 JVM:Java垃圾回收原理和触发时机
触发时机:在大多数情况下,当新生代的Eden区没有足够空间时,会触发Young GC。只是提醒JVM进行Full GC,进不进行看JVM。Major GC回收的是新生代和老年代。Young GC回收的是新生代区域。(2)程序执行System.gc()(1)老年代用达到一定的阈值。
2024-10-30 20:54:48
433
原创 JVM:垃圾回收算法
将从所有被称为“GC Roots”的对象出发,从这些节点向下搜索,搜索走过的路径称为引用链。当某个对象到“GC Roots”没有引用链相连时,表明该对象需要被回收,JVM使用的就是该垃圾标记算法。给对象添加一个引用计数器,每当有一个地方引用它时,引用计数器就+1,当引用失效时,引用计数器就-1,当引用计数器为0时表示对象需要被回收。缺点:无法解决循环引用问题,Python使用的就是引用计数算法,当Python提供了一种创建弱引用但不增加引用计数器的方法。
2024-10-30 20:19:31
305
原创 JVM:双亲委派模型
启动类加载器负责将存放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。拓展类加载器负责加载<JAVA_HOME>\lib\ext目前中的,或者被java.ext.dirs系统变量所指定的路径的所有类库,开发者可直接使用此加载器。1、工作原理:如果一个类加载器收到类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成。应用程序类加载器也称系统类加载器。2、类加载器加载的类。
2024-10-12 22:20:41
232
原创 JVM原理:类加载过程
1)验证:检查载入的class文件的正确性。验证的内容涵盖类数据信息的格式检验、语义检查、字节码验证以及符号引用验证等。2)准备:给类变量(静态变量)分配内存并赋默认值(null, false, 0等)。2)被动使用:除主动使用的情况外,其他情况均为被动使用,被动使用不会引起类的初始化。当该类不在被触及,即不再被引用时,该类结束其生命周期,也就会被卸载。3)解析:将类、方法、字段、接口的符号引用转化为直接引用。将硬盘上java的二进制文件转化为内存中的class对象。JAVA程序对类的使用分为主动和被动。
2024-10-11 10:23:14
386
原创 JAVA:HashMap保证线程安全的方法
特点(1)适用于高并发场景。(2)key是有序的。(3)基于跳表结构(Skip List)实现,查询、插入、删除的时间复杂度都是O(logn)。(3)key和value都不能为null。ConcurrentSkipListMap是在JDK1.6中新增的,为了对高并发场景下的有序Map提供更好的支持。
2024-10-07 21:12:26
238
原创 hash冲突的解决办法
当关键字key的哈希地址p=H(key)发生冲突,以p为基础,产生另一个哈希地址p1,若p1仍然冲突,再以p1基础,计算出p2,以此类推,则到pi不冲突。提供多个哈希函数,如果第一个哈希函数计算出来key的哈希值冲突了,则使用第二个哈希函数计算key的哈希值。即 Hi = (H(key) + di) % m (i = 1, 2, 3 ... n)将哈希表分为基本表和溢出表,凡是和基本表发生冲突的元素,一律填入溢出表。1)适用总数经常变化的情况(因为链表中各结点是动态申请的)。优点:不易产生聚集。
2024-10-07 20:44:42
432
原创 JAVA:HashMap的原理
扩容机制:初始数组长度为16,若链表长度大于8且数组长度小于64则进行扩容;若链表长度大于8且数组长度大于等于64时链表则会转化为红黑树;若红黑树节点个数小于等于6,则退化成链表。HashMap本质就是数组,将key的hash值对数组长度取模作为数组下标,将value作为数组值,如果key重复,则将其对应值放入链表中。
2024-10-05 22:12:20
212
原创 JAVA:HashMap、TreeMap、LinkedHashMap的异同
4)HashMap和LinkedHashMap均允许key和value为null值(只允许存在一个null值的key,若多个则覆盖),TreeMap不允许key为null。3)底层结构:HashMap(数组+链表+红黑树),TreeMap(红黑树),LinkedHashMap(HashMap+双向链表)。2)HashMap和LinkedHashMap不支持key排序,但TreeMap支持key排序,也可自定义排序。1)都属于Map,都是key-value结构存储,因此key不允许重复。
2024-10-04 20:53:51
419
原创 JAVA:集合扩容机制
1、ArrayList和Vector2、HashSet、HashMap和HashTable3、LinkedList、LinkedHashSet、LinkedHashMap不存在扩容。
2024-10-04 20:16:24
596
原创 JAVA:ArrayList保证线程安全的方法
原理:写入的时候是重开一个数组将原数组复制到新数组,写入后将引用指向新数组。示例:List list = Collections.synchronizedList(new ArrayList());示例:CopyOnWriteArrayList list = new CopyOnWriteArrayList();示例:ArrayList list = new vector();原理:方法都加上了synchronized修饰。原理:使用了synchronized关键字。
2024-10-04 19:55:22
248
原创 JAVA引用类型:强引用、软引用、弱引用、虚引用
虚引用:无法通过虚引用获取一个对象的真实引用,必须配合ReferenceQueue一起使用。当GC回收一个对象时,如果发现它有虚引用,就会在回收之前将虚引用加入队列中。软引用:只有在内存空间不足时才会回收被引用的对象,当内存空间不足时,触发GC,如果GC后内存还是不足,JVM会把软引用包裹的对象干掉。从jdk1.2开始,对象引用就被划分为4中类型:强引用、软引用、弱引用、虚引用。只要某对象被强引用,即使内存空间不足JVM也不会回收改对象。弱引用:不管内存是否充足,只要发生GC,弱引用就被回收。
2024-10-02 12:51:03
211
原创 JAVA基础--每日一题:JDK8新特性
接口允许Default和static;lambda表达式;strean流操作;时间API(LocalDateTime)CompletableFuture。
2024-09-27 20:39:21
143
原创 JAVA基础--每日一题:JAVA-IO-字节流和字符流的区别
字节流 字符流 操作基本单元 字节 字符 是否使用缓冲 否 是,频繁IO操作一个资源,则会将该资源暂时存于内存中。 存在位置 可存于文件和内存中 内存 使用场景 适合操作文本文件之外的文件。如:图片、音频等 适合操作文本文件 相关类 InputStream、OutputStream Reader、Writer
2024-09-27 20:36:45
141
原创 JAVA基础--每日一题:Error、Exception与RuntimeException的区别
RuntimeException处与不处理都可,而对其他Exception而言,JVM要求程序员必须捕获(try..catch..)或声明抛出(throws)。Exception又分为:RuntimeException(受检查Exception)和其他Exception(非受检查Exception)。1)Error:JVM内部严重问题,比如:资源不足等,无法恢复。2)Exception:JVM通过处理还可以回到正常执行流程。处理方法:程序员不用处理。
2024-09-27 20:30:19
145
2
原创 JAVA基础--每日一题:static的用法
static不能修饰普通类,但可以修饰内部类,避免我们使用内部类而不使用外部类导致内存浪费,甚至内存溢出。可直接通过对象名.方法名调用改方法,减少了频繁new对象产生的时间和空间上的浪费。对象就不再拥有改属性,属性归类管理,即多个对象只拥有一个属性。改代码块在类的加载时候就会被执行。
2024-09-26 20:26:09
99
原创 JAVA基础--每日一题:创建String对象的个数
(3)因为常量池已经有"abc"了,所以不再在常量池创建,所以只需再通过new对象在堆区创建一个String对象存储"abc"。(2)"abc"已经在常量池中,故只需再创建"def"和"abcabcdef"存放常量池中,s2指向"abcabcde。(2)通过new对象在堆区中创建一个String对象存储"abc"。(1)创建了"abc"存放于常量池中,s1指向"abc";例:String s = "abc" + "def";(1)在常量池中创建"abc"和"def"。下列语句一共创建多少个对象?
2024-09-26 20:15:14
254
原创 JAVA基础----每日一题:==和equals有什么区别?
1、如果equals未被重写,其实调用的是父类Object的equals方法,其内部依然用==比较。==:若为基本数据类型,==比较的是值是否相同;若为引用类型,==比较的是引用地址是否相同。2、若重写equals方法,则按重写的equals方法进行比较。equals:比较的是对象的内容是否相同。
2024-09-26 19:50:51
112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人