![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 66
长安明月
这个作者很懒,什么都没留下…
展开
-
Java 如何快速将一个对象的空值属性置为空字符串?
在一些场景,例如 mybatis 的数据插入时,对象属性不能为 null。如果对象属性存在 null 的情况,可以先将空值属性置为空字符串。在 Java 中,可以使用反射来快速将一个对象的空值属性置为空字符串。原创 2024-01-02 16:30:45 · 1411 阅读 · 1 评论 -
图片文件和 Base64 字符串互转(Java 实现)
项目中,有些场景下,客户端需要将本地图片传输到服务方存储,此时客户端可以将图片文件转为 Base64 字符串传输到服务方,服务方收到后再将 Base64 字符串还原为图片。以下是一些图片文件和 Base64 字符串互转的工具类,以及校验图片大小的工具。原创 2023-11-09 10:39:43 · 2735 阅读 · 0 评论 -
MyBatis foreach 标签常用方法总结
在 MyBatis 中,常常会遇到集合类型的参数,虽然我们可以通过 OGNL 表达式来访问集合的某一个元素,但是 OGNL 表达式无法遍历集合。foreach 标签就是专门用来解决这类问题的,foreach 标签可以用来遍历数组、列表和 Map 等集合参数,实现批量操作或一些简单 SQL 操作。 foreach 元素的属性主要有 item,index,open,separator,close,collection。各属性含义如下所示。 集合中元素迭代时的别名,该参数为必选。 在 list 和数组中原创 2022-12-06 14:48:09 · 16473 阅读 · 0 评论 -
Java BigDecimal 类的创建对象方法以及常用的加减乘除、设置精度方法
因为计算机无法精确表示浮点数,所以在进行数字运算时,如果有 double 或 float 类型的浮点数参与计算,容易出现计算不准确的情况。在一些对精度要求很高的系统中,需要使用 BigDecimal 类来进行精确运行。原创 2022-12-01 17:13:13 · 3656 阅读 · 0 评论 -
Java List 按指定条件排序的几种方式
在 Java 项目中,可能会遇到给出一些条件,将 List 元素按照给定条件进行排序的情况。如下述场景。原创 2022-11-30 10:40:46 · 10199 阅读 · 0 评论 -
SpringBoot 如何使用 @Value 给静态变量注入 application.properties 中的属性值
如果在项目中的 application.properties 配置了某个属性(假如属性名为 test.key),我们可以在 controller 层和 service 层使用 @Value 标签获取属性值,如下代码所示。但是,如果项目中需要给静态变量注入配置文件中的属性值的话(也就是,给 static 修饰的变量做 @Value 注入),发现变量值为 null。也可以在一个 Java 文件中,打上 @Component 标签,再使用上述 @Value 标签,同样可以获取到配置文件中的属性值。原创 2022-09-20 16:27:44 · 842 阅读 · 0 评论 -
MyBatis 查询 MySQL 实现返回 List<Map> 或 Map 类型数据操作
MyBatis 查询 MySQL 数据库,返回结果可以是具体的类、Map、List 等等。将查询结果返回 Map 类型的优点是,不需要为本次查询额外创建类。如果只查询某几个特定的列,且不想额外创建类的话,就可以将结果返回 Map 或 List。如果能明确查询结果只有一条记录时,返回 Map;如果查询结果可能有多条记录,返回 List。实现方式较为简单,只要在 DAO 层 XML 文件中,设定 resultType 而不设定 resultMap 就可以了。详见下文示例。原创 2022-09-09 10:50:03 · 24745 阅读 · 4 评论 -
java.security.NoSuchAlgorithmException: SHA256WithRSAandMGF1 Signature not available
SHA256WithRSAandMGF1 是 BC Provider 提供的一个签名算法,而 JDK 1.8 的 java.security.* 包中并没有这个 Provider。运行如下代码,可以打印 JDK 中的 Provider 列表,以及所有签名算法。可以看到,BC Provider 已经被添加到列表中,且 SHA256WithRSAandMGF1 算法也在支持的签名算法列表中。再次运行签名方法,异常问题已经被修复,能正确对数据进行签名。笔者在做 RSA 签名时,遇到了一个异常,详见下文。...原创 2022-08-04 14:48:13 · 6479 阅读 · 0 评论 -
Java 使用 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING 算法解密
Java 实现 RSA 解密(算法模式为 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING),代码如下。原创 2022-08-04 11:16:01 · 2898 阅读 · 1 评论 -
java.security 框架之签名、加密、摘要及证书
单向加密是不可逆的,MD5、SHA、MAC 都是单向加密算法,也称之为摘要算法。MD5、SHA 会根据明文用哈希算法计算一个固定长度的摘要(哈希值),然后把明文和摘要发送给接收者,接收者根据同样的算法计算出摘要,对比两个摘要是否一样即可验证明文的正确性。它的应用场景是防止报文被篡改和校验数据。MD5、SHA 等算法是开源的,容易被试探出来。有没有更安全的摘要算法呢?HMAC(带密钥的哈希函数),用一个密钥和一个明文消息作为输入,生成一个消息摘要。.........原创 2022-08-03 16:57:59 · 1969 阅读 · 0 评论 -
RSA 加解密(Java 实现)
RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。原创 2022-08-03 16:18:34 · 30481 阅读 · 7 评论 -
Java 注解(Annotation)
Java 注解,也叫元数据,又称 Java 标注,即一种描述数据的数据。注解是 JDK1.5 版本开始引入的一种注释机制,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 注解可分为三类: Java 自带的标准注解,也叫内置注解,在 java.lang 包下(随着 JDK 版本的升级,Java 开原创 2022-07-07 15:22:13 · 910 阅读 · 0 评论 -
Java 如何实现 List<String> 的深拷贝?
对于 List 的深拷贝,Java 有几种方法可以实现,分述如下。1.2 利用构造器,使用 List 实现类的构造方法 复制一个 List 的简单方法,是使用以一个集合作为参数的构造函数。1.3 使用 list.addAll() 方法1.4 使用 java.util.Collections.copy() 方法 Collections 类有多种返回集合的静态方法,其中一个是 copy() 方法,它需要一个源列表和一个至少和源列表一样长的目标列表。该方法将源列表中的所有元素复........原创 2022-06-27 18:02:54 · 9869 阅读 · 1 评论 -
Java 打印对象的地址
Java 获取不到对象的地址,但是可以获取对象的 hashcode,对象的 hashcode 在某种意义上就相当于对象的地址,hashCode 是用来在散列存储结构中确定对象的存储地址的。 Object 的 hashCode() 默认是返回对象的哈希码,可以反应对象的内存地址,但是 hashCode() 可以重写,所以 hashCode() 不能绝对反应对象的内存地址。 java.lang.System 类的方法 identityHashCode() 可以返回对象的哈希码(在一定程度上反应出对象原创 2022-06-27 14:19:46 · 6195 阅读 · 0 评论 -
Java 如何复制 List ?
List 复制在项目开发时,使用到的频率还是比较高的。List 复制有浅拷贝和深拷贝两种方式。在陈述复制方法前,先总结下什么是浅拷贝和深拷贝(以下内容均站在 Java 语言基础上进行讨论)。浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。深拷贝会创造一个一模一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对象。假设 B 复制了 A,当修改 A 时,看 B 是否会发生变化。如果 B 也跟着变了,说明这是浅拷贝,如果 B 没变,那就是深拷贝。对于数据类型是基本数据类型(整型原创 2022-06-27 13:00:48 · 37188 阅读 · 5 评论 -
Java List<Integer> 转为 int[] 的几种方法
Java List 转为 int[] 的几种方法原创 2022-06-21 10:10:28 · 6228 阅读 · 0 评论 -
Java 几种方法初始化 Set
Java 几种方法初始化 Set原创 2022-06-13 17:40:26 · 17244 阅读 · 0 评论 -
有了 HTTP,为什么还要 RPC?
有了HTTP,为什么还要RPC?转载 2022-06-10 15:05:03 · 535 阅读 · 0 评论 -
辗转相除法求最大公约数的原理及 Java 实现
一、什么是辗转相除法? 辗转相除法可以求得两个数的最大公约数。辗转相除法又称欧几里得算法,用于计算两个非负整数 a,b 的最大公约数。应用领域有数学和计算机等,计算公式 gcd(a, b) = gcd(b, a mod b)。二、举例说明计算过程 假如需要求 100 和 18 这两个正整数的最大公约数,用欧几里得算法,计算过程是这样的:100 / 18 = 5 (余 10)18 / 10= 1 (余 8)10 / 8 = 1 (余 2)8 / 2 = 4 (余 0)至此,最大公约数为 2原创 2022-05-20 11:11:37 · 3167 阅读 · 0 评论 -
SpringBoot 项目启动时设置 http 代理
SpringBoot 项目启动时设置 http 代理原创 2022-04-26 14:37:46 · 5372 阅读 · 0 评论 -
常用 ASCII 码整理
一、ASCII 码简介 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一套基于拉丁字母的字符编码,共收录了 128 个字符,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,它等同于国际标准 ISO/IEC 646。ASCII 规范于 1967 年第一次发布,最后一次更新是在 1986 年。 ASCII 编码范围 0x00-0x7F,即十进制的 0-127,定义了 128 个字符。它包含了 33原创 2022-04-14 19:00:16 · 6525 阅读 · 0 评论 -
Java 延迟队列 DelayQueue 的原理
一、什么是延迟队列(DelayQueue)?DelayQueue 是 Java 并发包 java.util.concurrent 下的一个 Class,其官方定义如下所示。 /** * An unbounded {@linkplain BlockingQueue blocking queue} of * {@code Delayed} elements, in which an element can only be taken * when it原创 2022-04-09 21:33:55 · 12372 阅读 · 1 评论 -
Java 遍历 Map 的几种方式
在 Java 中遍历 Map 有多种方法,既然 Java 中的所有 map 都实现了 Map 接口,以下方法适用于任何 map 实现(HashMap,TreeMap,LinkedHashMap,Hashtable 等等)。一、遍历 Map 的几种方法在 for 循环中使用 entrySet 遍历 key 和 value,在键和值都需要时使用(最常用)。在 for 循环中使用 keySet 或 values 遍历 map 中的 key 或者 value,一般适用于只需要 map 中的 key 或者原创 2021-06-11 11:36:49 · 1329 阅读 · 1 评论 -
Java 实现 Set<Integer> 转 int[]
Java 有多种实现 Set<Integer> 转 int[] 的方法,示例如下所示。一、Iterator 迭代器遍历 Set,转为数组package com.example.demo.test;import java.util.Arrays;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class Test { public static void m原创 2021-05-21 10:29:07 · 5411 阅读 · 0 评论 -
Java 遍历 Set 集合的方法,以及如何遍历删除 Set 集合中的元素?
Java 遍历 Set 有多种方式,如下示例所示。一、Iterator 迭代器遍历package com.example.demo.test;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class Test { public static void main(String[] args) { Set<Integer> set = new原创 2021-05-21 09:44:36 · 4715 阅读 · 0 评论 -
Java BigDecimal 的舍入模式(RoundingMode)详解
BigDecimal 有 8 种 RoundingMode(舍入模式),分别总结如下。一、RoundingMode 详解ROUND_UP进位制:不管保留数字后面是大是小 (0 除外) 都会进 1。结果会向原点的反方向对齐,正数向正无穷方向对齐,负数向负无穷方向对齐。BigDecimal a = new BigDecimal("0.098").setScale(2, BigDecimal.ROUND_UP); // 0.10BigDecimal b = new BigDecimal("0.0原创 2021-05-10 18:25:52 · 54339 阅读 · 1 评论 -
Linux 手动安装 JDK 的方法
Java 应用及一些开源组件都依赖于 JDK,所以很多情况下都需要在 Linux 系统下安装 JDK。安装 JDK 有多种方法,yum 方式安装和手动安装都可以,yum 方式安装步骤详见《Linux yum 安装 JDK 的方法》,本文简单总结记录下手动安装 JDK 的步骤。一、下载 JDK 安装包,并上传到服务器指定路径 到官网 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html原创 2021-02-24 16:58:17 · 1954 阅读 · 0 评论 -
如何查看 jvm(Java 虚拟机) 采用的是什么垃圾回收算法?
Linux 系统下,如何查看 Java 虚拟机采用的是哪种垃圾回收算法?方法比较简单,语句如下:[testuser@vmtest]$ java -XX:+PrintCommandLineFlags -version-XX:InitialHeapSize=128150272 -XX:MaxHeapSize=2050404352 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+U原创 2021-02-24 14:10:10 · 1316 阅读 · 0 评论 -
Linux yum 安装 JDK 的方法
Java 应用及一些开源组件都依赖于 JDK,所以很多情况下都需要在 Linux 系统下安装 JDK。安装 JDK 有多种方法,yum 方式安装和手动安装都可以,本文简单总结记录下 yum 方式安装 JDK 的步骤。一、查询要安装 JDK 的版本[root@vmtest ~]# yum -y list java*Loaded plugins: fastestmirror, langpacksDetermining fastest mirrorsbase原创 2021-02-24 13:54:25 · 14620 阅读 · 6 评论 -
Java 将文本文件压缩为 .tar.gz 并实现.tar.gz 文件的解压
Java 将文本文件压缩为 .tar.gz 并实现.tar.gz 文件的解压,需要引入如下依赖包。 <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.10.5</version> </dependency> <dependency> <原创 2021-01-15 16:35:48 · 2003 阅读 · 0 评论 -
Java 将文件打成 tar 包
Java 将文件打成 tar 包,需要引用如下依赖包。 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.apache原创 2021-01-14 14:07:08 · 2781 阅读 · 0 评论 -
Java 实现 SFTP 文件上传、下载、删除等功能
Java 实现 SFTP 文件上传、下载、删除等功能,在项目中需要引入如下所示依赖包。 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.49</version> </dependency> 工具类中因为使用了 @Slf4j 标签来打印日志,需要引入如下依赖原创 2021-01-14 13:44:09 · 1144 阅读 · 1 评论 -
Java 实现向文件追加内容(将内容写入文件)
Java 项目中有时会采用文本文件记录一些任务执行结果,后续通过获取文件中的任务执行结果值来判断任务是否已经被成功完成。此时就需要实现向文件中追加内容,即,将内容写入文件。实现代码如下所示。package com.test.utils;import lombok.extern.slf4j.Slf4j;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.O原创 2021-01-13 14:33:28 · 12125 阅读 · 0 评论 -
常用的 Linux curl 发送 http 命令总结
在日常 Java 接口测试中,Postman 图形界面工具较为常用,但是 Postman 非常耗费内存,经常打开 Postman 后,开发者的电脑就经常卡顿。 curl 是常用的命令行工具,它的功能非常强大,命令行参数多达几十种,它的名字就是客户端(client)的 URL 工具的意思。curl 命令如果熟练的话,完全可以取代 Postman 来进行接口测试。 curl 命令全部参数,参见 《curl [options…] <url> options 选项整理》,本文简单总结下常用的一些参数的意原创 2020-09-18 11:08:27 · 789 阅读 · 0 评论 -
RPC 接口调用时,Hessian 不能正确传输 BigDecimal 的解决方法
在使用公司自研的 RPC 框架(框架基于 hessian 协议进行序列化)做项目时,RPC 接口定义的传输数据包含 BigDecimal 类型的数据,经测试发现,传输参数 158.00 经传输后,得到的数值却为 0.00,不能正确传输。其中项目引用的 hessian 依赖版本如下所示。 <dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId&原创 2020-09-01 16:28:09 · 920 阅读 · 0 评论 -
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(
SpringBoot 使用 jasypt 加密数据库连接用户名和密码时(具体用法详见 https://blog.csdn.net/piaoranyuji/article/details/91599116),生成加密后的用户名和密码的单元测试类如下所示。package up.sm.test;import org.jasypt.encryption.StringEncryptor;import org.junit.Test;import org.junit.runner.RunWith;impo原创 2020-08-19 14:15:35 · 1375 阅读 · 0 评论 -
Java 计算 2 个集合(List<String>)的差集
问题描述:有一个大表集合 A 和一个小表集合 B,需要找出这两个集合之间的差集,即在 A 中存在但在 B 中不存在的集合。解决思路:将小表集合 B 转成一个 HashSet;遍历大表全量数据,判断元素在 HashSet 中是否存在,如果不存在,就放到一个临时 List 中;最后将临时 List 返回。算法实现:package com.test;import java.util.ArrayList;import java.util.HashSet;import java.util.L原创 2020-08-13 15:26:35 · 4108 阅读 · 0 评论 -
以“分”为单位的整数,转化为以“元”为单位的小数(Long -> double -> String)
诉求:项目中有一个 Long 类型的整数,含义是以"分"为单位的价格,需要将其转化为以"元"为单位的字符串,且格式为 “0.00”,即保留 2 位小数,且不丢失精度。 实现过程:Long 转为 double,再用 DecimalFormat 约定格式,将 double 转为 String,代码过程如下所示。package com.test;import java.text.DecimalFormat;public class Test { public static void m原创 2020-08-11 17:39:44 · 1309 阅读 · 0 评论 -
Java8 Stream 按单一属性和多个属性实现集合分组
项目中已经通过处理逻辑获得了一个列表,后续需要根据列表的一个属性或多个属性对其分组,可以采用 Java8 的 Stream 实现。 举例说明如下,创建一个 Java Class,名为 Student,其有四个属性,分别是:学号(stuNo)、姓名(stuNm)、年龄(age)、性别(sex)。现有一个学生列表,分别根据年龄(单一属性)、年龄和性别(多属性)进行分组。 Student 类定义如下:package com.test.model;import lombok.Getter;@G原创 2020-08-10 13:55:37 · 13607 阅读 · 2 评论 -
Lombok 的 @Data 注解为 Java 类自动生成 equals() 和 hashCode() 方法
Java 自定义对象作为 Map 的 key 时,需重写 equals() 和 hashCode() 方法。 IDEA 可以快速为 Java Class 重写 equals() 和 hashCode() 方法。 Lombok 的 @Data 注解可以为 Java 类自动生成 equals() 和 hashCode() 方法,使用 @Data 注解会自动添加以下注解:@Getter@Setter@RequiredArgsConstructor@ToString@EqualsAndHas原创 2020-08-06 17:03:12 · 6224 阅读 · 0 评论