![](https://img-blog.csdnimg.cn/2019091019254411.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
编程基础
文章平均质量分 69
编程基础类知识
LiZhen798
软件研发工程师
语言:Java,Go
展开
-
FastJson序列化时过滤字段(属性)的方法总结
通过实现PropertyFilter接口的apply方法,来实现过滤属性,方法参数name即为字段的key,参数value即为字段的value,这种方式最强大,因为可以自定义具体过滤规则。在转JSON的时候,带上过滤器参数即可。的方式来包含指定的字段。在实体字段前面,使用transient关键字,表示该字段不参与序列化,转JSON字符串时就可以忽略掉该字段。FastJson序列化时(即转成JSON字符串时),可以过滤掉部分字段,或者只保留部分字段,方法有很多,下面举一些常用的方法。如果是JAVA8的话。原创 2023-03-28 10:47:59 · 5595 阅读 · 0 评论 -
线程池的五种状态
当线程池的状态变为TIDYING状态时,会调用钩子函数terminated(),该方法在ThreadPoolExecutor中是空的,若用户想在线程池变为TIDYING时进行相应的处理,就需要重载terminated()函数实现。状态切换:当线程池状态为SHUTDOWN时,阻塞队列为空并且线程池中执行的任务也为空时,就会由SHUTDOWN->TIDYING。状态切换:线程池的初始状态为RUNNING。状态说明:线程池处于STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。原创 2023-01-31 17:07:17 · 553 阅读 · 0 评论 -
map.keySet()修改会影响原map
map的keySet()方法返回的集合,对集合进行添加或者删除会影响到原来的集合map。进行removeAll操作会改变原有map集合。所以 在使用时需要注意。进行add操作会报错。原创 2022-10-14 13:41:19 · 642 阅读 · 0 评论 -
Java 中Duplicate key 异常
我这里使用的是两个key 相同时,保留先存进去的那个元素。相比第一个方法,主要就是我们要去实现一个策略,来决定key相同时,元素如何保留。有这样两个方法,出错的地方我们是用的第一个方法,对于可能存在重复key的转换中,我们要使用第二个方法。这个异常就是说,转换map的过程中,有两个key是banana的元素,不知道怎么取舍,因此产生异常。Java中Duplicate key 异常解决。解决办法就是我们去提供这样一个策略。...原创 2022-08-10 16:05:23 · 10958 阅读 · 0 评论 -
java代理
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。...原创 2022-08-07 11:45:00 · 162 阅读 · 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 · 4344 阅读 · 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 · 1105 阅读 · 0 评论 -
线程池需要关闭吗
线程池关闭的意义不仅仅在于结束线程执行,避免内存溢出,因为大多使用的场景并非上述示例那样 朝生夕死。线程池一般是持续工作的全局场景,如数据库连接池。Executors作为局部变量时,创建了线程,一定要记得调用executor.shutdown();来关闭线程池,如果不关闭,会有线程泄漏问题。import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class T..原创 2021-08-27 11:17:49 · 9446 阅读 · 11 评论 -
一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
线程池常用问题 不允许使用的原因 测试流程 测试用例 抛出堆栈异常为啥对了一半? 怎么拿到submit的异常堆栈? 源码查看 执行executes方法时 执行submit方法时 不影响其他线程任务 这个线程会被放回线程池为啥错了 结论 1、当执行方式是execute时,可以看到堆栈异常的输出 2、当执行方式是submit时,堆栈异常没有输出。但是调用Future.get()方法时,可以捕获到异常 3、不会影响线程池里面其他线程的正常执行 4、线程池会原创 2021-08-11 16:15:39 · 4403 阅读 · 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 · 5175 阅读 · 0 评论 -
MySQL-MVCC机制
一、前言前面介绍了MySQL的锁机制,提到过写锁和读锁是冲突的,那么MySQL是如何处理读写冲突,提高数据库高并发场景下的吞吐性能?本章主要是介绍MVCC (Multiversion Concurrency Control) ,即多版本并发控制。二、什么是MVCCSELECT 操作可以不加锁而是通过 MVCC 机制读取指定的版本历史记录,并通过一些手段保证保证读取的记录值符合事务所处的隔离级别,从而解决并发场景下的读写冲突。下面举一个多版本读的例子,例如两个事务 A 和 B 按照如下顺序进行原创 2021-06-16 19:46:54 · 157 阅读 · 0 评论 -
多线程之volatile
volatile字面意思易变的,不稳定的。当volatile修饰变量时意味着这种变量的读写必须从主内存中读取,以保证读取最新的值。因此volatile修饰的变量不会去寄存器存储,都是内存操作。原创 2021-06-03 00:25:47 · 232 阅读 · 0 评论 -
spring事务嵌套及回滚
Spring事务嵌套的相关问题:外层事务 Service A 的 Method A() 调用 内层Service B 的 Method B()原创 2021-05-28 20:22:03 · 2441 阅读 · 3 评论 -
公平锁和非公平锁的区别
前言上次我们提到了乐观锁和悲观锁,那我们知道锁的类型还有很多种,我们今天简单聊一下,公平锁和非公平锁两口子,以及他们在我们代码中的实践。正文开始聊之前,我先大概说一下他们两者的定义,帮大家回顾或者认识一下。公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。 非公平锁:多个线转载 2021-05-28 15:20:56 · 1765 阅读 · 0 评论 -
CountDownLatch详解
CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前,主线程需要等待在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。总结来说,CountDownLatch的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,..原创 2021-05-27 16:56:53 · 639 阅读 · 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 · 1229 阅读 · 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 · 382 阅读 · 0 评论 -
InnoDB锁问题(2)
目录5. Next-Key锁6 恢复和复制的需要,对InnoDB锁机制的影响7. InnoDB在不同隔离级别下的一致性读及锁的差异8. 什么时候使用表锁9. 关于死锁书接上文:5. Next-Key锁当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。举例来说,假如原创 2021-03-24 17:20:32 · 196 阅读 · 0 评论 -
InnoDB锁问题(1)
目录0. 序1. 基础知识1.1 事务(Transaction)及其ACID属性1.2 并发事务处理带来的问题1.3 事务隔离级别2. 获取InnoDB行锁争用情况3. InnoDB的行锁模式及加锁方法4. InnoDB行锁实现方式4.1在不通过索引条件查询时,InnoDB会锁定表中的所有记录4.2查询同一个索引值的不同记录时会出现锁冲突4.3可以通过不同索引锁不同行,但通过多个索引锁定同一行会产生锁冲突4.4需要检查实际执行SQL时是否用到了索引0. 序原创 2021-03-24 17:14:18 · 738 阅读 · 0 评论 -
MySQL日志系统:redo log、binlog、undo log 区别与作用
日志系统主要有redo log(重做日志)和binlog(归档日志)。redo log是InnoDB存储引擎层的日志,binlog是MySQL Server层记录的日志, 两者都是记录了某些操作的日志(不是所有)自然有些重复(但两者记录的格式不同)。图来自极客时间的mysql实践,该图是描述的是MySQL的逻辑架构。redo log日志模块redo log是InnoDB存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和转载 2021-03-23 19:54:16 · 133 阅读 · 0 评论 -
MySQL插入更新 ON DUPLICATE KEY UPDATE
目录ON DUPLICATE KEY UPDATE 简介ON DUPLICATE KEY UPDATE 使用ON DUPLICATE KEY UPDATE 注意事项:ON DUPLICAET KEY UPDATE 空洞问题ON DUPLICATE KEY UPDATE 简介项目中偶尔会有这种需求:我们想向数据库插入一条记录: 若数据表中存在以相同主键的记录,我们就更新该条记录。 否则就插入一条新的记录。可以通过ON DUPLICATE K...原创 2021-03-23 15:52:05 · 227 阅读 · 0 评论 -
一致性哈希算法的问题
本文将从如下三个方面探探一致性哈希算法一致性哈希算法经典实用场景 一致性哈希算法通常不适合用于服务类负载均衡 面试应对之策1、一致性哈希算法经典使用场景在数据库存储领域如果单表数据量很大,通常会采用分库分表,同样在缓存领域同样需要分库,下面以一个非常常见的Redis分库架构为例进行阐述。将上述3个Redis节点称之为分片,每一个节点存储部分数据,期间需要使用负载均衡算法,将数据尽量分摊到各个节点,充分发挥分布式的优势,提升系统缓存访问的性能。在分布缓存领域,对数据存在新增与..转载 2021-03-22 18:02:12 · 357 阅读 · 0 评论 -
Mysql的锁相关的知识
一、数据库的锁和事务的隔离级别行锁(Record lock)单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏的聚集主键索引。所以说当一条sql没有走任何索引时,那么将会在每一条聚集索引后面加X锁,这个类似于表锁,但原理上和表锁应该是完全不同的。间隙锁(Gap lock)在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身。ga原创 2021-03-18 17:24:15 · 108 阅读 · 0 评论 -
LRU算法四种实现方式介绍
LRU全称是LeastRecently Used,即最近最久未使用的意思。LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。实现LRU1. 用一个数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存在的数据项的时间戳自增,并将新数据项的时间戳置为0并插入到数组中。每次访问数组中的数据项的时候,将被访问的数据项的时间戳置为0。当数组空间已...转载 2021-03-17 20:40:25 · 2640 阅读 · 0 评论 -
Java基础系列——hashcode和equals的若干问题(2)
目录第3部分 hashCode() 的作用第4部分 hashCode() 和 equals() 的关系1. 第一种 不会创建“类对应的散列表”2. 第二种 会创建“类对应的散列表”注意:书接上文:第3部分 hashCode() 的作用hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有ha原创 2021-03-16 17:07:49 · 159 阅读 · 0 评论 -
Java基础系列——hashcode和equals的若干问题(1)
本章的内容主要解决下面几个问题:(将分两篇文章说明)1equals() 的作用是什么?2equals() 与 == 的区别是什么?3hashCode() 的作用是什么?4hashCode() 和 equals() 之间有什么联系?第1部分 equals() 的作用equals() 的作用是用来判断两个对象是否相等。equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。源码如下:publi...原创 2021-03-16 16:40:57 · 122 阅读 · 0 评论 -
java多线程系列——关于多线程中的锁
目录同步锁JUC包中的锁01. Lock接口02. ReadWriteLock03. AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer04. LockSupport05. Condition06. ReentrantLock07. ReentrantReadWriteLock08. CountDownLatch09. CyclicBarrie.原创 2021-03-16 15:41:33 · 194 阅读 · 0 评论 -
线程的5种状态详解
Java中的线程的生命周期大体可分为5种状态。1.新建(NEW):新创建了一个线程对象。2.可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。3.运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。4.阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cp...转载 2021-03-10 17:10:53 · 166 阅读 · 0 评论 -
final域的重排序规则
对于final 域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序。public class FinalExample { int i; //普通变量 final int j;原创 2021-03-10 16:55:57 · 485 阅读 · 0 评论 -
JAVA泛型实现原理
泛型是一种类似”模板代码“的技术,不同语言的泛型实现方式不一定相同。Java语言的泛型实现方式是擦拭法(Type Erasure)。所谓擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的。例如,我们编写了一个泛型类Pair<T>,这是编译器看到的代码:public class Pair<T> { private T first; private T last; public Pair(T first, T last) {原创 2021-01-09 15:29:44 · 436 阅读 · 2 评论 -
Java异常体系
一、异常的体系结构 二、异常介绍 Error(错误): Exception(异常): 三、可查异常与不可查异常 1、可查异常: 2、不可查异常: 常见的非检查性异常: 常见的检查性异常: 四、自定义异常 五、处理异常 try...catch关键字 throws/throw 关键字 finally关键字 任何程序都追求正确有效的运行,除了保证我们代码尽可能的少出错之外,我们还要考虑如何有效的处理异常,一个良好的异常框架对于系统来说是至关重要的。“异原创 2021-01-05 17:53:59 · 115 阅读 · 0 评论 -
浅谈web网站架构演变过程
前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变。 该系统具备的功能: 用户模块:用户注册和管理商品模块:商品展示和管理交易模块:创建交易和管理 阶段一、单机构建网站 网站的初期,我们经常会在单机上跑我们所有的程序和软件。此时我们使用一个容器,如tomcat、jetty、jboos,然后直接使用JSP/servlet技术,或者使用一些开源的框架...转载 2018-05-03 17:50:50 · 137 阅读 · 0 评论 -
int & 到底是什么
这里引用“落辰衰”大佬的解释:1、int;int是C++关键字,表示整型,其大小是32位有符号整型,表示的范围是-2,147,483,648 到2,147,483,647;在声明和定义变量时使用,它表示的意思是所声明或所定义的变量为整型变量。如果其用于函数参数时,其传递方向为值传递,即只能将实参的值传递给形参,而不能将形参的值传递给实参。例如:通过这种方式去进行交换两个数...转载 2019-08-11 16:43:27 · 2803 阅读 · 0 评论 -
当我们在谈进制的时候,我们在谈什么
关于进制,前几天一朋友询问二进制和十六进制的区别。遂在此总结一下关于进制的相关知识,回忆一下计算机的基础内容,也帮朋友更好的理解一下。定义:进位制是一种记数方式,亦称进位计数法或位值计数法。利用这种记数法,可以使用有限种数字符号来表示所有的数值。一种进位制中可以使用的数字符号的数目称为这种进位制的基数或底数。若一个进位制的基数为n,即可称之为n进位制,简称n进制。现在最常用的进位制是十进制...原创 2019-05-04 19:35:49 · 1370 阅读 · 1 评论 -
正则表达式30分钟入门教程
看到一篇写正则表达式的,写的非常不错,在此记录下来。原文链接本文目标30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。如何使用本教程最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——除非你是超人 :)别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有想像中的那...转载 2018-11-20 20:16:27 · 192 阅读 · 0 评论