java
文章平均质量分 79
ZNineSun
大道至简,返璞归真
展开
-
解决com.alibaba.fastjson.JSONException: default constructor not found的问题
在进行JSON和对象互转时,发现有个报错:通过其提示可以看出在利用fastJson转对象时需要无参的构造函数,而我的对象:是没有构造函数的,所以需要手动加进去关键就是这个注解:@NoArgsConstructor,在次尝试就会发现已经解决了原创 2024-01-15 14:29:42 · 2991 阅读 · 0 评论 -
Java中并发下的ThreadlocalRandom
在看同事写的代码的时候发现代码里有很多像:如果我们想要生成一个随机数,通常会使用Random类。但是在并发情况下Random生成随机数的性能并不是很理想,今天给大家介绍一下JUC包中的用于生成随机数的类–ThreadLocalRandom.(本文基于JDK1.8)当然Random随机数也可以保证线程的安全,但是Random随机数生成是和种子seed有关,而为了保证线程安全性,Random通过CAS机制来保证线程安全性。从next()方法中我们可以发现seed是通过自旋锁和CAS。原创 2024-01-10 10:44:30 · 788 阅读 · 0 评论 -
Java8之Stream流的Collectors.toMap Duplicate key问题
在项目部署的时候,编译通过,但是一直运行不起来,看到错误日志之后发现:原因是我使用stream将list转成Map的时候,有一个RouteId是重复的,导致转换报错。原创 2023-11-30 17:34:31 · 1845 阅读 · 0 评论 -
解决:java.lang.IllegalArgumentException: Java 8 date/time type `java.time.LocalDate` not supporte
在使用ObjectMapper进行Map和对象的转换时,因为对象中有一个字段的属性为:LocalDate,导致产生:解决方法也很简单,按照它的错误提示,添加:完整代码:原创 2023-11-03 16:29:47 · 661 阅读 · 0 评论 -
Bean转换工具MapStruct看这一篇就够了
mapstruct是一种实体类 映射框架,能够通过Java注解将一个实体类的属性安全地赋值给另一个实体类。它基于约定优于配置方法极大地简化了 Java bean 类型之间映射的实现,有了mapstruct,只需要定义一个映射器接口,声明需要映射的方法,在编译过程中,mapstruct会自动生成该接口的实现类,实现将源对象映射到目标对象的效果。总的来说,有如下三个特点:基于注解在编译期自动生成映射转换代码类型安全、高性能、无依赖性。原创 2023-10-24 19:29:56 · 1616 阅读 · 0 评论 -
Java中双冒号“::”到底什么意思
看到这儿大家应该对什么是方法引用有了一些认知,其本质就是Runnable或Consumer来指向一个具体的方法,至于该使用哪一个就要看指向的方法是否有参数。上面的内容均是无返回结果的,因为不管是Runnable的run方法还是Consumer的accept方法,均无返回值,如果我们需要返回值则可以使用。通过其源码也可以发现,Consumer也是一个函数式接口,里面提供了一个有参的accept方法,这个方法对应到。,是Java 8中的Lambda表达式写法之一,一种执行方法的方法。原创 2023-10-07 17:27:39 · 3803 阅读 · 0 评论 -
一文带你彻底掌握Java Stream流
Java 8 新增的 Stream 是为了解放程序员操作集合(Collection)时的生产力,之所以能解放,很大一部分原因可以归功于同时出现的 Lambda 表达式——极大的提高了编程效率和程序可读性。从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。原创 2023-06-25 22:49:03 · 717 阅读 · 0 评论 -
Optional的使用详解
如果list集合为空创建一个空对象集合赋值给newList,保证list集合永远不为空,也就避免了空指针异常。这样写其实功能上没有任何问题,但是如果需要判断的字段比较多,或者本身已经嵌套了多重循环或者判断,再加上这一层判断,代码就会变得非常臃肿,可读性非常差。其本质就是一系列三目运算,首先执行ofNullable()方法,如果T对象为空,执行empty()方法;下面我们看看具体如何使用,isPresent和orElse已经在上面的代码中有所体现,下面我们看看map是怎么使用的。原创 2023-05-05 15:50:38 · 720 阅读 · 0 评论 -
Spring Boot 如何快速过滤出一次请求的所有日志?
本文讲述了如何使用MDC工具来快速过滤一次请求的所有日志,并通过装饰器模式使得MDC工具在异步线程里也能生效。有了MDC,再通过AOP技术对所有的切面植入requestId,就可以将整个系统的任意流程的日志过滤出来。使用MDC工具,在开发自测阶段,可以极大地节省定位问题的时间,提升开发效率;在运维维护阶段,可以快速地收集相关日志信息,加快分析速度。原创 2023-01-31 14:56:04 · 755 阅读 · 0 评论 -
实现web实时消息推送的方案总结
推送的场景比较多,比如有人关注我的公众号,这时我就会收到一条推送消息,以此来吸引我点击打开应用。消息推送(push)通常是指网站的运营工作等人员,通过某种工具对用户当前网页或移动设备APP进行的主动消息推送。消息推送一般又分为web端消息推送和移动端消息推送。web端消息推送常见的诸如站内信、未读邮件数量、监控报警数量等,应用的也非常广泛。在具体实现之前,咱们再来分析一下前边的需求,其实功能很简单,只要触发某个事件(主动分享了资源或者后台主动推送消息),web页面的通知小红点就会实时的。原创 2022-12-25 22:26:22 · 845 阅读 · 0 评论 -
深入浅出MappedByteBuffer
java io操作中通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于MappedByteBuffer操作大文件的方式,其读写性能极高,本文会介绍其性能如此高的内部实现原理。在深入MappedByteBuffer之前,先看看计算机内存管理的一些知识:那么问题来了,为什么会有虚拟内存和物理内存的区别?什么是虚拟内存地址和物理内存地址?计算机会对虚拟内存地址空间(32位为4G)进行分页产生页(page),对物理内存地址空间原创 2022-12-05 11:20:38 · 687 阅读 · 0 评论 -
SpringBoot配置https
由于HTTPS具有良好的安全性,在开发中得到了越来越广泛的应用,像微信公众号、小程序等的开发都要使用HTTPS来完成。对于个人开发者而言,一个HTTPS 证书的价格还是有点贵,但是呢,国内的一些云服务器厂商提供免费的HTTPS证书,一个账号可以申请数个,当然,在jdk中提供了一个Java数字证书,我可以也可以利用这个工具生成一个数字证书。原创 2022-11-22 18:57:43 · 1635 阅读 · 1 评论 -
Spring Boot+Netty+Websocket实现后台向前端推送信息
Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的API的客户端/服务器框架。可能在此之前你没有接触过,不过不要担心,下面我们通过一个消息推送的例子来看一下netty是怎么使用的。2.设置主启动类3.NettyServer4.MyChannelHandlerPool通道组池,管理所有websocket连接5.WebSocketHandler处理ws以下几种情况:6.Netty配置管理全局Channel以及用户对应的channel(推送消息)7.s原创 2022-11-16 13:44:17 · 2805 阅读 · 0 评论 -
SSO 单点登录和 OAuth2.0 的区别和理解
SSO是的缩写,OAuth是的缩写,这两者都是使用令牌的方式来代替用户密码访问应用。流程上来说他们非常相似,但概念上又十分不同。SSO大家应该比较熟悉,它将登录认证和业务系统分离,使用独立的登录中心,实现了在登录中心登录后,所有相关的业务系统都能免登录访问资源。OAuth2.0原理可能比较陌生,但平时用的却很多,比如访问某网站想留言又不想注册时使用了微信授权。以上两者,你在业务系统中都没有账号和密码,账号密码是存放在登录中心或微信服务器中的,这就是所谓的使用令牌代替账号密码访问应用。原创 2022-11-09 21:32:25 · 235 阅读 · 0 评论 -
toString()、String.valueOf、(String)强转,有啥区别?
相信大家在日常开发中这三种方法用到的应该很多,尤其是前两种,经常在开发的时候,随心所欲,想用哪个用哪个,既然存在,那就应该有它存在的道理,那么什么情况下用哪个呢?我们先看看答案:1、toString(),可能会抛空指针异常在这种使用方法中,因为java.lang.Object类里已有public方法.toString(),所以java对象都可以调用此方法。但在使用时要注意,必须保证object不是null值,否则将抛出异常。采用这种方法时,通常派生类会覆盖。原创 2022-09-16 10:33:26 · 591 阅读 · 0 评论 -
简单聊聊异常体系
当Java中提供的异常不能满足我们的需求时,或者我们需要通过指定异常来触发某些事件时,我们可以自定义异常。定义异常类写继承关系提供空参构造提供带参构造public class 异常类名 extends RuntimeException {public 异常类名() {} public 异常类名(参数) {super(参数);} }原创 2022-09-14 23:54:03 · 314 阅读 · 0 评论 -
猿创征文|SpringBoot 集成 thumbnailator (图片缩放,区域裁剪,水印,旋转,保持比例)
之前在公司工作的时候,曾经做过企业的数据加密,其中就包含图片,文档以及pdf的水印添加问题,好久没弄有些遗忘了,今天又重新整理了一下,也顺便给自己留个记录。thumbnailator 是 Google 开源的图片处理库,支持:图片缩放,区域裁剪,水印,旋转,保持比例。下面跟着我的操作,大家一起走遍。首先确保自己已经搭建好了一个SpringBoot的web项目。......原创 2022-09-01 15:21:04 · 752 阅读 · 0 评论 -
Java 序列化和反序列化为什么要实现 Serializable 接口?
其实我上面思考的过程大家也可以借鉴,不要一上来就要去编码,否则会使自己特别的局限。下面我们来一一解答这几个问题.原创 2022-08-26 17:10:31 · 312 阅读 · 0 评论 -
那些年你啃过的ConcurrentHashMap
有的童鞋在看Juc这一块的时候会去背诵源码,将方法的调用链都讲的头头是道,我认为没有必要,相反面试官可能会觉得你过于抽象,背的这么清楚。并发的核心在于如何用手段去解决可能遇到的安全问题,并且让它更高效点,面试的目的也是为了体现你思维能力。原创 2022-08-21 17:30:57 · 229 阅读 · 0 评论 -
一文带你彻底了解synchronized 和 Lock
synchronize在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。的时候,是会消耗CPU资源的。所以自旋必须要有一定的条件控制,否则如果一个线程执行同步代码块的时间很长,那么等待锁的线程会不断的循环反而会消耗CPU资源。在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要。在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。...原创 2022-08-08 00:56:15 · 2594 阅读 · 0 评论 -
一文带你玩转offer-01
时间轮一种用来存储定时任务的环状数组。环形数组遍历环形数组的指针首先要定义一个固定长度的环形数组,然后数组的每一个元素代表一个时间刻度,假设每个刻度之间的间隔是1s,那么长度为8s的数组就代表8秒钟。然后就是需要有一个指针,那么这个指针是按照顺时针的方向,无限的循环这个数组,每隔一个最小的时间单位就前进一个数组的索引,那么这个指针完整的转一圈的话就代表8秒钟,转一圈的话就代表16秒钟,假设从0点0分0秒开始,转一圈之后就到了0点0分9秒httpshttpshttpshttps。...............原创 2022-07-30 00:33:29 · 724 阅读 · 0 评论 -
说说 Spring Bean 的实例化过程?面试必问
对于写Java的程序员来说,Spring已经成为了目前最流行的第三方开源框架之一,在我们充分享受Spring IOC容器带来的红利的同时,我们也应该考虑一下Spring这个大工厂是如何将一个个的Bean生产出来的。Spring将管理的一个个的依赖对象称之为Bean,Spring IOC容器就好像一个生产产品的流水线上的机器,Spring创建出来的Bean就好像是流水线的终点生产出来的一个个精美绝伦的产品。既然是机器,总要先启动,Spring也不例外。因此Bean的一生从总体上来说可以分为两个阶段:我们先探讨原创 2022-07-03 21:45:06 · 1137 阅读 · 0 评论 -
Spring高频面试题
文章持续更新中…我们知道java之所能够有如此美好的生态,spring绝对功不可没,因为完美的和spring兼容在一起,才有了那么多丰富好用的功能。1.AOP有哪些实现方式?AOP有两种实现方式:静态代理和动态代理。1.1 静态代理静态代理:代理类在编译阶段生成,在编译阶段将通知织入Java字节码中,也称编译时增强。AspectJ使用的是静态代理。缺点:代理对象需要与目标对象实现一样的接口,并且实现接口的方法,会有冗余代码。同时,一旦接口增加方法,目标对象与代理对象都要维护。1.2 动态代理原创 2022-05-31 21:52:42 · 1166 阅读 · 2 评论 -
实现接口的限流各种算法
当然在现在的分布式架构下,我们可以通过服务的快速熔断,降级,隔离,限流等方式来应对单个微服务崩溃而导致整个服务不可用的情况,如果你使用的是SpringCloud,你可以使用Hystrix,如果你使用的是SpringCloud-alibaba,那么你可以使用Sentinel来帮助你实现接口的限流,但是,如果我们不依赖于其它组件,那该如何去实现接口的限流呢?实现接口限流的方法有很多,我大概带着大家一起探讨一下。计数器法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于 A 接口来说,我们 1 分钟的原创 2022-07-02 19:38:03 · 4400 阅读 · 3 评论 -
Map+函数式接口解决if-else
最近有一个需求,很简单,但是代码写起来很难看,也不够优雅,后来发现lambda表达式中有一个Function函数,根据优惠券的类型resourceType和编码resourceId来 查询发放方式grantType和领取规则先看看我最初的实现方式:优惠券大致有以下几种:我第一次的思路是通过若干个if-else进行查询:这样写扩展性几乎就是没有,也就是说在来几种优惠券的话,只能改了代码重新上线才行,不够灵活,而且不易维护,后来又想到策略模式,因为策略模式的设计原则就是把会变化的部分取并封装起来,这样就可以保原创 2022-06-17 17:16:15 · 465 阅读 · 0 评论 -
JVM锁优化和逃逸分析
1.锁优化jvm 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。我们接下来看看这些优化手段都是干什么的。1.1 自旋锁和自适应自旋现在大多的处理器都是多核处理器 ,如果在多核心处理器,有让两个或者以上的线程并行执行,我们可以让一个等待线程不放弃处理器的执行时间。设置一个等待超时时间,看线程是否能够很快的释放锁,在等待的这段时间可以执行一个空循环,让当前线程继续占用 CPU 的时间片。这就是所谓的「自旋锁」。JVM 中可以通过 +XX:UseSpinning来开启自原创 2022-05-27 22:43:23 · 290 阅读 · 0 评论 -
Java分布式锁
1.什么是锁?在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。而同步的本质是通过锁来实现的。为了实现多个线程在一个时刻同一个代码块只能有一个线程可执行,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的线程结束同步代码块取消标记后再去尝试设置标记。这个标记可以理解为锁。不同地方实现锁的方式也不一样,只要能满足所有线程都原创 2021-12-28 15:53:48 · 3596 阅读 · 0 评论 -
java 在遍历时移除list中的元素
在我们遍历列表时如果直接使用list.remove函数则会产生java.util.ConcurrentModificationException我们可以通过迭代器删除其中的元素 List<String> list = new LinkedList<>(); list.add("A"); list.add("B"); list.add("C"); Iterato原创 2021-07-22 22:18:03 · 574 阅读 · 0 评论 -
解决因时区导致时间不一致的问题
我们在从数据库进行查数据或将查出的时间进行传递时经常会发现时间少一天这是由于时区不同导致的,此时我们只需要将需要传递的属性设定为指定的时区,那么在查询以及传递时就会按照该时区进行传输1.在实体属性上添加JsonFormat" @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date selectTime;2.在application.properties中添加全局配置#配置时间原创 2021-05-15 15:52:30 · 1013 阅读 · 0 评论 -
springBoot集成swagger
1.springBoot集成swagger1.引入依赖2.添加SwaggerConfig3.在controller层添加注解1.springBoot集成swagger1.引入依赖 <!-- 集成swaggerui --> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> ..原创 2021-04-28 09:46:55 · 234 阅读 · 0 评论 -
jar包在服务器后台部署
如果我们直接使用java -jar zuul-0.0.1-SNAPSHOT.jar的方式来进行部署,则我们关闭窗口服务就会立刻停止,我们可以通过以下指令:nohup java -jar zuul-0.0.1-SNAPSHOT.jar >msg.log 2>&1 &的方式让服务在后台运行其中669为进程的pid,如果我们想停止此项服务则可以通过kill 669将服务停止查看所有进程netstat -anp...原创 2021-03-18 15:49:37 · 425 阅读 · 0 评论 -
Java 泛型 T,E,K,V,?,傻傻分不清?
1.前言2.泛型的好处3.泛型中通配符3.1 ?无界通配符3.2 上界通配符<? extends E>3.3 下界通配符<? super E>4.?和 T 的区别4.1 区别1:通过 T 来 确保 泛型参数的一致性4.2 区别2:类型参数可以多重限定而通配符不行4.3 区别3:通配符可以使用超类限定而类型参数不行5.Class< T> 和 Class<?> 区别1.前言Java 泛型(generics)是 JDK 5..原创 2021-01-01 15:52:35 · 1253 阅读 · 0 评论 -
ubuntu安装配置redis
1.安装2.执行service redis status 我们可以看到redis的一些状态3.配置redis4.重新启动redis5.使用windows远程连接进行测试1.安装sudo apt-get install redis-server2.执行service redis status 我们可以看到redis的一些状态service redis status3.配置redis找到/et/redis/redis.conf文件修改如下几处1.注释掉 127...原创 2020-10-26 08:43:58 · 397 阅读 · 0 评论 -
解决tomcat控制台乱码
1.编辑 tomcat\bin 目录下的 startup.bat 文件2.修改 catalina.bat 文件3.由于直接打开 startup.bat 文件,执行的时候是 windows 的 cmd 窗口,窗口的默认编码是 gbk 编码号是 936,如图:1.编辑 tomcat\bin 目录下的 startup.bat 文件将 call “%EXECUTABLE%” start %CMD_LINE_ARGS% 修改为 call “%EXECUTABLE%” run %CMD_LINE_..原创 2020-09-15 22:15:55 · 220 阅读 · 0 评论 -
war包转jar包运行显示无主清单属性
1.我们将war包改为jar包很简单,只需修改<packaging>war</packaging>将其改为<packaging>jar</packaging>即可,但是在我们在运行时可能会出现以下错误此时做法也很简单,只需添加一个插件即可<plugin> <groupId>org.springframework.boot</groupId>原创 2020-09-15 21:51:48 · 725 阅读 · 0 评论 -
pom文件修改jdk版本
1.在pom文件中添加插件<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source>原创 2020-09-15 21:05:34 · 1452 阅读 · 0 评论 -
解决tomcat启动闪退的问题
1.首先cd到tomcat的bin目录下,输入指令startup.bat run,如果出现下图所示提示2.闪退的原因还有可能是java环境变量没有配置好导致,打开高级系统设置配置环境,点击path,完成以下配置1.首先cd到tomcat的bin目录下,输入指令startup.bat run,如果出现下图所示提示则说明环境变量未添加JAVA_HOME,打开高级系统设置配置环境完成以上操作步骤即可2.闪退的原因还有可能是java环境变量没有配置好导致,打开高级系统设置配置环境,点击path..原创 2020-09-14 22:00:48 · 2062 阅读 · 0 评论 -
idea集成lomBook
1.引入mavern依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency>2.引入插件打开file->s原创 2020-07-27 16:07:35 · 807 阅读 · 0 评论 -
java知识手册
1.java8 list排序——通过指定元素排序1.1 排序方法1.2 测试示例2.java8 list去重——通过指定元素去重2.1 去重方法2.2 测试示例1.java8 list排序——通过指定元素排序1.1 排序方法 tbLabelList = tbLabelList.stream().sorted(Comparator.comparing(TbLabel::getUserAnswerTimes).reversed()).collect(Collectors.t..原创 2020-07-21 11:00:22 · 249 阅读 · 0 评论 -
OSS的使用
1.引入maven依赖2.上传文件3.断点上传1.引入maven依赖 <!--引入阿里oss--> <!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss --> <dependency> <groupId>com.aliyun.oss</groupId> <ar..原创 2020-06-22 13:52:39 · 1959 阅读 · 0 评论