Java
文章平均质量分 63
Java 知识
狂奔的小棕棕
这个作者很懒,什么都没留下…
展开
-
JAVA之MAC详解以及子线程MDC传递
MDC(Mapped Diagnostic Context)是用于分布式系统中跟踪和诊断日志的重要概念。是一个在Java项目中用于日志跟踪的工具,它允许你在多线程环境下关联和传递特定的上下文信息。MDC是一个线程本地的、可维护的、可传递的上下文环境。在Java中,MDC主要用于在应用程序的不同组件之间传递日志上下文信息,例如用户会话ID,请求ID,用户身份信息等。MDC让你可以将这些信息关联到特定的日志事件中,以便后续的日志处理器(如日志输出器)能够在日志中显示或处理这些信息。原创 2024-08-23 10:31:47 · 466 阅读 · 0 评论 -
MapStruct 实体类转换工具,看这一篇就够了!
在一个成熟的工程中,尤其是现在的分布式系统中,应用与应用之间,还有单独的应用细分模块之后,DO 一般不会让外部依赖,这时候需要在提供对外接口的模块里放 DTO 用于对象传输,也即是 DO 对象对内,DTO对象对外,DTO 可以根据业务需要变更(只需部分字段或字段名不同等),并不需要映射 DO 的全部属性。这种 对象与对象之间的互相转换,就需要有一个专门用来解决转换问题的工具,毕竟每一个字段都 get/set 会很麻烦。MapStruct 就是这样的一个属性映射工具,只需要定义一个 Mapper 接口转载 2024-08-16 10:05:31 · 1010 阅读 · 0 评论 -
Java的Duration类:掌握时间间隔的魔法
在Java编程中,处理时间间隔是一项常见任务。Java 8引入了Duration类,提供了方便的方法来处理和计算时间间隔。本文将介绍Duration类的定义、常见用法以及与其他时间类的比较。原创 2024-08-07 14:46:24 · 986 阅读 · 0 评论 -
Java LocalDateTime 的常用方法总结
/ 自定义格式化:System.out.println("自定义格式dtf1: " + dtf1.format(LocalDateTime.now()));//自定义格式dtf1: 2024/08/05 17:19:50System.out.println("自定义格式dtf2: " + dtf2.format(LocalDateTime.now()));//自定义格式dtf2: 2024.08.05 17:19:50。原创 2024-08-05 17:26:17 · 453 阅读 · 0 评论 -
Java各类日期和时间转换超强总结(Date和LocalDateTime相互转换等)
大家在开发过程中必不可少得和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转换!从 Java1 到 Java8 将近 20 年,再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时间 API 之间切换,并行使用!!!每次写完就忘记了,小编专门来整理一篇来详细说一下他们转换的方法,方便后面使用!!原创 2024-08-03 17:44:51 · 1247 阅读 · 0 评论 -
Spring资源拷贝至系统目录及文件压缩解压处理
Spring资源拷贝至系统目录及文件压缩解压处理原创 2023-03-07 15:44:33 · 327 阅读 · 0 评论 -
lombok @Data 注解
lombok 注解原创 2022-10-19 10:50:33 · 613 阅读 · 0 评论 -
Java正则表达式以及Pattern和Matcher类详解
概述正则表达式一、概述用来描述或者匹配一系列符合某个语句规则的字符串二、单个符号1、英文句点.符号:匹配单个任意字符。表达式t.o可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。2、中括号[]:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。表达式:t[abcd]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。3、| 符号。相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。表达式:t(a|b原创 2022-04-22 17:20:31 · 1081 阅读 · 0 评论 -
【Java】 数组转 List 的三种方式及对比
本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。一、 (最高效) 通过集合工具类Collections.addAll()方法,支持增删改查等方法通过Collections.addAll(arrayList, strArray)方式转换,根据数组的长度创建一个长度相同的List,然后通过Collections.addAll()方法,将数组中的元素添加到List中,这是最高效的方法。使用场景:需要在将数组转换为List后,对List进行增删改原创 2021-08-12 16:12:34 · 821 阅读 · 0 评论 -
线程的 run() 和 start() 的区别
线程的 run() 和 start() 有什么区别?调用 start() 方法是用来启动线程的,轮到该线程执行时,会自动调用 run();直接调用 run() 方法,无法达到启动多线程的目的,相当于主线程线性执行 Thread 对象的 run() 方法。一个线程对线的 start() 方法只能调用一次,多次调用会抛出 java.lang.IllegalThreadStateException 异常;run() 方法没有限制。总结: run() 方法相当于启动Thread类里面的一个普通方法, sta原创 2021-06-10 15:14:11 · 398 阅读 · 0 评论 -
java枚举比较使用equals还是==
建议使用==。避免NPE能正常工作更快运行时是安全的编译期也是安全的其实二者皆可以,没有任何问题。我们查看 Enum.java 中 equals 方法的源码,可以看到其也是使用 == 来实现。public final boolean equals(Object other) { return this==other;}额外答案能在枚举中使用 == 进行判断?答案是肯定的,因为枚举有着严格的实例化控制,所以你可以用 == 去做比较符,这个用法,在官方文档中也有明确的说明。原创 2021-06-08 15:49:06 · 2486 阅读 · 0 评论 -
JPA 中的 nativeQuery = true
在 JPA 的 @Query 注解中有个属性 nativeQuery其默认值是false。package org.springframework.data.jpa.repository;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPol原创 2021-06-03 20:25:09 · 3024 阅读 · 0 评论 -
Spring 注解
这里写自定义目录标题Spring 注解@ConditionalOnPropertySpring 注解@ConditionalOnProperty@ConditionalOnProperty的作用是判断一个Property属性,是否符合我们的条件,符合则让该注解修饰的类或者方法生效,否则不生效。我们在Spring Boot中可以通过@ConditionalOnProperty来控制Configuration配置类是否生效。ConditionalOnProperty注解的源码。@Retention(原创 2021-04-19 15:49:32 · 191 阅读 · 1 评论 -
Mock 及 Mockito 教程
Mockito 教程Mockito框架官方地址mockito,文档地址,中文版文档。Mockito库能够Mock对象、验证结果以及打桩(stubbing)。1. Mock和Mockito的关系在软件开发中提及mock,通常理解为模拟对象。为什么需要模拟? 在我们一开始学编程时,我们所写的对象通常都是独立的,并不依赖其他的类,也不会操作别的类。但实际上,软件中是充满依赖关系的,比如我们会基于service类写操作类,而service类又是基于数据访问类(DAO)的,依次下去,形成复杂的依赖关系。单原创 2021-04-14 17:08:13 · 7185 阅读 · 0 评论 -
Java知识体系最强总结(2020版)
Java知识体系最强总结(2020版)原创 2021-04-12 11:49:44 · 185 阅读 · 0 评论 -
Mac查看端口占用情况
终端命令的方式查看端口情况1.查看端口被哪个程序占用 sudo lsof -i tcp:port如: sudo lsof -i tcp:80822.看到进程的PID,可以将进程杀死。 sudo kill -9 PID 如:sudo kill -9 3210原创 2021-04-08 11:47:58 · 5215 阅读 · 0 评论 -
Optional的理解与使用
从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。我们从一个简单的用例开始。在 Java 8 之前,任何访问对象方法或属性原创 2020-10-20 17:02:23 · 2014 阅读 · 0 评论 -
Spring Data Rest 指南
Spring Data Rest一.Restful简介REST是一种Web软件结构风格,而不是一种标准,匹配或兼容这种架构风格称之为REST服务,REST服务简洁并且有层次,REST通常基于HTTP,URI和XML以及HTML这些现有的广泛流行的协议和标准,在REST中,资源是由URI来指定的,对资源的增删改查也是通过HTTP协议提供的POST,PUT,GET,DELETE等方法实现,使用REST可以更高效率的利用缓存来提高响应速度,同时REST中的通信会话状态有客户端来维护,这可以让不同服务器来处理一原创 2020-10-10 18:18:20 · 2608 阅读 · 1 评论 -
jackson @JsonIgnoreProperties与@JsonIgnore基本使用
问题由来:springboot项目中定义了很多类,我们在rest返回中直接返回或者在返回对象中使用这些类,spring已经使用jackson自动帮我们完成这些的to json。但是有时候自动转的json内容太多,或者格式不符合我们的期望,因此需要调整类的to json过程,或者说希望自定义类的json过程。解决办法:使用@JsonIgnoreProperties、@JsonIgnore、@JsonFormat。@JsonIgnore注解用来忽略某些字段,可以用在变量或者Getter方法上,用在Set转载 2020-09-14 10:28:45 · 773 阅读 · 1 评论 -
算法(冒泡排序、插入排序、选择排序、快速排序、二分查找)
二分法查找package algorithm;/** * @Description: 二分查找 * @author: zpli * @Date: 2020/6/1 9:30 */public class BinarySearch { public static void main(String[] args) { int[] arr = new int[]{1, 2, 3, 3, 5, 7, 8, 9}; int digest = 4;原创 2020-06-02 10:49:39 · 242 阅读 · 0 评论 -
Java 网络编程 之 socket 的用法与实现
Java 网络编程 之 socket 的用法与实现一、概念TCPTCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 另一个重要的传输协议。在因特网协议族(Internet pro...原创 2020-04-16 11:11:17 · 265 阅读 · 0 评论 -
try catch finally的执行顺序
结论:1、不管有没有出现异常,finally块中代码都会执行;2、当try和catch中有return时,finally仍然会执行;3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;4、finally中最好不...原创 2020-04-09 13:38:00 · 265 阅读 · 2 评论 -
JAVA实现AES加密
1. 因子上次介绍了《JAVA实现DES加密》,中间提到近些年DES使用越来越少,原因就在于其使用56位密钥,比较容易被破解,近些年来逐渐被AES替代,AES已经变成目前对称加密中最流行算法之一;AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据。本文就简单介绍如何通过JAVA实现AES加密。2.JAVA 实现package org.zpli.java8.safe...原创 2020-04-02 16:50:06 · 479 阅读 · 0 评论 -
JAVA实现DES加密
DES加密介绍DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现。JAVA实现package org.zpli.j...原创 2020-04-02 16:41:20 · 3490 阅读 · 2 评论 -
大佬博客推荐
My Sunshine https://blog.wuwii.com/Edison Zhou https://www.cnblogs.com/edisonchou/category/625054.html十三 https://www.cnblogs.com/han-1034683568/p/6634711.html#blogTitle4五月的仓颉 https://www.cnblogs.c...原创 2020-03-27 14:27:11 · 300 阅读 · 0 评论 -
JVM进阶(三) 内存分配与回收策略
虚拟机中的堆分为年轻代和年老代。永久代是非堆内存,它又叫做方法区(一般的说法),主要存储已被加载的类信息、常量、静态变量。而该区域在java8已被删除,取而代之的是元空间。堆是整个Java内存模型中占用最大的一部分,而且不是连续的。当有需要分配内存的时候,一般有两个方法分:指针碰撞和空闲列表。该部分的内存回收是由虚拟机的垃圾收集器GC进行管理的。 堆是存放对象以及数组的...原创 2020-03-26 18:34:16 · 164 阅读 · 0 评论 -
JVM进阶(二) JAVA堆
User user = new User();对象的引用存放在栈中,对象存放在堆中。堆的存储结构和栈是不同的,堆在内存中并不是一块连续的区域,它是分散的(物理上是分散,但逻辑上是连续的,大家好好体会一下);虚拟机通过栈中引用的指引在堆中找到所需要的对象。 在虚拟机遇到一条new的指令的时候,经过一系列的操作过后虚拟机就要为该新生对象分配内存空间了,那么问题来了,这么散,虚拟机要怎么知道如...原创 2020-03-26 18:06:26 · 145 阅读 · 0 评论 -
JVM进阶(一) 初识JAVA栈
Java栈是我们最常用的内存区域,线程私有。它主要用来存放基本类型变量、局部变量以及对象的引用。例如:User user = new User(),这里的 user 就是对象对象的引用也可以理解为地址,指引着虚拟机要去哪里找 user 这个对象。它们的基本关系如图:由图可知,当我们将一个对象作为方法的参数时,我们在方法中改变对象的值,也会影响到原来的对象的值,因为我们只是改变了图中内存区域的...原创 2020-03-26 17:46:22 · 172 阅读 · 0 评论 -
JVM的GC日志查看
JVM的GC日志的主要参数包括如下几个:-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAt...原创 2020-03-25 10:10:37 · 401 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”05之 线程池原理(四)
拒绝策略介绍线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施。当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭。第二,任务数量超过线程池的最大限制。线程池共包括4种拒绝策略,它们分别是:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy和DiscardPolicy。AbortPolicy ...转载 2020-03-24 17:04:32 · 131 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”04之 线程池原理(三)
线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。线程池也有5种状态;然而,线程池不同于线程,线程池的5种状态是:Running, SHUTDOWN, STOP, TIDYING, TERMINATED。线程池状态定义代码如下:private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));pri...转载 2020-03-24 16:56:52 · 172 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”03之 线程池原理(二)
线程池示例在分析线程池之前,先看一个简单的线程池示例。import java.util.concurrent.Executors;import java.util.concurrent.ExecutorService;public class ThreadPoolDemo1 { public static void main(String[] args) { /...转载 2020-03-24 16:50:56 · 529 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”02之 线程池原理(一)
ThreadPoolExecutor简介ThreadPoolExecutor是线程池类。对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合。线程池允许若个线程同时允许,允许同时运行的线程数量就是线程池的容量;当添加的到线程池中的线程超过它的容量时,会有一部分线程阻塞等待。线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理。"ThreadPoolExecutor数...转载 2020-03-24 16:34:22 · 193 阅读 · 0 评论 -
线程池架构
1. Executor它是"执行者"接口,它是来执行任务的。准确的说,Executor提供了execute()接口来执行已提交的 Runnable 任务的对象。Executor存在的目的是提供一种将"任务提交"与"任务如何运行"分离开来的机制。它只包含一个函数接口:void execute(Runnable command)2. ExecutorServiceExecutorServ...转载 2020-03-24 16:24:46 · 207 阅读 · 0 评论 -
Java虚拟机(JVM)
Java虚拟机在运行程序时会把其自动管理的内存划分为5个区域,每个区域都有各自的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有数据区域。JVM堆(Java Heap):Java 堆属于线程共享的内存区域,它在虚拟机启动时创建,是Java 虚拟机所管理的内存中最大的一块,主要用于存放对象实例,几乎所有的对象实例都在这里分配内存,注意Ja...原创 2020-03-20 11:58:26 · 123 阅读 · 0 评论 -
java8中的Stream
Stream(流)Stream 是 Java API 的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,你可以把它们看成遍历数据集的高级迭代器。Java8 中的 Stream API 主要有以下两个优点:代码是以声明性方式编写的,这样看起来更加简洁、易读。这种方式下我们只需要表达我们想要达到什么目标(比如提取、过滤、排序、遍历)而不是详细...原创 2020-03-19 16:47:13 · 450 阅读 · 5 评论 -
Java回调机制
什么回调?维基百科是这样解释的:回调是一段可执行的代码通过参数传递给别一段代码,以期望在一个合适的时间调用这个参数(可执行的代码)。回调的作用避免重复代码在你需要更多的通用功能的地方更好地实现抽象(可处理各种类型的对象和变量)增强代码的可维护性增强代码的可读性有更多定制的功能以“八仙过海”彰显回调之精髓package org.zpli.java8.callback;/**...原创 2020-03-19 15:58:31 · 163 阅读 · 0 评论 -
重写和重载的异同
重写(覆盖)的规则:1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。3、重写的方法的返回值必须和被重写的方法的返回一致或者兼容;4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;5、被重写...原创 2019-02-12 17:06:37 · 1857 阅读 · 0 评论 -
SpringMVC请求流程详解
具体步骤:第一步:用户发起请求到前端控制器(DispatcherServlet)第二步:前端控制器(DispatcherServlet)接收到用户请求后调用处理器映射器(HandlerMapping)第三步:处理器映射器(HandlerMapping)将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象,也就是Controller层,多个Hand...原创 2019-02-12 17:49:54 · 243 阅读 · 1 评论 -
java多线程
Java多线程学习(总结很详细!!!)此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的线程函数用法、概述等。首先让我们来了解下在操作系统中进程和线程的区别:进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会...转载 2019-01-31 16:22:08 · 136 阅读 · 0 评论