Java 浅拷贝性能比较
一、前言
实际开发中,经常会遇到对象拷贝的需求,本文就结合日常开发过程中,使用到的浅拷贝技术,进行性能比较,看看谁更强。
重要: 下面将会花大量篇幅,列出各种类型浅拷贝的代码,你可以直接拖到文章末尾,看性能对比结果。然后再根据你中意的对象回过头来看它的代码,避免疲劳。
首先创建一个用于拷贝的 Bean,如下所示:
1234567891011121314151617181920212223242526272829303132333435363738394041import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import org.apache.commons.lang3.RandomStringUtils;import org.apache.commons.lang3.RandomUtils;import java.util.Date;@Data@Builderpublic class User { private long id; private int age; ...
Lombok 子类如何使用 @Builder
一、前言
业务开发中,子类父类还算是经常用到,Lombok 的 @builder 提供的链式调用帮助我们更轻松的创建对象。但是实验后却发现子类的 @Builder 是不会包含父类的属性。
假设存在父类 A:
1234567@Data@Builderpublic class A { private String aName; private String aAge;}
存在子类 B:
12345678@Builder@Data@EqualsAndHashCode(callSuper = true)public class B extends A { private String bName; private String bAge;}
使用 builder 进行初始化时,类 A 可以正常创建,类 B 仅可以初始化自己的属性,父类属性无法初始化。
二、解决:构造方法
查阅网络后,一种解决方法是利用构造方法:
父类生成全参构造方法
子类手动声明全参构造方法
将子类 @builder 注解移动全参构造方法上,并设置 bui ...
Java Fail-Fast 与 Fail-Safe 特性
一、前言
在 Java 的集合结构中,如果我们同时进行遍历(for-each, iterator)和集合修改(add, set, remove…)操作时,就有可能发生异常。例如,线程 T1 在对集合进行遍历,而此时线程 T2 对集合进行添加元素;亦或者线程 T1 在对集合进行遍历的过程中,进行删除元素操作。
不同的集合在遇到上述这种情况时,会有不同的处理。按照处理的不同,划分为 Fail-Fast 和 Non-Fail-Fast(下文统称为 Fail-Safe)两类。前者不允许在迭代的过程中对集合进行增删操作,否则抛出 ConcurrentModificationException 异常;后者则允许这种操作,不会抛出异常。
注:本处的“对集合进行增删操作”指的是对集合自身的操作,而非借助 iterator 的操作。
二、Fail-Fast
Fail-Fast 类型的数据结构,在进行迭代时如果检测到集合对象发生了结构性修改会立即抛出 ConcurrentModificationException,结构性修改指的是对该集合对象进行添加、删除或更新元素的操作。ArrayList, H ...
详解 Caffeine Cache
一、前言
在项目开发中,为提升系统性能,减少 IO 开销,本地缓存是必不可少的。最常见的本地缓存是 Guava 和 Caffeine,在 《详解 Guava Cache》中已经为大家介绍了 Guava,本篇文章将为大家介绍 Caffeine。
Caffeine 是基于 Google Guava Cache 设计经验改进的结果,相较于 Guava 在性能和命中率上更具有效率,你可以认为其是 Guava Plus。
毋庸置疑的,你应该尽快将你的本地缓存从 Guava 迁移至 Caffeine,本文将重点和 Guava 对比二者性能占据,给出本地缓存的最佳实践,以及迁移策略。
二、PK Guava
2.1 功能
Feature
Guava
Caffeine
自动加载实体到缓存中
√
√
自动回收 - 基于大小或时间的回收策略 - key 自动封装虚引用,value 自动封装弱/软引用
√
√
自动刷新
√
√
实体过期或被删除的通知
√
√
统计累计访问缓存
√
√
异步 Cache
√
写入外部资源
√
从功能上看,Guava 已经 ...
SpringBoot @Value 解析集合配置
一、前言
在日常开发中,经常会遇到需要在配置文件中,存储 List 或是 Map 这种类型的数据。Spring 原生是支持这种数据类型的,以配置 List 类型为例,对于 .yaml 文件配置如下:
12345test: list: - aaa - bbb - ccc
对于 .properties 文件配置如下所示:
123test.list[0]=aaatest.list[1]=bbbtest.list[2]=ccc
当我们想要在程序中使用时候,想当然的使用 @Value 注解去读取这个值,就像下面这种写法一样:
12@Value("${test.list}")private List<String> testList;
你会发现程序直接报错了,报错信息如下:
1java.lang.IllegalArgumentException: Could not resolve placeholder 'test.list' in value "${test.list}& ...
Java 线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核 CPU 成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C 提供的线程池:ThreadPoolExecutor 类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。
本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。
一、写在前面
1.1 线程池是什么
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如 MySQL。
线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。
而本文描述线程池是 JDK 中提供的 ThreadPoolExecutor 类。
当然,使用线程池可以带来 ...
Windows Terminal 上手把玩指南
Windows 平台的终端一直以来的确不好用,被 mac 和 linux 吊着锤。历经了 cmd、powershell、FluentTerminal,微软最新的 Windows Terminal 终于算是进入可用状态,今天就来把玩把玩。
一、安装
安装前提是 Win10 系统,打开 Windows Store 并搜索 Windows Terminal 点击安装就行。我挂着梯子的时候,进不去商店,所以各位自己把握就好。
二、基本了解
安装完毕后,正常打开即可。如果想要折腾折腾的话,那么主要就得了解下它的配置文件。点击窗口栏的设置按钮,进入配置文件。
配置文件的大致布局如下所示,对于我们美化来说,只需要关注 profiles 和 schemes 两块即可。
让我们先牛刀小试下,调整下终端的字体和字体大小。因为我想对所有终端都应用这个配置。所以我写在了 defaults 中,如下图所示即可。
三、使用主题
这里以使用 Iterm2 的主题资源为例,访问这里 提供了许多 Iterm2 的主题资源,选择其中一个你喜欢的。以 ChallengerDeep.json 这个主题为例,其内 ...
上传 Jar 包至 Maven 中央仓库
一、前言
随着时间积累,在平常写自己的代码过程中,会有类或者是模块,比较通用,许多项目都能用得到。我们就可以把这些部分抽取成一个公共包,方便其他项目去使用。
本地 install 只能保存在本地中,因此将其上传到中央仓库中,平常就能够轻松的去使用了。上传 Jar 包的过程还算简单,本文将记录这一过程,系统环境为 Windiws。
另外,请使用 windows 自带的 CMD 作为整篇文章的命令行工具。不要使用 Git Bash,会有坑。
二、创建工单
首先你得有个 sonatype 的账号,点击这里前往注册。最好使用 Chrome 浏览器进行注册,因为当我使用微软 Chrome 内核的 Edge 浏览器注册时,当输入不满足条件时,没有弹出错误提示。
注册完毕后,点击上方导航栏蓝色的创建按钮,创建一个工单。
可以参考我的工单: https://issues.sonatype.org/browse/OSSRH-57685
问题类型: New Project
概要 / 描述 : 简单描述下想要上传的意图就好
GroupId: 要上传的 Maven 项目的 GroupId,对于我们 ...
MySQL 常用用户权限管理命令
一、用户
1.1 创建用户
1234567891011121314-- 创建用户,并允许其在任何IP登陆create user 'username'@'%' identified by 'password';-- 创建用户,并允许其在任何主机登陆,不设置密码create user 'username'@'%';-- 创建用户,并仅允许使用jitwxs.cn域名的主机登陆create user 'username'@'jitwxs.cn' identified by 'password';-- 创建用户,并仅允许使用192.168.1.1的主机登陆create user 'username'@'192.168.1.1' identified by 'password';-- 创建用户,并仅允许使用192.168.1开头的主机登陆create user 'us ...
Java 代码性能优化之路
一、前言
最近一直忙着参与公司的新项目开发,由于临期上线,正在对系统进行性能压测,在这个过程中,发现一些代码有性能优化的空间。因此决定写一篇文章,把本次以及今后,遇到的性能优化的 case 都记录下来,希望对大家们的编码水平能够有所帮助。
二、Java 基础
2.1 字符串拼接
在我们的系统中,存在着大量的缓存,这些缓存的 key 值根据请求参数的不同而拼接起来,如下代码所示:
优化前1234567891011public class LastPriceCache { private String keySuffix = "last_price_%s"; public double getLastPrice(int id) { return redisService.get(this.generatorKey(id)); } private String generatorKey(int id) { return String.format(keySuffix, id) ...