
java
文章平均质量分 59
Coder-文小白
95后Java后端程序员,新晋菜鸟奶爸,开始尝试探索副业的小白。微信公众号:Coder-文小白
展开
-
Java中LinkedBlockingDeque类中drainTo方法的运用与实现原理
最近在项目开发中,有使用到类做数据存储。是Java并发编程中一种常见的阻塞队列,它是线程安全的,采用链表的方式实现,具有先进先出的特性,它几乎可以无限扩展,并且可以阻塞读取和阻塞写入。在项目中,某一个工具类中,采用了来进行数据存储,需要在使用的时候进行队列进行是否存在数据,否则进行遍历操作,同时操作完成以后,需要及时重置队列,此时类中的drainTo方法,刚好可以满足需求。drainTo方法,主要作用是将队列中的集合元素转移到指定的集合中,下面介绍一下常见的使用方式。可以看到drainTo。原创 2024-07-23 07:30:00 · 1712 阅读 · 0 评论 -
spring boot 3.x版本中集成spring security 6.x版本进行实现动态权限控制解决方案
框架会自动使用的方法进行用户加载,在加载用户以后,会在过滤器中的方法中,进行前端输入的用户信息和加载的用户信息进行信息对比。/*** 这里为了演示方便,模拟从数据库查询,直接设置一下权限");return new User("jack" , // 用户名称 new BCryptPasswordEncoder() . encode("123456") , //密码 list //权限列表);} }/**原创 2024-07-08 19:14:05 · 2170 阅读 · 2 评论 -
Spring Boot项目中,如何在yml配置文件中读取maven pom.xml文件中的properties标签下的属性值
在最近的项目开发过程中,有一个需求,需要在Spring Boot项目的yml配置文件中读取到mave的pom.xml文件中的properties标签下的属性值,这个要怎么实现呢?原创 2024-06-01 09:30:00 · 1443 阅读 · 0 评论 -
Java开发Tips:避免浮点数类型比较时陷入的坑
可以看到,虽然Java中浮点数比较只是一个小功能,但是使用不当还是有很大的业务风险,大家平时开发过程中,针对业务功能还是需要做好充分测试。原创 2024-04-27 10:33:07 · 1071 阅读 · 0 评论 -
注意!你在Java程序中使用取模(%)算法进行数字奇偶判断的代码可能有BUG!
我们在平时代码开发过程中,可能会遇到对数字进行奇数、偶数判断,初级开发者往往会使用进行取模的方式,一般来说也不会有什么问题,但是可能存在隐藏bug。测试代码:@TestSystem.out.println("2是:" + doRemainder(2));System.out.println("1是:" + doRemainder(1));System.out.println("0是:" + doRemainder(0));原创 2024-02-25 21:21:03 · 441 阅读 · 0 评论 -
Spring Boot项目中TaskDecorator的应用实践
TaskDecorator是一个执行回调方法的装饰器,主要应用于传递上下文,或者提供任务的监控/统计信息,可以用于处理子线程与主线程间数据传递的问题。System . out . println("线程执行前,资源设置。。。。");System . out . println("线程执行后,资源清理。。。。");} }System . out . println("线程执行前,资源设置。。。。");System . out . println("线程执行后,资源清理。。。。");} }原创 2024-02-20 21:24:39 · 1199 阅读 · 0 评论 -
Java 21 新特性的扫盲级别初体验
JDK 21 于 2023 年 9 月发布,作为目前讨论热度最高的JDK,虽然大家都开玩笑说你发任你发,我用Java8,但是作为一个Javaer,对JDK21的新特性还是要有所了解的。虚拟线程序列集合记录模式字符串模板(预览)未命名模式和变量(预览)未命名类和实例主要方法(预览)作用域值(预览)结构化并发(预览)JDK官网安装过程在这里就不赘述了,正常【下一步】就行了。原创 2024-02-19 22:48:13 · 4871 阅读 · 1 评论 -
Spring Boot集成百度UidGenerator雪花算法使用以及自定义starter封装UidGenerator支持原生DB、Redis、自定义方式获取workID介绍
当下系统开发过程中,普遍会采用分布式微服务架构,在此技术背景下,分布式ID的生成和获取就成为一个不得不考虑的问题。常见的分布式ID生成策略有基于数据库号段模式UUID基于Redis基于zookeeper雪花算法(snowflake)等方案,这其中雪花算法由于其简单、独立、易用的特性,被众多技术选型推荐。雪花算法 (SnowFlake),是 Twitter 开源的分布式 id 生成算法,可以不用依赖任何第三方工具进行自动增长的数字类型的ID生成;雪花算法的核心逻辑是使用一个64 bit 的 long 型。原创 2024-02-05 21:19:33 · 4212 阅读 · 2 评论 -
记一次生产系统每隔10小时(36000000毫秒)固定进行一次Full GC排查思路
某个应用在生产环境通过系统监控发现,应用每隔10小时就会触发一次Full GC,该系统当时承接的业务量并不大,而且固定10小时就会进行Full GC,通过监控时间轴发现Full GC频率很规律,直觉告诉我这不是JVM自身触发的Full GC操作,应该是某个定时任务中进行了垃圾回收操作,但是什么业务场景会存在这种情况呢?方法调用进行了搜索,甚至为了防止是通过反射方式调用的,还检索了所有业务代码,但是均未发现有业务代码进行该方法的调用。,如果没有设置,默认为false,此时会通过反射调用。原创 2024-02-04 20:20:06 · 569 阅读 · 0 评论 -
基于Google guava工具实现一致性Hash算法的应用实践
在分布式架构系统中,要将数据存储到具体的节点上,如果采用普通的key%N取模Hash算法,将数据映射到具体的节点上,就有可能大部分数据集中在某一个节点,形成“热点”数据,造成数据分布失衡,二是如果有一个机器加入或退出这个集群,则大部分的数据映射都无效了,数据需要重新进行排列。基于上面普通Hash算法的问题,1997年由麻省理工学院提出一致性Hash算法,引入了“虚拟节点”的概念:即想象在这个环上有很多“虚拟节点”,数据的存储是沿着环的顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点;原创 2024-01-18 08:00:00 · 1149 阅读 · 0 评论 -
Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数
众所周知,在Spring Boot框架中,Controller层API接口编码获取请求体参数时,在参数上会使用@RequestBody注解;如果一次请求中,请求体参数携带的内容需要用多个参数接收时,能不能多次使用@RequestBody注解呢?原创 2024-01-16 22:24:36 · 2552 阅读 · 4 评论 -
Java SPI机制了解与应用
JDK中的SPI实现,是由ServiceLoader类根据自定义传入类加载器或者应用程序类加载器在约定好的固定路径下(ClassPath:META-INF/services/)去查找和加载第三方接口实现类。服务提供方必须实现目标接口服务提供方必须在自身ClassPath:META-INF/services/路径下建立文件,文件名为目标接口全限定名;文件内容为实现目标接口的具体实现类全限定名。原创 2023-03-05 22:15:33 · 638 阅读 · 1 评论 -
layering-cache扩展——多级缓存有效时间增加随机浮动时间,防止缓存雪崩
一、背景最近在项目中有使用layering-cache(https://gitee.com/xiaolyuh/layering-cache?_from=gitee_search)进行多级缓存,有开发人员说想在缓存的时候增加一定时间的随机浮动,已到达防止缓存雪崩的目的,由于layering-cache是开源的,想增加此功能也十分简单,在此记录一下。缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。二、编码实现本次改造只针对二级缓存,也就是redis缓存层面原创 2022-04-11 22:24:03 · 1126 阅读 · 0 评论 -
java中方法重载时,可变参数方法和定长参数方法调用的优先级
这是以前的一个面试题,虽然当时我回答了会优先调用定长参数方法,但是自己也不确定,后面用代码验证了一下,这里也记录一下:代码:public class MethodTest { public void sayHello(String... args) { System.out.println("hello,可变参数!"); } public void sayHello(String args, String str) { System.out.println("hello,定长参数!原创 2021-03-25 11:02:35 · 454 阅读 · 0 评论 -
使用TransmittableThreadLocal弥补InheritableThreadLocal的不足,可动态刷新线程变量
众所周知,使用InheritableThreadLocal可以实现父子线程之间的值传递,不过使用InheritableThreadLocal有一个隐藏的问题,子线程在创建的时候会从父线程InheritableThreadLocal中拷贝数据,一旦子线程创建成功以后,父线程更新了数据,对子线程是无效的,这种情况在使用线程池的时候会有数据不安全的问题,下面使用代码演示一下:public class ITLTest { // 声明一个线程池 private static final Execut原创 2021-02-09 11:48:51 · 421 阅读 · 1 评论 -
同一条SQL语句,MyBatis 查询结果与 MySQL 执行结果居然不一致!
一、前言不知道大家平时在开发过程中有没有遇到这样的问题,同一条SQL语句,MyBatis 查询结果与 MySQL 执行结果居然不一致,具体说应该是MyBatis 查询结果比MySQL 执行结果的数据更少。不要不相信,如果不注意,这样的坑,你还真有可能会踩的。二、代码演示下面用代码简单演示一下:创建两张表用于测试用:teacher表:CREATE TABLE `teacher` ( `id` int(11) NOT NULL, `name` varchar(255) CHARAC原创 2020-12-16 16:12:56 · 9376 阅读 · 1 评论 -
HttpMessageNotWritableException: No converter found for return value of type,可能出现的原因及解决方法
首先,演示一下出现的情况,创建一个实体类,代码如下:public class User2 { private Long id; private String username; public User2() { } public User2(Long id, String username) { this.id = id; this.username = username; }}使用spring mvc的代码,向原创 2020-11-11 09:09:20 · 12641 阅读 · 6 评论 -
如何使用java代码实现使用默认浏览器打开网页,java中Desktop类的介绍与使用
Desktop类在java中是jdk1.6以后新增的,在java.awt包下,它的主要功能有:启动用户默认的浏览器显示指定的URI链接;启动用户默认的邮件客户端发送URI指定的邮件;启动一个注册应用程序(本地安装了的应用程序)去打开,编辑或打印一个指定的文件。下面使用代码简单演示一下:使用默认浏览器打开网页public class DesktopTest { public static void main(String[] args) { // 使用默认浏览器打开网页 Desk原创 2020-11-05 15:09:26 · 993 阅读 · 0 评论 -
如何使用java代码获取屏幕显示器个数
使用java代码获取屏幕显示器个数,主要是使用java中的GraphicsEnvironment对象,关于GraphicsEnvironment对象的介绍,可以去GraphicsEnvironment文档介绍页面看一下:下面使用代码测试一下:public class ScreenTest { public static void main(String[] args) { // 创建GraphicsEnvironment对象 GraphicsEnvironment g = Graphics原创 2020-11-05 14:53:11 · 1254 阅读 · 0 评论 -
使用tomcat搭建一个本地图片服务器,用Spring Boot工程上传图片并及时显示
一、使用tomcat搭建本地图片服务器准备一个tomcat服务器:2.进入conf目录下,修改server.xml文件中的相关端口:停止服务端口8005 <Server port="8065" shutdown="SHUTDOWN">HTTP端口8080 <Connector port="8765" protocol="HTTP/1.1" connectionTimeout="20000"原创 2020-11-04 12:10:29 · 2802 阅读 · 3 评论 -
InheritableThreadLocal的理解与应用
前面使用一篇博客介绍了ThreadLocal的理解与应用,不过ThreadLocal只能实现在同一个线程中进行值传递,不能实现父子线程之间的值传递,如果想要实现父子线程之间的值传递,就需要使用今天的主角——InheritableThreadLocal。先用代码演示一下:ThreadLocalpublic class InheritableThreadLocalTest { private static ThreadLocal<String> tl = new ThreadLo原创 2020-10-29 16:40:39 · 675 阅读 · 0 评论 -
java8中stream流的常见操作
一、概述Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理原创 2020-10-29 14:40:50 · 1939 阅读 · 0 评论 -
java中SimpleDateFormat线程不安全原因及解决方案
先说结论,在java中SimpleDateFormat日期格式对象是非线程安全的,如果把SimpleDateFormat对象用static关键字修饰,那么在多线程中使用这同一个对象,是有可能会出错的。一、代码演示下面用代码演示一下线程不安全的情况:public class SimpleDataFormatTest { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");原创 2020-10-28 17:57:24 · 1770 阅读 · 1 评论 -
maven项目中,引入依赖的另一个项目没有spring管理bean,在当前项目中可以进行bean的装配管理吗?
标题可能把问题阐述的不是很清楚,这里再次说明一下,就是创建一个maven项目作为当前项目,当前项目引入了完整的spring环境,同时当前项目需要引入另外一个项目的依赖,而需要引入的这个项目并没有完整的spring环境,那么引入这个项目依赖以后,此时在当前项目中,可以使用@Autowired注解进行相关bean的装配工作吗?下面进行验证一下:创建一个简单的maven项目,项目结构如下:导入maven依赖,这里很简单,导入一个spring-context的依赖即可: <dependenc原创 2020-10-20 15:10:03 · 1533 阅读 · 0 评论 -
XMLParserException: XML Parser Error on line 11: 对实体 “characterEncoding“ 的引用必须以 ‘;‘ 分隔符结尾。解决方法
今天使用mybatis逆向工程生成mysql数据库的代码时,报出了一个异常:org.mybatis.generator.exception.XMLParserException: XML Parser Error on line 11: 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。 at org.mybatis.generator.config.xml.ConfigurationParser.parseConfiguration(ConfigurationParse原创 2020-09-18 16:33:37 · 1655 阅读 · 0 评论 -
ThreadLocal的理解与应用
在平时java开发中,如果想使用共享变量,往往使用public static 的方式修饰一个类的成员变量,这样就能实现变量共享了。不过,这样的变量是所有线程都共享的,有没有什么方式可以让这个变量只在某个线程中共享使用呢,答案是有的,可以使用ThreadLocal来解决这个问题。一、ThreadLocal简介hreadLocal类并不是用来解决多线程环境下的共享变量问题,而是用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立。在线程中,可以通过get()/set()方原创 2020-09-18 14:01:26 · 442 阅读 · 0 评论 -
java集合——LinkedList(1.8)源码浅析
LinkedList是Java集合框架中List接口一种实现。LinkedList 是有序并且可以元素重复的集合,底层是基于双向链表的。它也可以被当作堆栈、队列或双端队列进行操作。一、继承体系这里使用IntelliJ IDEA生成的体系图,看一下LinkedList 的继承体系:由体系图可以看到,LinkedLis实现了以下接口:实现了Iterable 接口,可以使用迭代器进行遍历;实现了Collection接口,拥有集合操作的方法;实现了List 接口,拥有集合增删改查等方法;实现Deq原创 2020-09-11 10:33:27 · 281 阅读 · 0 评论 -
Spring框架中,@Resource注解和@Autowired注解的区别
平时开发中,我们知道,spring中,@Resource和@Autowired都是可以在bean的注入时使用。这里简单介绍一下@Resource和@Autowired注解:@Resource有两个常用属性name、type,注入时分4种情况:指定name和type:通过name找到唯一的bean,找不到抛出异常;如果type和字段类型不一致,也会抛出异常;指定name:通过name找到唯一的bean,找不到抛出异常;指定type:通过tpye找到唯一的bean,如果不唯一,则抛出异常;都不指原创 2020-08-21 17:09:12 · 1009 阅读 · 1 评论 -
java中,数值类型变量除以 0 ,一定会报错吗?
在我们惯性思维中,编写java代码时,数值类型做除法运算,除数不能是0,否则程序会抛出异常。那么,有没有列外呢?下面用代码验证一下:整数除以0测试:public static void main(String[] args) { System.out.println("1 / 0=" + 1 / 0); }运行结果:Exception in thread "main" java.lang.ArithmeticException: / by zero at learn原创 2020-08-20 11:44:57 · 4216 阅读 · 0 评论 -
java常见排序算法——快速排序
首先说明一下,此案例中的排序是基于数组升序排列。原理:快速排序是一种排序执行效率很高的排序算法,是由冒泡排序改进而得到的,它利用分治法来对待排序序列进行分治排序,它的思想主要是通过一趟排序将待排记录分隔成独立的两部分,其中的一部分比关键字小,后面一部分比关键字大,然后再对这前后的两部分分别采用这种方式进行排序,通过递归的运算最终达到整个序列有序。思路:在待排序的数组中任取一个元素(通常取第一个记录)作为基准(基准的选取可能会影响到排序的效率),称为基准记录;定义两个索引 low和 high分别表示原创 2020-08-17 12:14:01 · 280 阅读 · 0 评论 -
java中注释的代码一定不会执行,没有注释的代码一定会执行吗?
在平时开发中,我们暂时用不到的代码往往就注释掉了,但是注释掉的代码一定不会执行吗?下面先看一段代码:public static void main(String[] args) { // \u000d System.out.println("hello,world"); }如果注释掉的代码一定不会执行的话,上面的代码运行起来应该不会有任何输出,但是实际运行结果:hello,world!可以看到,代码虽然看起来注释掉了,但实际依然执行了,这是为什么呢?你应该已经发现了,/原创 2020-08-14 17:08:44 · 1312 阅读 · 0 评论 -
Java常见排序算法——选择排序
首先说明一下,此案例中的排序是基于数组升序排列。原理:用逐个选择的方式来进行排序,逐个选择出数组中的最大(或最小)的元素,直到选择至最后一个元素。思路:定义一个存放最小元素的变量min和其对应的下标index;将min依次和数组中元素比较,若min大于该元素,则把该元素的值赋给min,并用index记录该元素下标;将min和尚未排序的数组第一个元素互换,下标也互换;重复进行上述1,2,3步,即可完成排序。下面用代码实现一下:public static void main(String[]原创 2020-08-14 12:18:46 · 218 阅读 · 0 评论 -
java常见排序算法——冒泡排序
首先说明一下,此案例中的排序是基于数组升序排列。原理:每次比较两个相邻的元素,将较大的元素交换至右端。思路:从头部开始比较相邻的两个元素,如果头部的元素比后面的大,就交换两个元素的位置;往后对每个相邻的元素都做这样的比较、交换操作,这样到数组尾部时,最后一个元素会成为最大的元素;重新从头部开始第 1、2 步的操作,除了在这之前尾部已经排好的元素;继续对越来越少的数据进行比较、交换操作,直到没有可比较的数据为止,排序完成。下面用代码实现一下: public static void m原创 2020-08-14 10:55:32 · 203 阅读 · 0 评论 -
java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed解决办法
今天使用spring boot创建一个简单应用,在进行数据库访问时突然抛出了一个异常:java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) ~[mysql-connector-java-8.0.20.jar:8.0.20] at com.m原创 2020-08-10 21:29:39 · 3859 阅读 · 0 评论 -
java中,当对象为null时调用方法,一定会报错吗?
在平时开发中,我们经常会碰到当对象为null时去调用一个方法报空指针异常的情况,那么这种情况是不是一定会出现呢?答案是否定的,接下来我们测试一下:先写一个测试类:public class NullTest { /** * 普通方法 */ public void sayHello() { System.out.println("hello, null."); } /** * 静态方法 */ public st原创 2020-08-07 10:21:52 · 2776 阅读 · 0 评论 -
StringBuilder清空方式比较:Java中四种方法分析及效率对比
在平时的开发中,StringBuilder用的还是比较常见的,主要是用于优化String字符串的拼接操作。这里介绍一下StringBuilder常见的清空方式:使用new关键字重新生成一个StringBuilder对象;使用StringBuilder的delete方法;使用StringBuilder的setLength方法;使用StringBuilder的replace方法。接下来分别测试上述4个方法,查看一下效率:测试new新建对象: @Test public void ne原创 2020-08-05 17:25:45 · 22982 阅读 · 1 评论 -
java程序可以实现在指定CPU上运行吗?
java程序可以指定CPU运行吗?这是我以前遇到的一个面试问题,这两天又想起来了。一般我们都知道C、C++是可以实现程序指定CPU运行的,那么java到底可不可以呢?网上一部分人说可以,一部分人说不可以,我先说一下我搜集的资料显示是可以的,不过实现起来需要特殊的开发环境,主要就是需要安装jrockit-jdk。一、jrockit-jdk安装jrockit-jdk简介:Oracle JRockit JVM 是业界性能最高的 Java 虚拟机,现内置于 Oracle 融合中间件中。它通过 JRocki原创 2020-08-04 14:25:18 · 1157 阅读 · 0 评论 -
通用java枚举类转List-Map集合
java的枚举类功能是很强大的,在平时开发中也用的比较多,有时候可能会有将枚举类转成List集合这种需求,如果能确定枚举类中的字段固定可以使用实体类接收,如果不固定的话,很多时候只能用Map来接收了。这里实现一下java枚举类转List集合: /** * java枚举类转List<Map>集合 * * @param clazz * @return null-该class不是枚举类型 []-该枚举类型没有自定义字段 list-获取该枚举类型的Lis原创 2020-06-28 15:48:54 · 3201 阅读 · 0 评论 -
java8中计算时间日期间隔几种常见方法介绍
在平时开发工作免不了会进行时间日期间隔计算,下面简单介绍几个在java8中用于计算时间日期间隔的类和方法:1.ChronoUnit使用ChronoUnit可以快速方便的计算出两个时间日期之间的间隔天数,示例代码: @Test public void testChronoUnit() { LocalDate startDate = LocalDate.of(2020, Month.APRIL, 6); System.out.println("开始时间:" + st原创 2020-06-10 14:58:37 · 2076 阅读 · 0 评论 -
MySQL数据库update A set num=num+ ? where id=?并发执行情况下存在线程安全问题吗?
首先,先说结论:这个SQL语句执行可以看做是原子操作,没有线程安全问题。使用代码演示一下:1.创建一个xu_hao表,为了简单,只有id和num两个字段CREATE TABLE `xu_hao` ( `id` int(11) NOT NULL, `num` int(11) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_gener原创 2020-06-05 09:55:18 · 5131 阅读 · 1 评论