java进阶
喝酸奶要舔盖儿
这个作者很懒,什么都没留下…
展开
-
关于spring中使用责任链模式
2. 实现链式调用3. 自定义handler3.1 自义定参数对象3.2 自定义handler,继承上方的3.3 编写实现类4. 调用5. 结果原创 2022-07-07 21:00:18 · 690 阅读 · 4 评论 -
java代码混淆工具
1. 下载混淆工具allatori.jarallatori-annotations.jar在项目根目录新建lib目录,放入lib中2. 编辑配置文件<config> <input> <!--in表示需要混淆的jar包, out表示混淆后的jar包, 名称相同时会覆盖原来的jar包--> <jar in="${project.build.finalName}.jar" out="${project.build.fina原创 2022-01-17 14:32:39 · 2955 阅读 · 1 评论 -
JAVA将通配符表达式转化为正则表达式
/** * 将通配符表达式转化为正则表达式 * * @param path * @return */ private static String getRegPath(String path) { char[] chars = path.toCharArray(); int len = chars.length; StringBuilder sb = new StringBuilder();原创 2022-01-12 15:43:08 · 523 阅读 · 0 评论 -
Snowflake雪花算法JAVA实现
/** * Twitter的Snowflake 算法<br> * 分布式系统中,有一些需要使用全局唯一ID的场景,有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 * * <p> * snowflake的结构如下(每部分用-分开):<br> * * <pre> * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000原创 2021-09-27 10:33:31 · 141 阅读 · 0 评论 -
带过期时间的Map类
public class ExpiryMap<K, V> implements Map<K, V> { private ConcurrentHashMap workMap; private ConcurrentHashMap expiryMap; /** * 默认保存时间2分钟 */ private long EXPIRYTIME = 1000 * 60 * 2; /** * circulation 循环时间原创 2021-09-13 11:39:10 · 354 阅读 · 0 评论 -
关于Comparator使用说明
1. 源码分析1.1 介绍@FunctionalInterfacepublic interface Comparator比较功能,对一些对象的集合施加了一个整体排序 。 可以将比较器传递给排序方法(如Collections.sort或Arrays.sort ),以便对排序顺序进行精确控制。 比较器还可以用来控制某些数据结构(如顺序sorted sets或sorted maps ),或对于不具有对象的集合提供的排序natural ordering 。通过比较c上的一组元素S的确定的顺序对被认为是与原创 2021-08-25 16:30:13 · 726 阅读 · 0 评论 -
JDK8中使用stream将list转map
JAVA8 使用stream流来对集合进行处理:Stream将List转换为Map,使Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定key-value,value是对象中的某个属性值。 Map<Integer,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User::getN原创 2021-08-23 09:55:52 · 2249 阅读 · 0 评论 -
java byte[]转String再转回byte[]不一致问题
问题原因 :new String(byte[])和getBytes()默认使用的编码都是通过这条语句获取的编码解决原理:由于UTF-8是多字节编码,需要用多个字节来表示一个字符的编码,所以也就出现了在转换之后byte[]数组长度、内容不一致的情况。而ISO-8859-1编码是单字节编码,所以使用该编码就不会出现上面的问题测试代码:import java.nio.charset.Charset;import java.util.Arrays;public class test {原创 2021-05-19 19:35:38 · 2607 阅读 · 1 评论 -
关于redis分布式锁的实现说明
手动实现@Componentpublic class RedisLock implements Lock { private static final String lock = "lock"; private ThreadLocal<String> stringThreadLocal = new ThreadLocal<>(); @Autowired private StringRedisTemplate stringRedisTemplate;原创 2020-12-08 20:10:43 · 96 阅读 · 0 评论 -
关于Java垃圾回收说明
分代垃圾回收机制分代垃圾回收机制,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率。我们将对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为 Eden、Survivor 和 Tenured/Old 空间。年轻代所有新生成的对象首先都是放在Eden区。 年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象,对应的是Minor GC,每次 Minor GC 会清理年轻代的内存,算法采用效率较高的复制算法,频繁的操作,但是会原创 2020-12-05 15:13:17 · 126 阅读 · 0 评论 -
谈谈面向对象设计(OOD)原则
我觉得能成为一名程序员,至少不会是一个笨的人,要完成一个功能,总能想办法实现(不然早被开除啦~),但实现的方法思路却有好有坏,不过我认为思路可以被引导,软件开发不是才刚开始,它已经存在一段时间,我们可以吸收前人的一些经验教训来提高自己,比如GOF的《设计模式:可复用面向对象软件的基础》,帮我们总结了很多问题的解决思路。这段时间也花了点时间学习面向对象设计的一些思想,也谈谈自己的一些理解。 提到设计模式,我想很多人都看过这块的一些书籍,不过不知道会不会有跟我一样的困惑:看的时候都理解,但是实际开发的时候却原创 2020-12-04 15:14:29 · 484 阅读 · 0 评论 -
关于Java线程池的说明
前言掌握线程池是后端程序员的基本要求,相信大家求职面试过程中,几乎都会被问到有关于线程池的问题。我在网上搜集了几道经典的线程池面试题,并以此为切入点,谈谈我对线程池的理解。如果有哪里理解不正确,非常希望大家指出,接下来大家一起分析学习吧。经典面试题面试问题1:Java的线程池说一下,各个参数的作用,如何进行的? 面试问题2:按线程池内部机制,当提交新任务时,有哪些异常要考虑。 面试问题3:线程池都有哪几种工作队列? 面试问题4:使用无界队列的线程池会导致内存飙升吗? 面试问题5:说说几种原创 2020-11-29 17:09:14 · 464 阅读 · 0 评论 -
关于JAVA泛型说明
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。1.泛型带来的好处在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本身.原创 2020-11-24 13:18:10 · 81 阅读 · 0 评论 -
java线程池说明
1、线程池的优势(1)、降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;(2)、提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;(3)方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。(4)提供更强大的功能,延时定时线程池。2、线程池的主要参数1、corePoolSize(线程池基本原创 2020-11-21 20:14:43 · 95 阅读 · 0 评论 -
关于一致性HASH算法说明
1. 概念一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。[1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 [2] 。2. 原理说明知识复习:1. 常规hash由多少位16进制数组成??? 8位16进制数组成 2^32次方2. 如果对相同的数据进行hash计算问结果是原创 2020-11-21 13:26:08 · 97 阅读 · 0 评论 -
本地缓存(Cache)缓存系统设计进阶
缓存应用需求升级缓存系统既要保证线程安全又要保证性能。 缓存日志的记录要写到文件,而且是异步写 向缓存中写数据时要提高序列化性能。缓存对象读写锁应用package com.cy.java.cache; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 构建线程安全对象,基于ReentrantReadWriteLock对象实现读写锁应用。 * @author qilei */ pu原创 2020-11-11 15:20:47 · 189 阅读 · 0 评论 -
本地缓存(Cache)系统简易设计
为什么使用缓存?降低数据库的访问压力。 提高查询效率。 改善用户体验。你都了解哪些缓存?数据库内置缓存(DBA修改)。 数据层缓存(由持久层框架决定,例如mybatis) 业务层缓存(由业务层框架以及第三缓存产品决定:本地缓存+分布式缓存) 浏览器缓存(Cache-Control)设计缓存都应该考虑什么问题?存储结构:使用什么结构存储数据?(数组,链表,散列存储-哈希存储) 淘汰算法:有限容量(LRU,FIFO,.....),不限容量(GC) 并发安全:保证线程安全。 任务调原创 2020-11-11 15:10:48 · 616 阅读 · 0 评论