
Java
文章平均质量分 54
Java
dingwen_blog
这个作者很懒,什么都没留下…
展开
-
来自菜鸡Java工程师的日积月累
目前Treasure是个微服务架构的纯后端项目,前端部分后期进行;同时Treasure是一个来自菜鸡Java工程师本着对技术的积累与个人的成长的开源项目。学习成长过程中一些技术点整合一些常见业务的解决方案面试中一些业务场景模拟及解决方案工作中积累的一些心得合理应用设计模式进行一些业务代码的重构优化一些更优雅的编码实现常用小轮子的积累技术点备忘。原创 2022-12-11 12:31:45 · 469 阅读 · 0 评论 -
Spring5学习笔记
文章目录Spring5学习笔记1. 简介1.1 介绍1.2 发展历程1.3 理念1.4 优点1.4 组成1.4.1 Spring Core1.4.2 Spring Context1.4.3 Spring AOP1.4.4 Spring DAO1.4.5 Spring ORM1.4.6 Spring Web1.4.7 Spring Web MVC1.5 扩展2. 控制反转2.1 原型2.1.1 `UserDao`2.1.2 `UserDaoMysqlImpl`2.1.3 `UserDaoOracleImpl`原创 2021-10-07 17:43:36 · 2348 阅读 · 1 评论 -
ThreadLocal
文章目录ThreadLocal1. 简介2. 常用方法3. 基本使用3.1 未使用案例3.2 使用ThreadLocal3.3 synchronized同步方式3.4 ThreadLocal与synchronized的区别4. 内部结构4.1 设计说明4.2 设计优势5. 核心方法源码分析5.1 set()5.2 get ()5.3 remove()5.4 *initialValue()*6.内存泄露分析6.1 **强引用**6.2 **弱引用**6.3 ThreadLocalMap中的key使用强引用分析原创 2021-10-02 14:32:47 · 555 阅读 · 0 评论 -
规则执行器的设计实现
文章目录规则执行器的设计实现1.使用场景2.规则`dto`3.规则的抽象接口4.规则执行器5.使用规则执行器的设计实现[!NOTE]此规则执行器的设计旨在替代大量的if、else if、else嵌套,对代码进行优化。其他规则以及实体,使用案例中使用的规则类参考完整代码。地址:https://gitee.com/dingwen-gitee/java8-study.git1.使用场景if (条件一){ }if (条件二){ }if (条件三){ }...原创 2021-09-11 12:09:28 · 785 阅读 · 0 评论 -
多线程基础
文章目录多线程基础1. 基本概念2. 创建线程2.1 继承自`Thread`,重写`run()`方法2.2 实现`Runnable`接口,重写`run()`2.3 实现`Callable`接口,重写`call()`3.案例3.1 多线程3.1.1 继承Thread实现3.1.2 实现Runable接口实现3.2 多线程同步下载网络图片3.3 买票3.4 龟兔赛跑4.线程状态5.常用方法6.线程停止7.线程休眠8.线程礼让9.线程插队10.线程状态11.线程优先级([1,10])12.守护线程13.线程同步原创 2021-09-08 22:09:58 · 969 阅读 · 1 评论 -
@Deprecared
@Deprecared若某类或某方法加上该注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用。package demo;/** * annotation deprecated 演示 * * @author dingwen * @date 2021/09/01 */@Deprecatedpublic class AnnotationDeprecatedDemo { public static void原创 2021-09-01 22:50:52 · 150 阅读 · 0 评论 -
使用静态代码块实现赋值静态成员变量
文章目录对于集合类型的静态成员变量,应该使用静态代码块赋值,而不是使用集合实现来赋值。//赋值静态成员变量反例private static Map<String, Integer> map = new HashMap<String, Integer>(){ { map.put("Leo",1); map.put("Family-loving",2); map.put("Cold on the out side pass原创 2021-08-30 21:34:49 · 1059 阅读 · 0 评论 -
类加载器-Java
文章目录1.加载过程2.类的加载3.连接3.1 验证3.2 准备3.3解析4.初始化5.类加载器5.1 分类5.2 根类加载器(Bootrap)5.2 扩展类加载器(Extension)5.3 系统类加载器(System)5.4 总结6.双亲委派6.1 实用双亲委派的好处7.ClassLoader7.1 `loadClass(String name, boolean resolve)`7.2 `findClass(String name)`7.3 `defineClass(String name, byte原创 2021-08-29 16:50:36 · 269 阅读 · 0 评论 -
避免使用BigDecimal(double)
文章目录BigDecimal(double) 存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。// BigDecimal 反例 BigDecimal bigDecimal = new BigDecimal(0.11D);// BigDecimal 正例 BigDecimal bigDecimal1 = bigDecimal.valueOf(0.11D);...原创 2021-08-27 22:07:33 · 409 阅读 · 0 评论 -
内存泄露 & 内存溢出
文章目录内存泄露内存溢出内存泄露memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。内存溢出out of memory,指程序申请内存时,没有足够的内存供申请者使用,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。...原创 2021-08-30 21:34:25 · 82 阅读 · 0 评论 -
返回空数组和集合而非 null
文章目录若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁。//返回null 反例 public static Result[] getResults() { return null; } public static List<Result> getResultList() { retu原创 2021-08-27 22:07:12 · 1088 阅读 · 0 评论 -
使用静态代码块实现赋值静态成员变量
文章目录对于集合类型的静态成员变量,应该使用静态代码块赋值,而不是使用集合实现来赋值。//赋值静态成员变量反例private static Map<String, Integer> map = new HashMap<String, Integer>(){ { map.put("Leo",1); map.put("Family-loving",2); map.put("Cold on the out side pass原创 2021-08-27 22:05:52 · 1106 阅读 · 0 评论 -
字符串转化使用String.valueOf(value) 代替 “ “ + value
文章目录把其它对象或类型转化为字符串时,使用String.valueOf(value) 比 “”+value 的效率更高。//把其它对象或类型转化为字符串反例:int num = 520;// "" + valueString strLove = "" + num;//把其它对象或类型转化为字符串正例:int num = 520;// String.valueOf() 效率更高String strLove = String.valueOf(num);...原创 2021-08-27 22:05:24 · 366 阅读 · 0 评论 -
Java String为什么被设计为final的
文章目录String被设计为不可变是因为String对象是缓存在字符串池中的,因此这些缓存的字符串是可以被多个客户端访问的,如果一个客户端的访问影响了别的客户端的行为,这样就存在风险。例如一个客户端把"test"改为"TEST",其他所有的客户端都会跟着受影响。之所以把String进行了缓存处理,是出于性能的考虑。因此这个风险只能通过把String设置为不可变来避免。同时,String类被声明为final的。是防止其他人通过继承String类,覆盖父类的方法,会破坏String的不可变性、缓存性以及原创 2021-08-27 22:04:46 · 267 阅读 · 0 评论 -
Java 中map 遍历优化
文章目录package demo.map;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.stream.Collectors;/** * <p> * Map 遍历优化 * </P> * * @author dingwen * @date 2021.08.27 09:18 */public class MapDemo { pu原创 2021-08-27 22:04:16 · 375 阅读 · 0 评论 -
Java 集合判空优化
文章目录//反例LinkedList<Object> collection = new LinkedList<>();if (collection.size() == 0){ System.out.println("collection is empty.");}// 正例LinkedList<Object> collection = new LinkedList<>();if (collection.isEmpty()){原创 2021-08-27 22:03:48 · 219 阅读 · 0 评论 -
@RequestBody参数Map传参注意事项
文章目录@requestBody参数Map传参注意事项后端接收`dto`@requestBody参数Map传参注意事项后端接收dto@Datapublic class TestDto{ private String id; private Map<String,String> map;}注意: 当前端传递的参数类型Map是类似ES6中new Map()再set值这种最终的传参数据结构会发生改变,最终导致后端@requestBody 参数Map类型无法接收到参数。正确的做原创 2021-08-23 22:25:29 · 3846 阅读 · 0 评论 -
Java嵌套if else优化
文章目录1. 传统实现2.策略模式+工厂模式+单例模式优化2.1 策略接口2.2 不同策略实现类2.2.1 处理策略一2.2.2 处理策略二2.2.3 处理策略三2.2.4 处理策略四3.策略工厂4.使用5.参考资料多分支复杂条件嵌套判断会让逻辑变得更加复杂,后期难以维护。优化传统的if else 写法,使得业务逻辑更加清晰,后期也便于维护。1. 传统实现package demo.replace.ifelse;/** * 优化过多 if else 原始业务版本 * * @author d原创 2021-08-15 16:56:02 · 982 阅读 · 0 评论 -
Spring配置文件中的“ classpath:“与“ classpath*:“的区别
classpath:只会到你的class路径中查找找文件有多个classpath路径,并同时加载多个classpath路径的情况下,只会从第一个classpath中加载classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找有多个classpath路径,并同时加载多个classpath路径的情况下,会从所有的classpath中加载用classpath*:需要遍历所有的classpath,所以加载速度是很慢的;因此,在规划的时候,应该尽可能规划好资源文.转载 2021-05-17 11:25:53 · 192 阅读 · 0 评论 -
SpringBoot 配置文件时间格式转化
文章目录一、属性二、配置三、重写配置对应的实体属性`set`方法一、属性 /** * 时间 */ private Date ;二、配置 date: 2020-1-17 11:45:00三、重写配置对应的实体属性set方法如果使用lombok自动生成相关方法直接写需要修改属性的方法即可。有写的方法会覆盖lombok生成的 public void setDate(String date) { SimpleDateFormat form原创 2021-05-29 13:37:50 · 363 阅读 · 0 评论 -
SpringBoot 项目找不到 javax.servlet.Filter 的问题
问题描述:新创建一个 SpringBoot 项目,编译时出现了找不到 javax.servlet.Filter 的异常。原因分析:这个类位于 tomcat-embed 这个 jar 下面,这里的解决方法并不是像网上大部分所说的手动添加这个 jar,因为这是由于没有添加spring-boot-starter-web依赖造成的。springboot 项目默认会添加spring-boot-starter和spring-boot-starter-test两个依赖,而 web 项目需要spring-bo转载 2021-05-17 11:40:45 · 1603 阅读 · 0 评论 -
SpringBoot2.X中lagback详细配置及使用
文章目录一、前言二、自定义日志配置1.约束2.自定义三、详细配置四、使用1. 类方式2.注解方式五、Mybatis log 插件1.地址2.安装3.使用一、前言Spring Boot默认集成了Logback,可以开箱即用,非常方便。因为spring-boot-starter-logging是Logback的日志实现,而Spring Boot启动项spring-boot-starter又依赖了spring-boot-starter-logging,所以Spring Boot就默认集成了Logback.原创 2021-05-07 13:43:47 · 556 阅读 · 0 评论 -
SpringBoot整合knif4j Api文档
文章目录前言一、maven 依赖二、配置三、遇到问题1.ignoredParameterTypes2.访问 doc.html 404前言knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。一、maven 依赖 <!--接口文档--> <dependency> <groupId>com.github.xiaoymin</groupId> <原创 2021-05-02 21:46:16 · 543 阅读 · 3 评论 -
搭建自用单点OOS服务
文章目录前言一、安装MinIo二、自定义`starter`2.1 `starter`命名规范2.2 创建`maven`工程2.1.1 项目目录结构2.1.2 依赖2.3 编写配置文件2.2.1 启动配置文件映射实体2.2.1 配置类2.4 编写 spring.factories2.5 完成业务逻辑工程2.6 自定义`banner`2.6.1 生成2.6.2 配置2.7 打包部署到本地仓库2.8 完整代码地址三、开发`service`3.1 创建`SpringBoot`项目3.1.1 项目结构概览3.1.2原创 2021-05-29 16:55:49 · 551 阅读 · 4 评论 -
SpringBoot2.x文件上传出错 maximum permitted size of 1048576 bytes
问题描述:在搭建minio服务时,文件上传出错。Caused by: java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field multipartFile exceeds its maximum permitted size of 1048576 bytes.原因分析:Spring Boot工程嵌入的tomcat限原创 2021-05-29 13:26:44 · 637 阅读 · 0 评论 -
SpringSecurity 学习笔记
文章目录一、基本概念1.认证2.会话3.授权3.1 授权方式二、与`Shiro`对比1.`Shiro`2.`Spring Security`三、`Spring Security`原理1.重点理解过滤器2.`UserDetailsService`2.`PasswordEncoder`四、`SpringSecurity Web` 权限方案1. 设置登录系统的账号、密码1.1 方式一:通过配置文件修改1.2 方式二: 通过配置类自定义内存用户2.实现数据库认证来完成用户登录2.1 整合`Mybatis-plus`原创 2021-06-01 13:52:29 · 1011 阅读 · 3 评论 -
doc.jar生成与查看
文章目录`maven`插件配置使用maven插件配置 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId>原创 2021-07-07 23:12:27 · 362 阅读 · 0 评论 -
@JsonSerialize
文章目录使用自定义序列化类实体标注注解此注解用于属性或者getter方法上,用于在序列化时嵌入开发者自定义的代码。比如将一个Date类型的变量转换成Long类型,或是序列化一个double时在其后面限制两位小数点。使用自定义序列化类import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jac翻译 2021-07-07 23:12:16 · 111 阅读 · 0 评论 -
单表CRUD后端代码生成实现
文章目录前言1. 版本环境说明2. 简介3. 功能4. 项目结构预览5. 使用5.1 准备5.1.1 数据库环境: 此处一Mysql为例,准备了两张数据表作为测试。5.1.2 安装查询生成代码5.1.3 配置数据库连接5.1.4 准备jar5.1.5 新建测试项目5.1.5 依赖5.1.6 基础配置5.1.7 生成代码5.1.8 在实体中添加校验规则方便测试5.1.9 在`mapper`中添加注解5.1.10 添加`Mybatis-plus`配置6.开始测试6.1 启动项目访问6.2 查询所有测试6.3 分原创 2021-07-02 18:26:26 · 539 阅读 · 2 评论 -
算法—查找三数相加为零的三元组
package algorithm;import java.util.ArrayList;import java.util.Arrays;import java.util.List;/** * 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组 * <p> * 注意:答案中不可以包含重复的三元组。 * 例如, 给定数组 nums = [-1, 0, 1, 2, -1,原创 2021-06-18 10:58:39 · 282 阅读 · 0 评论 -
Java跳出多层循环
在Java中可以使用标签跳出多层循环。标签应放在迭代语句之前,并且标签和迭代语句之间不可以再写其他代码break + 标签,代表跳转到标签的位置,并且不再进入循环package demo;/** * 跳出多层循环 * * @author dingwen * 2021.06.10 09:23 */public class LoopsBreakDemo { public static void main(String[] args) { end: .原创 2021-06-10 09:35:33 · 1078 阅读 · 0 评论 -
LocalDateTime JDK1.8
文章目录一、使用新时间日期API的必要性二、新时间日期API常用、重要对象介绍三、新时间日期 API 详解与示例3.1 获取当前时间3.2 指定时间、日期创建对象3.3 日期、时间的加减3.4将年、月、日等修改为指定的值,并返回新的日期(时间)对象3.5获取日期的年月日周时分秒3.6时间日期前后的比较与判断3.7 判断是否是闰年3.8 java8 时钟 : clock()3.9 日期3.10计算时间(`Duration`)、日期间隔(`Period`)3.11时间日期的格式化(格式化后返回的类型是 Stri原创 2021-06-09 16:23:32 · 557 阅读 · 0 评论 -
使用Objects.equals替代str.equals
package demo;import java.util.Objects;/** * //todo * * @author dingwen * 2021.06.09 14:33 */public class ObjectEq { public static void main(String[] args) { String str1 = new String("ding"); String str2 = "ding"; Strin原创 2021-06-09 14:44:07 · 282 阅读 · 0 评论 -
在finally代码块里面return带来的问题
项目场景:package demo;/** * //todo * * @author dingwen * 2021.06.09 14:10 */public class Test { public static void main(String[] args) { System.out.println("test1() = " + test1()); } private static int test1() { int a = 0;原创 2021-06-09 14:25:58 · 475 阅读 · 0 评论 -
Mybatis-plus笔记
原文地址 mp.weixin.qq.comhttps://gitee.com/dingwen-gitee/stu-myb-pluhttps://blog.youkuaiyun.com/vcj1009784814/article/details/115159687转载 2021-06-08 18:08:48 · 83 阅读 · 0 评论 -
Servlet
早期的Web服务器只能提供静态资源的访问,为了弥补这一缺陷,产生了一些动态web技术。Servlet就是由Sun开发基于Http协议的动态Web技术。Sun公司提供了Servlet接口,实现该接口就能得到一个Servlet类。Servlet是Java编写的运行在Web容器的服务端程序,用于交互式的浏览和修改数据。...原创 2021-06-08 10:41:37 · 84 阅读 · 0 评论 -
lambda -> if else
文章目录尝试自己实现`if else``OptionalConsumer`定义使用多分支采用`function`替换尝试使用lambda表达式替代多分支语句,优化代码。补充一点,在JDK1.9中有类似的实现。如Optional中的ifPresentOrElse()方法。相当于if (val != null){ // 执行操作}else {// 执行操作}尝试自己实现if elseOptionalConsumer定义package demo;import java.util.Ob原创 2021-06-04 17:56:27 · 944 阅读 · 0 评论 -
理解HashMap底层数据结构
文章目录`hash`常用解决哈希冲突方法链地址法开放地址法`array`链表红黑树`HashMap`参考文章在JDK8中HashMap是基于数组+链表+红黑树的实现。hashhash哈希,也称为散列。基本原理是把任意长度的输入通过一定的映射规则转换为固定长度的输出。映射规则就是对应的哈希算法。由于输出空间值小于输入空间值,根据“抽屉原理”一定会存在不同的输入转换为相同的输出的情况。作为一个好的哈希算法需要做到让这种冲突发生的几率尽可能小。常用解决哈希冲突方法链地址法链表地址法是使用一原创 2021-06-02 11:34:59 · 113 阅读 · 0 评论 -
Java监听器实现原理
文章目录监听器模型案例实现`DeveloperListener``Developer``Event``DeveloperListenerImpl`测试监听器就是监听事件源是否发生了某一个事件,当发生指定监听的事件时事件源会向已注册的监听器发送消息对象。监听器可以获得事件对象进行相关操作。监听器模型事件源: 发生事件的对象消息:触发监听的某一个事件监听器:监听发生的某个事件进行业务处理案例实现在开发者进行开发和学习之前进行监听处理业务逻辑。DeveloperListenerpa原创 2021-05-30 15:19:32 · 889 阅读 · 0 评论 -
File to InputStram
InputStream in = new FileInputStream(new File("test.txt"));原创 2021-05-29 13:30:16 · 237 阅读 · 0 评论