自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (1)
  • 收藏
  • 关注

原创 Stream调试

但是却给调试带来了极大的不便,idea推出了streamtrace功能,可以详细看到每一步操作的关系、结果,非常方便进行调试。StreamTrace只有在debug模式下才能使用,当在Stream代码上设置断点后,启动debug,点击流按钮,如图所示。如上图所示,可以看到每一步操作的元素个数、操作的结果、元素转换前后的对应关,非常清晰明了;可以点击左下方按钮切换到FlatMode模式,当然也可以再切换回去。这里简单将字符串转成它的字符数,并设置断点开启debug模式。点击后,默认Split模式显示。...

2022-07-31 18:16:07 701 1

原创 设计模式:代理模式

这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。2、真实主题(RealSubject)类实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。3、代理(Proxy)类提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。3、代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性。1、代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;...

2022-07-24 19:41:11 284

原创 @Validated和@Valid的用法

所以对于一些简单的校验,可以用注解的方式,这个时候就会用到@Validated或@Valid的注解了,但是这两个注解有什么区别呢?一个待验证的pojo类,其中还包含了待验证的对象,需要在待验证对象上注解@Valid,才能验证待验证对象中的成员属性,这里不能使用@Validated。@Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同。@Validated提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制。...

2022-07-17 13:17:37 3318

原创 简单工厂模式和策略模式的区别

在了解了工厂模式和策略模式后,一直给人一种错觉,总感觉是一样的,没有丝毫的区别。可以看下两种模式的UML图。

2022-07-10 18:07:33 372

原创 Redis和Guava缓存

我们开发中经常用到Redis作为缓存

2022-07-03 16:29:10 538

原创 BigDecimal使用

我们在使用金额计算或者展示金额的时候经常会使用BigDecimal,也是涉及金额时非常推荐的一个类型。BigDecimal自身也提供了很多构造器方法,这些构造器方法使用不当可能会造成不必要的麻烦甚至是金额损失,从而引起事故资损。首先我们看一段代码,如下所示:执行结果如下:通过测试发现,当使用double或者float这些浮点数据类型时,会丢失精度,String、int则不会。这是为什么呢?我们点开构造器方法看下源码:问题就处在 doubleToRawLongBits 这个方法上,在jdk中doubl

2022-06-26 15:00:26 315

原创 Java8流Stream

Java 8 API添加了一个新的抽象称为流Stream

2022-06-12 12:54:47 71

原创 设计模式:策略模式

在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。如果使用多重条件转移语句实现(即硬编码),不但使条件语句变得很复杂,而且增加、删除或更换算法要修改原代码,不易维护,违背开闭原则。如果采用策略

2022-06-01 20:51:11 64

原创 EXCEL导出动态表头

EXCEL导出动态表头

2022-05-29 17:02:47 2512 1

原创 SQL查找是否存在的优化

