
Java
Java
叕叕666
这个作者很懒,什么都没留下…
展开
-
maven包scope为provided导致SpringBoot项目启动报错java.lang.ClassNotFoundException: javax.servlet.ServletContext
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext原创 2024-08-11 14:55:31 · 404 阅读 · 0 评论 -
配置多数据源后,MyBatis-Plus的Page类的total值为0问题或分页配置失效问题解决
MyBatis-Plus的Page类的total值为0问题或分页配置失效问题解决原创 2023-05-12 11:15:43 · 1013 阅读 · 1 评论 -
SpringBoot 配置多数据源后事务@Transactional不生效的问题解决
配置多数据源后事务@Transactional不生效原创 2023-05-10 13:54:58 · 1211 阅读 · 0 评论 -
使用多数据源后,在配置文件中的mybatis-plus全局配置失效了
使用多数据源后,在配置文件中的mybatis-plus全局配置失效了原创 2023-05-08 15:24:00 · 1819 阅读 · 0 评论 -
多数据源使用mybatis-plus报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
【代码】多数据源使用mybatis-plus报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)原创 2023-05-04 11:52:34 · 700 阅读 · 1 评论 -
BigDecimal 的基本使用
运算方法(加减乘除),除法舍入模式,比较大小,小数末尾去0,返回数值字符串原创 2023-02-07 10:31:01 · 344 阅读 · 0 评论 -
java.lang.IllegalArgumentException: Request header is too large
url的参数太长了,超过了tomcat的默认值原创 2022-04-22 17:02:49 · 1166 阅读 · 0 评论 -
JVM的垃圾回收ParNew和CMS的介绍
- 第一个阶段:Initial Mark(初始标记阶段),CMS会找到"根"上的对象进行标记,不会标记非"根"的对象,此阶段会有STW,标记线程和业务线程不会并发执行 - 第二个阶段:Concurrent Mark(并发标记阶段),业务线程一边工作产生垃圾,回收线程一边标记垃圾,由于标记垃圾是GC最耗时的过程,所以CMS让回收线程个业务线程并发执行,业务线程虽然会慢一点但还是一直在执行的 - 第三个阶段:Remark(重新标记阶段),在第二阶段可能业务线程会产生新的垃圾,此阶段会把这些垃圾重新标记一下原创 2022-04-22 14:36:24 · 837 阅读 · 0 评论 -
JVM的垃圾回收Serial、Serial Old、Parallel Scavenge、Parallel Old的介绍和STW(Stop The World)
> Serial工作在年轻代,使用标记-复制的回收算法,它是单线程的垃圾回收器> Serial Old工作在老年代,使用标记-整理的回收算法,它也是单线程的垃圾回收器> Parallel Scavenge简称PS,使用标记-复制的回收算法,它是多线程的垃圾回收器 > Parallel Old简称PO,使用标记-整理的回收算法,它也是多线程的垃圾回收器原创 2022-04-21 14:10:17 · 1810 阅读 · 1 评论 -
三色标记算法实现原理
三色标记算法是什么三色标记就是把对象在逻辑上分成三种颜色:黑色,它自己是不是垃圾已经被标记完了,而且成员变量或牵扯到它引用的一些对象也已经标记完了;灰色,本身标记完了,但是还没有标记到它引用的那些对象,引用的那些对象还是白色没有标记到的;白色,还没被标记到的对象。假如有一个对象A,它所引用的对象B和C都已经标记完了,那它自己也标记完了黑色;B和C各自还有一个引用指向白色对象没标记到,那这个B和C自己遍历到孩子还没有遍历到就是灰色,D和E就是白色那个没有遍历到的节点三色标记算法的漏标问题原来灰原创 2022-04-20 14:03:46 · 468 阅读 · 0 评论 -
java对象的内存布局以及使用ClassLayout查看布局
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.16</version></dependency>对象的内存布局分为两种,普通对象和数组对象普通对象普通对象有四部分组成对象头(MarkWord)、ClassPointer指针、实例数据、Padding对齐对象原创 2022-04-15 12:05:20 · 2956 阅读 · 2 评论 -
CPU的缓存行(Cache Line)是什么
存储器的层次结构存储器的层次如下:其中,L1、L2在CPU内部,L3在主板上,越往上CPU到达的时间越短,CPU内部的数据是独立的,CPU外部的数据是所有CPU共享的。CPU的数据不一致问题产生原因假如主存里有x、y两个数据,它们会先被加载到L3缓存里,让在加载到L1、L2缓存,但是L1、L2是在CPU内部的,那就有可能CPU1把x加载到缓存修改成1,CPU2把x加载到缓存修改成2,产生CPU之间的数据不一致问题,也就是CPU1修改数据CPU2不知道。解决方案方案一:总线锁。由于L2是通过使原创 2022-04-12 13:43:24 · 2865 阅读 · 0 评论 -
Java类加载的过程
类的生命周期一个类从从被加载到JVM内存开始,到卸载出内存为止,它的整个生命周期会经历七个阶段,其中验证、准备、解析统称为连接。加载、验证、准备、初始化、卸载这五个阶段的顺序是固定的,解析阶段在某些情况下会在初始化阶段之后进行。在《java虚拟机规范》中严格规定了有且只有六种情况必须立即对类进行加载、验证、准备、初始化(下文所说的初始化阶段是这四个阶段的简称):遇到new、getstatic、putstatic或invokestatic 这四条字节码指令时,如果类型没有进行过初始化,则需要原创 2022-04-08 14:10:07 · 491 阅读 · 0 评论 -
java中的类加载器(Class Loader)和双亲委派
类加载器(Class Loader)什么是类加载器java中可以通过一个类的的全限定名来获取描述该类的二进制字节流,这个动作是由代码来实现的,这些代码就是类加载器(Class Loader)类加载器的层级:Bootstrap Class Loader - 启动类加载器此加载器负责加载JAVA_HOME/lib目录下的类库文件或者是被JVM参数-Xbootclasspath所指定路径下的类库文件,并且这些文件需要JVM可以识别,否则即使放到JAVA_HOME/lib目录下也不会被加载测试代码p原创 2022-04-07 13:51:54 · 459 阅读 · 0 评论 -
java中CAS的实现原理
什么是CASCAS全称compare and swap 或 compare and set 或 compare and exchange,也就是比较并交换。比较并交换是什么意思呢?java中有一些类是以Atomic开头的,例:AtomicInteger;这些类就是通过CAS的方式来保证线程安全的。new AtomicInteger().incrementAndGet()public final int incrementAndGet() { return U.getAndAddInt(t原创 2022-03-31 14:54:55 · 699 阅读 · 0 评论 -
java 中volatile的作用及其实现原理和JVM的内存屏障
堆虽然是所有线程共享的,但是每个线程还有只属于自己的空间,当一个线程去堆中取值时会复制一份到自己的空间,对这个这个值进行修改会先在自己的空间里修改然后再写到堆中,但是其他线程是不知道你修改了,这就是线程之间的不可见。加了volatile之后就能够保证一个线程修改另一个线程马上就能看到。原创 2022-03-28 13:26:37 · 972 阅读 · 0 评论 -
java 中的synchronized及其锁升级的理解
当对num进行++操作,多个线程同时访问时,第一个线程将num读出来,假设读到的是0,然后把它+1,但在这个还没有写回去的时候,第二个线程来了读到它还是0,也对其+1,之后写回去,发现两个线程都是读到的0,写回去的是1,本来应该加两次变成2,结果却是1,这就出现了少加的现象原创 2022-03-26 15:03:08 · 584 阅读 · 0 评论 -
java线程的状态
1:当newThread()后这个线程就处于New(新建状态),调用start()这个线程就会被放到CPU的等待队列里等待CPU的运行,此时则为Ready(就绪状态)2:当CPU开始执行这个线程,这个线程变成Running(运行状态)3:当这个线程执行完了,这个线程变成Teminated(结束状态)4:在Running(运行状态)时,调用Thread.yield()方法,会让出CPU转变成Ready(就绪状态)5-1:在Running(运行状态)时,调用Thread.sleep(time)、ob..原创 2022-03-26 13:14:39 · 566 阅读 · 0 评论 -
java 创建线程的方式?停止线程的方式?
======创建线程的方式======继承Thead类,重写run()方法实现Runnable类,重写run()方法使用lombda实现Callable类,重写call()方法使用线程池======停止线程的方式======使用stop()方法使用suspend()和resume()方法配合volatile使用interrupt()方法什么都不做,让线程自然结束原创 2022-03-23 15:19:20 · 2809 阅读 · 0 评论 -
Java Thread类中interrupt()、interrupted()、isInterrupted()方法
interrupt()、interrupted()、isInterrupted()原创 2022-03-18 14:19:38 · 585 阅读 · 0 评论 -
Redis 做分布式锁和红锁的原理以及Redisson的基本使用
Redis锁红锁Redisson原创 2022-03-14 14:56:05 · 5546 阅读 · 0 评论 -
Java 包装类(Integer等)的详细介绍
什么是包装类八种基本数据类型与包装类的对应关系基本数据类型与其对应包装类的区别给包装类赋值的方式装箱与拆箱包装类的缓存问题原创 2022-03-08 14:26:22 · 579 阅读 · 0 评论 -
Java 中类的构造方法、代码块、静态代码块执行顺序问题
父类的静态代码块==>子类的静态代码块==>父类普通代码块==>父类构造方法==>子类普通代码块==>子类构造原创 2022-03-07 13:33:59 · 369 阅读 · 0 评论 -
java 使用 POI 操作Excel实现导入导出功能
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version></dependency>原创 2022-03-04 09:45:49 · 634 阅读 · 0 评论 -
JWT 的实现原理和基本代码实现
JWT是什么JWT是一种基于JSON的令牌安全验证(在某些特定的场合可以替代Session或者Cookie),一次生成随处校验JWT的组成JWT分为三部分:头部信息(header),消息体playload,签名( signature)原创 2022-03-02 10:31:45 · 645 阅读 · 0 评论 -
SpringBoot 项目文件定义下载功能时 HttpServletResponse.setHeader 设置文件名,下载后文件中的汉字变成下划线(_)的问题解决
解决前的代码String fileName = stringBuilder.toString();System.out.println("文件名:" + fileName);try { response.reset(); response.setContentType("application/x-zip-compressed;charset=UTF-8"); // 修改前 response.setHeader("Content-Disposition", "attac原创 2022-02-25 16:07:09 · 1661 阅读 · 0 评论 -
SpringBoot 集成 SpringSecurity 验证码验证登录
<!-- 验证码生成的库 --><dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version></dependency>原创 2022-02-23 14:48:13 · 818 阅读 · 0 评论 -
SpringBoot 集成 SpringSecurity 配置访问权限
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>原创 2022-02-23 13:36:03 · 693 阅读 · 0 评论 -
SpringBoot 集成 SpringSecurity 的基本使用
主要依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>原创 2022-02-22 14:12:50 · 311 阅读 · 0 评论 -
SpringBoot 整合 Dubbo
主要依赖<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.5</version></dependency>原创 2022-02-14 14:24:10 · 198 阅读 · 0 评论 -
dubbo 的基本使用
主要依赖<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>3.0.5</version> <type>pom</type></dependency>原创 2022-02-14 14:19:11 · 740 阅读 · 0 评论 -
java 使用 curator 的 API 操作 zookeeper
依赖<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.2.0</version></dependency>原创 2022-02-10 15:37:16 · 760 阅读 · 0 评论 -
java 使用 zookeeper 的 API 操作 zookeeper
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.3</version></dependency>原创 2022-02-10 15:32:38 · 1330 阅读 · 0 评论 -
有苦有乐的算法 --- 图的宽度优先遍历
题目给定一个图,使用队列对其进行宽度优先遍历代码public static void bfs(Node start) { if (start == null) { return; } Queue<Node> queue = new LinkedList<>(); HashSet<Node> set = new HashSet<>(); queue.add(start); set.add(start); while (!queue.isE原创 2021-12-09 15:08:41 · 165 阅读 · 0 评论 -
有苦有乐的算法 --- 图的深度优先遍历
题目给定一个图,使用栈对其进行深度优先遍历代码public static void dfs(Node node) { if (node == null) { return; } Stack<Node> stack = new Stack<>(); HashSet<Node> set = new HashSet<>(); stack.add(node); set.add(node); System.out.println(node.val原创 2021-12-09 15:06:34 · 199 阅读 · 0 评论 -
SpringBoot 集成Redis 对需要自增操作(increment)的key设置过期时间
SpringBoot 集成Redis 对需要自增操作(increment)的key设置过期时间原创 2021-11-29 17:31:19 · 8893 阅读 · 0 评论 -
有苦有乐的算法 --- 判断一颗二叉树是否是完全二叉树、是否是平衡二叉树、是否是搜索二叉树
是否是完全二叉树完全二叉树:二叉树的每一层要么是满的,要么从左到右处在变满的路上。public static boolean isCBT(Node head) { if (head == null) { return true; } return process(head).isCBT;}public static class Info { public boolean isFull; public boolean isCBT; public int height; public原创 2021-11-18 15:40:14 · 252 阅读 · 0 评论 -
有苦有乐的算法 --- 获取二叉树的最大宽度
题目一颗二叉树,求其最大宽度。例:解析按层遍历二叉树;在遍历时,使用用4个变量来记录信息;Node curEnd = null; // 当前层,最右节点是谁Node nextEnd = null; // 下一层,最右节点是谁int max = 0; // 暂时最大宽度int curLevelNodes = 0; // 当前层的节点数头结点入队,curEnd = 头结点;nextEnd = 头结点的右节点;头结点出队,curLevelNodes ++,此时 出队节点==curEnd,原创 2021-11-17 17:05:59 · 423 阅读 · 0 评论 -
有苦有乐的算法 --- 二叉树的按层遍历
题目给定一个二叉树,进行按层遍历。例:解析给定一颗二叉树:首先准备一个队列,让头节点入队;节点出队并打印,同时此节点的左节点2入队,右节点3在入队;2出队,2的左节点4入队,2的右节点5在入队;3出队,3的右节点6在入队;最后以此出队,得到结果。代码public static class Node { public int value; public Node left; public Node right; public Node(int v) { value原创 2021-11-17 14:49:04 · 210 阅读 · 0 评论 -
有苦有乐的算法 --- 用栈和递归的方式实现二叉树的前序遍历、中序遍历、后序遍历
前序遍历递归方式:public static void pre(Node head) { if (head == null) { return; } System.out.println(head.value); pre(head.left); pre(head.right);}栈的方式:public static void pre(Node head) { System.out.print("pre-order: "); if (head != null) { Stack原创 2021-11-17 14:17:57 · 283 阅读 · 0 评论