java知识
文章平均质量分 66
java方面相关知识。
LiZhen798
软件研发工程师
语言:Java,Go
展开
-
Lombok的hashCode方法
在继承关系中,父类的hashCode针对父类的所有属性进行运算,而子类的hashCode却只是针对子类才有的属性进行运算,立此贴提醒自己。callSuper = false,根据子类自身的字段值 来生成hashcode, 当两个子类对象比较时,只有子类对象的本身的字段值相同,父类字段值可以不同,callSuper = true,根据子类自身的字段值和从父类继承的字段值 来生成hashcode,当两个子。比较时,只有子类对象的本身的字段值和继承父类的字段值都相同,equals方法的返回值是true。原创 2024-06-27 15:25:28 · 657 阅读 · 0 评论 -
springboot项目yml文件中${}的使用
如果启动项目是传入了SERVER_PORT值时,会优先使用传入的值作为端口号启动项目,如果没有传该环境变量的值时,就使用9600作为项目端口号;可以看到虽然配置文件中虽然还是9600,但是项目启动的端口号是使用刚才配置的9601来启动的;项目启动时可以灵活的通过修改环境变量来替换配置中的值,如果没有传该环境变量时,就是用默认值;可以看到使用的默认值9600端口启动的项目;到此就将端口号换成了9601了,来看看效果。在idea中修改环境变量。没有进行环境变量配置。原创 2024-03-21 11:31:42 · 1281 阅读 · 0 评论 -
fastJson中JSONObject.toString(),JSONString.toJSONString()有啥不一样
toString()会调用toJSONString(),因此可以近似认为两者一样,使用的时候更加自信一点,不用疑惑。原创 2023-05-08 14:40:46 · 1489 阅读 · 0 评论 -
FastJson序列化时过滤字段(属性)的方法总结
通过实现PropertyFilter接口的apply方法,来实现过滤属性,方法参数name即为字段的key,参数value即为字段的value,这种方式最强大,因为可以自定义具体过滤规则。在转JSON的时候,带上过滤器参数即可。的方式来包含指定的字段。在实体字段前面,使用transient关键字,表示该字段不参与序列化,转JSON字符串时就可以忽略掉该字段。FastJson序列化时(即转成JSON字符串时),可以过滤掉部分字段,或者只保留部分字段,方法有很多,下面举一些常用的方法。如果是JAVA8的话。原创 2023-03-28 10:47:59 · 5748 阅读 · 0 评论 -
lock()与lockInterruptibly()
另一种是线程被唤醒后检测到中断请求,则立即抛出中断异常,该操作导致方法结束。结论:ReentrantLock的中断和非中断加锁模式的区别在于:线程尝试获取锁操作失败后,在等待过程中,如果该线程被其他线程中断了,它是如何响应中断请求的。如果要求被中断线程不能参与锁的竞争操作,则此时应该使用lockInterruptibly方法,一旦检测到中断请求,立即返回不再参与锁的竞争并且取消锁获取操作。lock获取锁过程中,忽略了中断,在成功获取锁之后,再根据中断标识处理中断,即selfInterrupt中断自己。原创 2023-03-16 14:29:39 · 327 阅读 · 0 评论 -
shutdown、shutdownNow方法的理解
1、当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。...原创 2022-08-17 14:33:08 · 1792 阅读 · 0 评论 -
Java 中Duplicate key 异常
我这里使用的是两个key 相同时,保留先存进去的那个元素。相比第一个方法,主要就是我们要去实现一个策略,来决定key相同时,元素如何保留。有这样两个方法,出错的地方我们是用的第一个方法,对于可能存在重复key的转换中,我们要使用第二个方法。这个异常就是说,转换map的过程中,有两个key是banana的元素,不知道怎么取舍,因此产生异常。Java中Duplicate key 异常解决。解决办法就是我们去提供这样一个策略。...原创 2022-08-10 16:05:23 · 11115 阅读 · 0 评论 -
java代理
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。...原创 2022-08-07 11:45:00 · 169 阅读 · 0 评论 -
Java的反射
1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到类对象之后,再通过类对象进行反编译,从而获取对象的各种信息。(2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁反射:能够分析类信息的能力叫做反射,那什么是类的信息?...原创 2022-08-05 13:00:00 · 151 阅读 · 0 评论 -
静态代理和动态代理的区别是什么
相比于静态代理,动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由Java反射机制动态产生。3、动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。4、还有一种动态代理CGLIB,代理的是类,不需要业务类继承接口,通过派生的子类来实现代理。2、静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。...原创 2022-08-04 14:39:52 · 1608 阅读 · 0 评论 -
@Pointcut语法详解
@Pointcut语法详解原创 2022-08-02 20:12:49 · 1745 阅读 · 0 评论 -
Date 转为 LocalDate
Date 转为 LocalDate原创 2022-06-15 16:02:06 · 4964 阅读 · 0 评论 -
@PostMapping接收方式
@RequestBody 和 @RequestParam1.@RequestParam(可以有多个)可以接收单个参数传递(必须有对应的名字)@ApiOperation("transmit") @PostMapping("/transmit") public Result transmit(@RequestParam(required = false) @ApiParam(value = "id")String id ,@ApiParam(value = ...原创 2022-05-31 16:09:38 · 11142 阅读 · 0 评论 -
List转String的简单方法
List转String很简单的方法:import org.apache.commons.lang.StringUtils; public static void main(String[] args) { List list = new ArrayList<>(); list.add("a");//String类型 list.add("bb"); list.add(1);//int类型 String s原创 2022-04-24 20:24:21 · 39823 阅读 · 0 评论 -
list.clear()与list = null 区别
一 . list.clear()底层源码实现在使用list 结合的时候习惯了 list=null ;在创建这样的方式,但是发现使用list的clear 方法很不错,尤其是有大量循环的时候1、list 接口 的ArrayList类的clear() 方法源码如下:/** * Removes all of the elements from this list. The list will * be empty after this call returns. ..原创 2022-04-02 19:09:23 · 1288 阅读 · 0 评论 -
Collections.sort升序和降序
如果是对List<Integer> 或者 List<String> 这样本身就实现了Comparable接口的泛型集合排序。如果使用Collections.sort(List<Integer>) 是升序的如果要降序呢?可以传入Collections.reverseOrder(), 返回一个倒叙的Comparator对象,如下:Collections.sort(List<Integer>, Collections.reverseOrder(.原创 2022-03-14 19:38:48 · 4374 阅读 · 0 评论 -
java 使用标签控制循环
java中,我们通常熟悉的是通过break和continue两个关键字来控制程序的走向,当需要程序从一个地方跳到另一个地方时,就需要要通过标签来实现,下面通过一个例子来讲述标签的使用方式。标签是后面跟着冒号的标识符,就像下面这样:label:java中,标签起作用的最好的地方是放在迭代语句之前,在标签和迭代之间置入任何语句都不好。在迭代前设置标签的唯一理由是:我们希望在其中嵌套另一个迭代或者一个开关。将break和continue与标签一起使用,它们就会中断循环,直到标签所在的地方。l原创 2022-02-14 18:25:20 · 907 阅读 · 0 评论 -
Variable used in lambda expression should be final or effectively final
目录场景描述匿名类中的局部变量思考场景描述我们在使用Java8 lambda表达式的时候时不时会遇到这样的编译报错:这句话的意思是,lambda 表达式中使用的变量应该是 final 或者有效的 final,为什么会有这种规定?匿名类中的局部变量其实在 Java 8 之前,匿名类中如果要访问局部变量的话,那个局部变量必须显式的声明为 final,如下代码在 Java 7 中是编译不过的: @Test public void demo() { ...原创 2022-01-11 15:18:41 · 2928 阅读 · 0 评论 -
java List复制:浅拷贝与深拷贝
List浅拷贝众所周知,list本质上是数组,而数组的是以地址的形式进行存储。如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。几种浅拷贝1、遍历循环复制List<Person> destList=new ArrayList<Person原创 2022-01-07 11:32:36 · 2960 阅读 · 0 评论 -
java8的Collector.toMap值为空的异常
最近在使用lambda表达式的Collectors.toMap方法时就遇到了一个问题。大致源码如下:public class Test {public static void main(String[] args) {// initMemberList为获取数据的方法List<Member> list = Test.initMemberList();Map<String, String> memberMap = list.stream().collect(Co原创 2021-12-23 13:48:44 · 3240 阅读 · 0 评论 -
Java String.split() 关于空值(empty results)
现象String testString1 = "1, 1, 0, 0, 0, 6.17, 3.50,,,,,,,,,,,,,1";String testString2 = "1, 1, 0, 0, 0, 6.17, 3.50,,,,,,,,,,,,,";采用默认的split方式testString.split(",");这两者的结果是不一致的,前者的长度是20,后者为7. 因为字符串中产生了空值。如果头和尾都有值,中间空,长度不影响。否则split结果会去掉空值。细看下split的.原创 2021-12-22 17:12:48 · 2794 阅读 · 0 评论 -
Java 中 List.subList() 方法的使用陷阱
1.subList是内部类,非ArrayListjava.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList问题解答:当我们调用subList方法的时候,会通过调用SubList的构造函数创建一个SubList,那么看下这个构造函数做了哪些事情:SubList(AbstractList<E> parent, int offs原创 2021-12-07 20:03:58 · 1131 阅读 · 0 评论 -
多线程某个线程异常了怎么处理
目录一个简单的例子submit方法执行时异常信息为什么消失了Future是如何吃掉异常信息的如何拿到submit提交的线程任务的异常信息通过统一Runnable父类实现异常信息的统一处理通过自定义的线程池来对异常信息进行统一的处理。异常信息作为我们平时定位问题的一大法宝,其重要性是不言而喻的。一段代码出现了问题,如果它的异常信息被吃了,那么一个本来很简单的问题,定位起来也会变的很麻烦。今天我们就从异常信息被吃掉,导致相应信息没有输出到日志的问题说起。一个简单的例子首先原创 2021-11-03 19:58:35 · 2684 阅读 · 0 评论 -
控制并发线程数-Semaphore(信号量)的简单使用
Semaphore(信号量)用来控制并发访问的线程数量,它通过协调各个线程来保证资源的合理使用。其内部使用的是AQS机制(concurrent包下很多类实现原理都是基于AQS)。Semaphore实现控制并发线程数可以抽象为停车场模型,一个固定车位的停车场,当车位满了,便不再允许新的车辆进入;若当前车库驶出多少辆,则就允许进入多少辆。Semaphore做的就是监控车位大小功能。通过构造函数new Semaphore(N)来实现,N表示最多并发访问的线程数。所以当初始化创建了5个许可证时,如果多余5个线程并发原创 2021-10-13 14:01:34 · 450 阅读 · 0 评论 -
@EnableAspectJAutoProxy 等注解的作用
一、@EnableDiscoveryClient及@EnableEurekaClient的异同:共同点:都是能够让注册中心能够发现,扫描到该服务。不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient可以是其他注册中心。说明:从Spring Cloud Edgware开始,都可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。Eureka 2.0闭源之后,Consul慢慢会成为主流。二、@Ena原创 2021-09-26 19:14:03 · 7641 阅读 · 0 评论 -
fastjson中Feature的用法及中文注解
/** * 这个特性,决定了解析器是否将自动关闭那些不属于parser自己的输入源。 如果禁止,则调用应用不得不分别去关闭那些被用来创建parser的基础输入流InputStream和reader;如果允许,parser只要自己需要获取closed方法(当遇到输入流结束,或者parser自己调用 JsonParder#close方法),就会处理流关闭。 * 注意:这个属性默认是true,即允许自动关闭流 */AutoCloseSource /** * 该特性决定parser将是.原创 2021-09-23 14:15:08 · 1992 阅读 · 0 评论 -
Java Fork/Join框架
原文译序Doug Lea大神关于Java 7引入的他写的Fork/Join框架的论文。响应式编程(Reactive Programming/RP)作为一种范式在整个业界正在逐步受到认可和落地,是对过往系统的业务需求理解梳理之后对系统技术设计/架构模式的提升总结。Java作为一个成熟平台,对于趋势一向有些稳健的接纳和跟进能力,有着令人惊叹的生命活力:Java 7提供了ForkJoinPool,支持了Java 8提供的Stream。 另外Java 8还提供了Lamda(有效地表达和使用...原创 2021-09-02 19:55:39 · 317 阅读 · 0 评论 -
线程池需要关闭吗
线程池关闭的意义不仅仅在于结束线程执行,避免内存溢出,因为大多使用的场景并非上述示例那样 朝生夕死。线程池一般是持续工作的全局场景,如数据库连接池。Executors作为局部变量时,创建了线程,一定要记得调用executor.shutdown();来关闭线程池,如果不关闭,会有线程泄漏问题。import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class T..原创 2021-08-27 11:17:49 · 9578 阅读 · 11 评论 -
限流技术小计
前言 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。 缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流。限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请...原创 2021-08-11 21:53:07 · 137 阅读 · 0 评论 -
一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
线程池常用问题 不允许使用的原因 测试流程 测试用例 抛出堆栈异常为啥对了一半? 怎么拿到submit的异常堆栈? 源码查看 执行executes方法时 执行submit方法时 不影响其他线程任务 这个线程会被放回线程池为啥错了 结论 1、当执行方式是execute时,可以看到堆栈异常的输出 2、当执行方式是submit时,堆栈异常没有输出。但是调用Future.get()方法时,可以捕获到异常 3、不会影响线程池里面其他线程的正常执行 4、线程池会原创 2021-08-11 16:15:39 · 4519 阅读 · 1 评论 -
为什么HashMap的key允许空值
1.从源码分析HashMap从源码分析:HashMap在put的时候会调用hash()方法来计算key的hashcode值,可以从hash算法中看出当key==null时返回的值为0。因此key为null时,hash算法返回值为0,不会调用key的hashcode方法。HashTable从源码分析:上面可以看出当HashTable存入的value为null时,抛出NullPointerException异常。如果value不为null,而key为空,在执行到int hash = key.h.原创 2021-07-04 00:14:12 · 5224 阅读 · 0 评论 -
详解Condition的await和signal等待/通知机制
1.Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Conditi原创 2021-06-16 19:44:05 · 706 阅读 · 0 评论 -
多线程之volatile
volatile字面意思易变的,不稳定的。当volatile修饰变量时意味着这种变量的读写必须从主内存中读取,以保证读取最新的值。因此volatile修饰的变量不会去寄存器存储,都是内存操作。原创 2021-06-03 00:25:47 · 243 阅读 · 0 评论 -
公平锁和非公平锁的区别
前言上次我们提到了乐观锁和悲观锁,那我们知道锁的类型还有很多种,我们今天简单聊一下,公平锁和非公平锁两口子,以及他们在我们代码中的实践。正文开始聊之前,我先大概说一下他们两者的定义,帮大家回顾或者认识一下。公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。 非公平锁:多个线转载 2021-05-28 15:20:56 · 1839 阅读 · 0 评论 -
CountDownLatch详解
CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前,主线程需要等待在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。总结来说,CountDownLatch的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,..原创 2021-05-27 16:56:53 · 657 阅读 · 0 评论 -
ArrayList的remove方法
从一个ArrayList中去除某个元素时会用到remove方法,这个方法有两个版本public E remove(int index)public boolean remove(Object o)按索引删除元素如果接收的是一个int类型的值,则这个值表示的是要删除的元素的索引值,方法返回的值就是被删除的元素,如果索引值在实际的范围外,则会抛出IndexOutOfBoundsException异常。List<Integer> integers = new ArrayList&.原创 2021-05-26 16:08:58 · 1238 阅读 · 0 评论 -
ArrayList扩容机制
ArrayList简介: ArrayList实现了List接口它是一个可调整大小的数组可以用来存放各种形式的数据。并提供了包括CRUD在内的多种方法可以对数据进行操作但是它不是线程安全的,ArrayList按照插入的顺序来存放数据。1.成员变量 // 默认给定的初始容量 private static final int DEFAULT_CAPACITY = 10; // 无参构造器中所使用到的空数组实例 private static final Obje...原创 2021-05-26 14:37:08 · 255 阅读 · 0 评论 -
try中的return和finally中的return
我们都知道在try-catch-finally中,try块先执行,如果捕获到异常,则执行catch块,如果没有捕获到异常,那么catch块始终不执行,在catch块执行完之后,finally块最后执行。则那么问题来了(假设都没有捕获异常)1,如果try块中有return语句,那么finally会执行吗?答案:会(实践在后面)2,如果finally块中改变了try块中的return语句要返回的值,那么返回值会改变吗?答案:不会(实践在后面)3,如果finally块中有return语句,那么函数原创 2021-05-20 14:18:25 · 390 阅读 · 0 评论 -
spring的嵌套事务问题
目录线上问题:事务注意事项总结:线上问题:仔细分析了抛出的异常,发现异常为SocketTimeoutException,查阅事务回滚时需要的异常,发现默认事务只对error和runtimeException异常会进行回滚,其他异常不会回滚,https://www.cnblogs.com/tianyuchen/p/6678084.html加上@Transactional(rollbackFor=MyException.class)后事务会捕捉到此类异常,在Spring里,同原创 2021-03-25 20:55:44 · 353 阅读 · 0 评论 -
后端架构师技术图谱
目录数据结构队列集合链表、数组字典、关联数组栈树二叉树完全二叉树平衡二叉树二叉查找树(BST)红黑树B,B+,B*树LSM 树BitSet常用算法排序、查找算法选择排序冒泡排序插入排序快速排序归并排序希尔排序堆排序计数排序桶排序基数排序二分查找Java 中的排序工具布隆过滤器字符串比较KMP 算法深度优先、广度优先贪心算法回溯算法剪枝算法动态规划朴素贝叶斯原创 2021-03-25 16:36:27 · 3256 阅读 · 2 评论