根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,很多人在写SQL的时候,还是会习惯性的用SELECT count(*) 。SQL写法如下:SELECT count(*) FROM table WHERE a = 1 AND b = 2Java写法如下:int nums = xxMapper.countXxxxByXxx(params);if (nums > 0) { //当存在时,执行这里的代码} else { //当不存在时,执行这里的代码}这种写法当然没什

2022-05-22 17:47:04 277

原创 @Async调用线程池

对于异步方法调用,从Spring3开始提供了@Async注解,该注解可以被标注在方法上,以便异步地调用该方法。调用者将在调用时立即返回,方法的实际执行将提交给Spring TaskExecutor的任务中,由指定的线程池中的线程执行。在项目应用中,@Async调用线程池,推荐使用自定义线程池的模式。自定义线程池常用方案:重新实现接口AsyncConfigurer。Spring已经实现的线程池1、SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,默认每次调用都会创建一个新

2022-05-08 18:06:14 5276 1

原创 建造者模式(Bulider模式)

在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由 CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。生活中这样的例子很多,这些产品都是由多个部件构成的,各个部件可以灵活选择,但其创建步骤都大同小异。这类产品的创建无法用工厂模式描述,所以就要用到接下来要学习的建造者模式了。建造者(B

2022-05-01 18:36:00 150

原创 RocketMQ延迟消息

生产者把消息发送到消息队列中以后,并不期望被立即消费,而是等待指定时间后才可以被消费者消费,这类消息通常被称为延迟消息。在RocketMQ中,支持延迟消息,但是不支持任意时间精度的延迟消息,只支持特定级别的延迟消息。如果要支持任意时间精度,不能避免在Broker层面做消息排序,再涉及到持久化的考量,那么消息排序就不可避免产生巨大的性能开销。消息延迟级别如下:messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h

2022-04-17 18:04:10 1871

原创 Redis简单限流

限流算法在分布式领域是一个经常被提起的话题,当系统的处理能力有限时,如何阻止计划外的请求继续对系统施压,这是一个需要重视的问题。除了控制流量,限流还有一个应用目的是用于控制用户行为,避免垃圾请求。比如在 UGC 社区,用户的发帖、回复、点赞等行为都要严格受控,一般要严格限定某行为在规定时间内允许的次数,超过了次数那就是非法行为。对非法行为,业务必须规定适当的惩处策略。如何使用 Redis 来实现简单限流策略?首先我们来看一个常见 的简单的限流策略。系统要限定用户的某个行为在指定的时间里只能允许发生 N

2022-04-10 16:19:58 142

原创 增强for循环的增删操作

最近在看Java开发手册时,看到这样一条规定:下面就来一探究竟,看看为什么会有这样的规定。Foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素。foreach语法格式如下:for( 元素类型T 元素变量t : 遍历对象obj){ 引用了t 的java 语句;}以下实例演示了普通for循环和foreach循环使用: private static void test() { List<String&g

2022-04-03 14:02:49 2562 2

原创 设计模式四:抽象工厂模式

工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。也就是说:工厂方法模式只考虑生产同种类的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多种类的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调。考虑多种类产品的生产,将同一个具体工厂所生产的位于不同种类的一组产品作为一个产品族则需要抽象工厂模式了。抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访

2022-03-27 17:47:42 102

原创 慎用ArrayList的subList

subList 是List接口中定义的一个方法,该方法主要用于返回一个集合中的一段、可以理解为截取一个集合中的部分元素,他的返回值也是一个List。如下代码: List<String> names = new ArrayList<String>() {{ add("Hello"); add("World"); add("Good"); }}; List subLi

2022-03-20 17:51:59 470

原创 如何创建线程池

如何创建线程池

2022-03-13 15:54:41 4922

原创 设计模式三:工厂方法模式

工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。优点:1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。2、灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。缺点:1、类的个数容易过多,增加复杂度2、增加了系统的抽象性和

2022-03-06 15:56:57 62

原创 设计模式二:原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。原型模式的定义与特点用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对

2022-02-27 18:51:02 131

原创 设计模式一:单例模式

在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。单例模式的定义与特点单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的

2022-02-20 16:49:13 59

原创 对称加密、非对称加密、混合加密

对称加密两边用同一个密钥来加解密。A把明文通过某一算法加密之后得到密文,然后把密文发送给B,B接收到密文之后用相同的密钥执行相同的算法去解密。X没有密钥,即使窃取到密文也无法窃听。对称加密的有优缺点对称加密的优点:加解密速度快对称加密的缺点:会出现密钥分配问题;密钥容易复制,不便于安全保管密钥分配问题对称加密的存在密钥分配问题,A的密钥怎么才能安全的传输到B手里不被X获取到?A直接发送密钥给B还是可能被X窃取到这个密钥,这样加密信息等于是在裸奔了。只有用密钥加密后的信息才能安全传输,但是只有

2022-02-13 15:46:13 176

原创 三目运算符空指针

在代码中使用了三目运算符,代码在线上运行的时候发生了NPE,经过排查,发现原来是三目运算符和自动拆装箱之间有一定的关系,导致了空指针。那么,三木是三目运算符呢?为什么会导致空指针?下面也是学习了解到的内容,跟大家分享下。一、三目运算符对于条件表达式 b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式从不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a ? b : c ? d

2022-01-23 18:53:43 489

原创 String类型请求参数去除收尾空格

在做一个项目时,因为要用户输入一些关键信息传入后端保存。这些信息一般是从网页上拷贝的,用户在选中内容进行拷贝时非常容易头尾混入空格,从而导致保存没问题,但是使用时才发现不对。因此在请求入参时将收尾空格去除就十分有必要。在收到这个需求后,考虑了以下几种方案:一、前端去除;二、后端各个方法按字段去除;三、后端各个方法按请求POJO去除。对几个方案进行评估后发现都行不通。方案一,前端工作量会很大,后端接收后也不能保证准确;方案二,工作量太多,要校验的字段太多,代码侵入太高;方案三,跟方案二类似,只

2022-01-16 17:32:55 928

原创 SimpleDateFormat使用

在日常开发中,我们经常会用到时间,我们有很多办法在Java代码中获取时间。但是不同的方法获取到的时间的格式都不尽相同,这时候就需要一种格式化工具,把时间显示成我们需要的格式。最常用的方法就是使用SimpleDateFormat类。SimpleDateFormat是Java提供的一个格式化和解析日期的工具类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。SimpleDateFormat使得可以选择任何用户定义的日期- 时间格式的模式。在Java中,可以使用SimpleD

2022-01-09 11:40:51 2285

原创 ArrayList浅析

https://zhuanlan.zhihu.com/p/426461477

2021-10-31 19:01:13 64

原创 EasyExcel导入导出

EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。主要解决方式:通过解压文件的方式加载,一行一行的加载,并且抛弃样式字体等不重要的数据,降低内存的占用。EasyExcel优势1、注解式自定义操作。2、输入输出简单,提供输入输出过程的接口。3、支持一定程度的单元格合并等灵活化操作。常用注解@ExcelProperty指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然

2021-10-24 08:53:29 635

原创 volatile的实现原理

volatile的实现原理

2021-10-17 00:16:26 199

原创 Optional用法

Optional用法

2021-10-07 13:45:36 254

原创 StringUtils工具类

在日常开发中,用的最多的StringUtils工具类就是org.apache.commons.lang3.StringUtils。在这个工具类中有许多方法,如:isEmpty、isNotEmpty、isNotBlank、isBlank等常用的方法。除此之外,还有许多不常用的方法,如:isAnyEmpty、isNoneEmpty、isAnyBlank、isNoneBlank等。下面就来看看这些方法都是如何使用的。一、StringUtils.isEmpty()是否为空。可以看到" “空格是会绕过这种空判断,

2021-09-19 20:13:44 938

原创 Netty学习二:如何写一个echo服务器

Netty 实现的echo服务器都需要下面这些:1、服务器 handler:这个组件实现了服务器的业务逻辑,决定了连接创建后和接收到信息后该如何处理;2、Bootstrapping:这个是配置服务器的启动代码。最少需要设置服务器绑定的端口,用来监听连接请求。通过ChannelHandler来实现服务器的逻辑Echo Server 将会将接受到的数据的拷贝发送给客户端。因此,我们需要实现ChannelInboundHandler接口,用来定义处理入站事件的方法。由于我们的应用很简单,只需要继承 Cha

2021-09-19 18:47:07 203

原创 企业微信授权完成回调域名不一致

在做企业微信的应用授权时,按照文档生成了二维码URL,但是想测试的时候却发现出现了问题。提示redirect_uri 与配置的授权完成回调域名不一致。如下图:微信的对接文档也没有相关提示,所以一时无从下手。上网搜索发现很多人都有类似问题,调查发现需要配置授权完成回调域名,如下图在登录授权处进行设置。但是我们在开发测试阶段,是没有用域名进行测试的。这样即使设置了授权完成回调域名也不起作用。这时候可以设置授权配置,设置成测试以通过校验。appid可以不传,主要是auth_type,即授权类型,它是个

2021-09-12 11:36:46 2515

原创 企业微信推送suite_ticket对接

企业微信推送suite_ticket对接

2021-09-05 14:52:51 3294 5

原创 BeanUtils该用哪个

在日常开发中,我们经常需要给对象进行赋值,通常会调用其set/get 方法,有些时候,如果我们要转换的两个对象之间属性大致相同,会考虑使用属性拷贝工具进行。如我们经常在代码中会对一个数据结构封装成DO、SDO、DTO、VO 等,而这些Bean中的大部分属性都是一样的,所以使用属性拷贝类工具可以帮助我们节省大量的set和get操作。市面上有很多类似的工具类,在开发中比较常用的有Spring BeanUtils和Apache BeanUtils。那么,我们到底应该选择哪种工具类更加合适呢?下面通过代码来比较

2021-09-04 23:14:21 509

原创 Netty学习二:Netty由哪几个部分构成

上一章初步了解了Netty,知道了Netty是一个基于NIO的客户、服务器端的编程框架,使用Netty可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。那么Netty由哪几个部分构成呢?ChannelChannel是NIO基本的结构。它代表了一个用于连接到实体如硬件设备、文件、网络套接字或程序组件,能够执行一个或多个不同的I/O 操作(例如读或写)的开放连接。现在,把 Channel 想象成一个可以“打开”或“关闭”,“连接”或“断开”和作为传入和传出数据的运输工具。Ca

2021-08-29 18:26:49 182

原创 阿里云分片上传

阿里云分片上传

2021-08-29 11:00:15 1120

原创 Netty学习一:什么是Netty

工作数年还是对Netty还是知之甚少,虽然以前有过短暂的使用但未曾去做过了解,所以准备深入了解下Netty。从了解、使用到深入,逐步学习,先从了解开始。Netty 是一个利用 Java 的高级网络的能力,隐藏了Java背后的复杂性然后提供了一个易于使用的 API 的客户端/服务器框架。socket在网络发展初期,需要花很多时间来学习socket的复杂,寻址等等,在socket库上进行编码,并需要在不同的操作系统上做不同的处理。如图:这些早期的 Java API(java.net)只能通过原生的 s

2021-08-22 18:37:05 78

原创 Java中的值传递

我们都知道,在Java 中定义方法的时候是可以定义参数的。比如Java 中的main 方法,public static void main(String[] args),这里面的args 就是参数。参数在程序语言中分为形式参数和实际参数。形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。public static void main

2021-08-22 10:10:03 72

原创 DDD入门一:什么是DDD?

DDD(Domain-Driven Design 领域驱动设计)是由Eric Evans最先提出,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题。整个过程大概是这样的,开发团队和领域专家一起通过 通用语言(Ubiquitous Language)去理解和消化领域知识,从领域知识中提取和划分为一个一个的子领域(核心子域,通用子域,支撑子域),并在子领域上建立模型,再重复以上步骤,这样周而复始,构建出一套符合当前领域的模型。领域驱动设计的经典分层架构如下:用户界面/展现层

2021-08-15 18:35:42 911

原创 AOP获取方法返回值

我们用Spring的AOP切面做日志收集或者记录的时候,在springboot中用@Aspect注解。比如:@Aspectpublic class AdviceTest { @Before("execution(* com.abc.service.*.many*(..))") public void permissionCheck(JoinPoint point) { System.out.println("@Before:模拟权限检查..."); Sy

2021-08-14 16:06:13 10641

JAVA在线考试系统

完整的在线考试系统,JSP+SQL Server 2005写的,包括源代码,数据库文件,论文,开题报告等,资料全面……

2012-06-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除