210903-实战小技巧17:随机数生成怎么选

每天一个实战小技巧,随机数生成怎么选

随机数生成,java中有一个专门的Random类来实现,除此之外,使用Math.random的也比较多,接下来我们简单学习下,随机数的使用姿势

210901-实战小技巧15:如何判断类为基础类型or基础类型的包装类

每天一个实战小技巧,判断类为基础类型or基础类型的包装类

判断一个类是否为基础类型属于常规操作了,一般我们遇到这种case,要怎么处理呢?

一个一个的if/else判断? 还是其他的操作姿势?

210830-实战小技巧14:配置文件Properties

每天一个实战小技巧,Properties配置文件

properties配置文件,相信各位小伙伴都不会太陌生,常用Spring的可能会经常看到它,虽说现在更推荐的是使用Yaml配置文件,但是properties配置文件的使用频率也不低

在jdk中有一个直接关连的类Properties,接下来我们来看一下它的用法

210826-实战小技巧13:进制转换很简单

每天一个实战小技巧,进制转换很简单

进制转换,属于基本技能了,在java中要实现进制转换很简单,可以非常简单的实现,接下来我们来看下它的使用姿势

210825-实战小技巧12:数字格式化

每天一个实战小技巧,数字格式化

数字的格式化场景,更多的是在日志输出、金额计算相关的领域中会用到,平常我们可能更多使用String.format来格式化,但是请注意,数字格式化是有一个DecimalFormat,专门来针对数字进行格式化

今天我们的知识点就是DecimalFormat来实现数字格式化

210821-实战小技巧11:数组拷贝

每天一个实战小技巧,数组拷贝

说实话,在实际的业务开发中,基本上很少很少很少…会遇到数组拷贝的场景,甚至是我们一般都不怎么用数组,List它不香嘛,为啥要用数组

现在问题来了,要实现数组拷贝,怎么整?

210820-实战小技巧10:不可变容器

每天一个小技巧:不可变容器

不可变容器,看着好像在实际的业务中不怎么会用到,但实则不然,相信每个小伙伴都用过,或者看到过下面的代码

1
2
Collections.emptyList();
Collections.emptyMap();

今天我们来介绍一下如何使用不可变容器,以及使用时的注意事项

210819-实战小技巧9:List.subList使用不当StackOverflowError

实战小技巧:List.subList使用不当StackOverflowError

相信每个小伙伴都使用过List.subList来获取子列表,日常使用可能没啥问题,但是,请注意,它的使用,很可能一不小心就可能导致oom

210818-实战小技巧8:容器的初始化大小指定

每天一个实战小技巧:容器的初始化大小指定

容器可以说是我们日常开发中,除了基本对象之外,使用最多的类了,那么平时在使用的时候,是否有主意到良好编程习惯的大佬,在创建容器的时候,一般会设置size;那么他们为什么要这么干呢?是出于什么进行考量的呢?

今天我们将针对最常见的List/Map/Set三种容器类型的初始化值选择,进行说明

210817-实战小技巧7:排序比较要慎重

每天一个实战小技巧:排序比较要慎重

今天介绍的又是一个非常非常基本的基本知识点,为啥要单独拎出来?还是因为这个东西虽然非常简单,但是很容易掉坑,我已经遇到几次不严谨的写法了

210816-实战小技巧6:枚举的特殊用法

每天一个实战小技巧:枚举的特殊用法

难道我们日常使用的枚举还有什么特殊的玩法不成?没错,还真有,本文主要介绍枚举的两种不那么常见的使用姿势

  • 利用枚举来实现单例模式
  • 利用枚举来实现策略模式

210814-实战小技巧5:驼峰与下划线互转

每天一个实战小技巧:驼峰与下划线划转

这个考题非常实用,特别是对于我们这些号称只需要CURD的后端开发来说,驼峰与下划线互转,这不是属于日常任务么;一般来讲db中的列名,要求是下划线格式(why? 阿里的数据库规范是这么定义的,就我感觉驼峰也没毛病),而java实体命名则是驼峰格式,所以它们之间的互转,就必然存在一个驼峰与下划线的互转

今天我们就来看一下,这两个的互转支持方式

210812-实战小技巧4:优雅的实现字符串拼接

每天一个实战小技巧,字符串拼接

相信没有小伙伴没有写过这样的代码,比如说现在让我们来实现一个字符串拼接的场景,怎样的实现才算是优雅的呢?

210811-实战小技巧3:字符串与容器互转

每天一个实战小技巧:字符串与Collection的互转

将字符串转换为List,这种业务场景可以说非常非常常见了,实现方式也比较简单

1
2
3
4
public List<String> str2list(String str, String split) {
String[] cells = str.split(split);
return Arrays.asList(cells);
}

那么除了上面这种实现方式之外,还有其他的么?

210810-实战小技巧2:数组与list互转

每天一个实战小技巧:数组与list互转

这个考题比较常见,也比较简单,难道就这也有什么可以说到的门路不成?

接下来本文好好的说一说它的几种实现姿势,总有一款你喜欢的

210809-实战小技巧:字符串占位替换-JDK版

字符串占位替换,相信没有小伙伴是陌生的,这东西可以说是伴随着我们所有的项目工程,编码过程;别不相信,如

  • String.format
  • sql参数拼接的占位
  • log日志输出

接下来我们看一下在我们的日常工作生涯中,经常涉及到的几种占位替换方式

210518-String#format数量不匹配抛异常

偶然发现一个问题,在使用String.format进行格式化输出时,发现参数个数不匹配时,会抛出异常,如

1
String msg = String.format("hello %s, %s", "a");

上面这个执行之后,会抛MissingFormatArgumentException异常,提示信息如

1
java.util.MissingFormatArgumentException: Format specifier '%s'

210514-IDEA代码修改不生效,需要mvn install问题记录

最近用idea开发一个项目,遇到一个鬼畜的问题,代码修改之后,启动测试发现不生效,只有重新mvn clean install之后才能加载到改动的代码

这就有点过分了,怀疑是idea的配置问题导致的,没有什么特别好的办法,只能删配置重新导入

  • 删除 .idea文件夹
  • 删除 *.iml文件
  • 重新导入项目

210512-IDEA 项目module无法导入问题记录

idea一个项目有多个module,忽然发现一个module显示不太正常,如

一般有两种方法,基本的如:

  • 选中pom.xml,右键
  • maven
  • unignore Projects

210412-JDK 常见并发控制手段

单实例的并发控制,主要是针对JVM内,我们常规的手段即可满足需求,常见的手段大概有下面这些

  • 同步代码块
  • CAS自旋
  • 阻塞队列,令牌桶等

210225-分页遍历的两种使用姿势

在日常开发中,分页遍历迭代的场景可以说非常普遍了,比如扫表,每次捞100条数据,然后遍历这100条数据,依次执行某个业务逻辑;这100条执行完毕之后,再加载下一百条数据,直到扫描完毕

那么要实现上面这种分页迭代遍历的场景,我们可以怎么做呢

本文将介绍两种使用姿势

  • 常规的使用方法
  • 借助Iterator的使用姿势

210129-Java对象内存地址输出

当一个对象没有重写hascode方法时,它返回的内存地址,当覆盖之后,我们有什么办法获取对象的内存地址么?

  • 使用 System.identityHashCode() 输出内存地址

210121-StringUtils字符串分割使用姿势异常记录

字符串分割,属于比较常见的case了,在实际开发中,相信很多小伙伴会借助common-lang工具包中的StringUtils来实现,使用姿势也很简单

1
String[] ans = StringUtils.split("a,b,c", ",");

一般来讲上面这种使用方式没有问题,但是当分隔符前后为空时,需要特别注意,可能会和你预期的返回不一致

210107-Spring工具类之基本元素判断

实际业务开发中偶尔会遇到判断一个对象是否为基本数据类型,除了我们自老老实实的自己写之外,也可以借助Spring的 BeanUtils 工具类来实现

1
2
3
4
5
// Java基本数据类型及包装类型判断
org.springframework.util.ClassUtils#isPrimitiveOrWrapper

// 扩展的基本类型判断
org.springframework.beans.BeanUtils#isSimpleProperty

201121-Mac android studio 4.1 missing essential plugin问题解决

android studio 4.1 禁用一个插件之后重启,结果发现应用都起不来了,直接报了一个错误

这就有点尴尬了,禁用一个插件直接导致不可用,那么能想到的解决办法就是将这个插件启用,问题是应用都跪了,怎么启用插件呢?

201021-LRU算法急速实现版

借助LinkedHashMap飞速实现一个LRU算法的缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.LinkedHashMap;
import java.util.Map;

/**
* 基于LinkedHashMap实现的LRU算法
* Created by @author yihui in 17:36 20/10/19.
*/
public class LruCache<K, V> extends LinkedHashMap<K, V> {
private int size;

public LruCache(int size) {
super(size, 0.75f, true);
this.size = size;
}

@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
// 当元素个数,超过指定的大小时,淘汰最老的数据
return size() > size;

}

public static void main(String[] args) {
LruCache<String, Integer> cache = new LruCache<>(4);
for (int i = 0; i < 6; i++) {
cache.put("key_" + i, i);
System.out.println(cache);
}

System.out.println(cache.size);
}
}

201010-Android A WebView method was called on thread JavaBridge

Android开发过程中,偶遇一个webview与android通信的问题,提示A WebView method was called on thread 'JavaBridge'. All webview methods must be called...

这个问题发现Android 9以上会出现,解决方法是@JavascriptInterface注解的方法必须指定在UI线程执行,将原来方法里的代码放入run里面执行即可

如下

1
2
3
4
5
6
// 注意这个activity就是webview所在的activity
H5DetailActivity.this.runOnUiThread(new Runnable() {
public void run() {
webView.loadUrl("javascript:initBookList('" + ans + "')");
}
});

200821-Android webview内嵌h5基础使用说明

Android可以通过webview来内嵌html页面,从而实现灵活的信息展示;最近客串android开发中,正好遇到了这样的一个小场景,所以简单的记录一下Android与html之间的交互,包含以下内容

  • webview的基本设置
  • Andriod调用js方法
  • js调用android方法
  • 图片长按下载

200817-谷歌内购服务教程与避雷指南

最近客串了一把android开发,对接谷歌的内购商品,这个过程真的是特别不顺,各种意想不到的坑,一踩一个;

接下来记录一下谷歌内购服务的完整配置流程,以及在最后测试阶段可能遇到的各种问题;在正式开始之前,请确定以下基本条件

  1. 科学上网
  2. 准备gmail邮箱
  3. 准备google play账号(地区不要选择中国大陆,因为不支持购买)
  4. 授权开启商家账号
  5. 准备测试机(谷歌服务四件套得有)

200430-Java实现AES ECP PKCS5Padding加解密工具类

Java 实现一个AES/ECB/PKCS5Padding 加解密算法工具类

  • 加密算法: AES
  • 模式: ECB
  • 补码方式: PKCS5Padding

200316-手把手教你实现一个方法耗时统计的java agent

前面有两篇铺垫博文,在博文《200303-如何优雅的在java中统计代码块耗时》,其最后提到了根据利用java agent来统计方法耗时

博文《200316-IDEA + maven零基础构建java agent项目中则详细描述了搭建一个java agent开发测试项目的全过程

本篇博文将进入java agent的实战,手把手教你如何是实现一个统计方法耗时的java agent

200316-IDEA + maven零基础构建java agent项目

Java Agent(java探针)虽说在jdk1.5之后就有了,但是对于绝大多数的业务开发javaer来说,这个东西还是比较神奇和陌生的;虽说在实际的业务开发中,很少会涉及到agent开发,但是每个java开发都用过,比如使用idea写了个HelloWorld.java,并运行一下, 仔细看控制台输出

本篇将作为Java Agent的入门篇,手把手教你开发一个统计方法耗时的Java Agent

200314-MySql 时区少8小时问题

SpringBoot指定com.mysql.cj.jdbc.Driver来操作mysql数据库时,发现时区有八个小时的差距,主要原因在于需要在url中指定时区信息,否则会有这个问题

200303-如何优雅的在java中统计代码块耗时

在我们的实际开发中,多多少少会遇到统计一段代码片段的耗时的情况,我们一般的写法如下

1
2
3
4
5
6
long start = System.currentTimeMillis();
try {
// .... 具体的代码段
} finally {
System.out.println("cost: " + (System.currentTimeMillis() - start));
}

上面的写法没有什么毛病,但是看起来就不太美观了,那么有没有什么更优雅的写法呢?

200111-老哥,你真的知道HashMap初始化大小如何设置么

HashMap对于javer而言,可以说是非常非常熟悉的一个容器类了,可以说99.99%的java开发者都用过它,那么你知道怎样创建一个HashMap是最优雅的方式呢?

191107-InputStream重复使用小技巧

在日常的编码中,有时会遇到,需要重复获取InputStream中的数据的需求;然后一般的流,只能读一次,读完就没了;那么如果我希望有一个可以重复读取数据的InputStream,可以怎么操作?

190920-ProtoStuff不支持BigDecimal序列化/反序列化记录

平时使用ProtoStuff作为序列化工具,对于一些POJO对象序列化,但是在实际使用中,发现针对BigDecimal对象进行序列化时却出现了问题

  • 不管什么数,生成的byte数组都一样
  • 无法正确反序列化

下面记录一下这个问题

190909-Java之输出异常堆栈信息

在代码出现异常时,堆栈信息可以有效的辅助定位和排除问题,异常堆栈一般是怎么打印的呢

190821-ProtoStuff无法反序列化Deprecated注解成员问题记录

今天开发过程中,遇到一个鬼畜的问题,在DO的某个成员上添加@Deprecated注解之后,通过ProtoStuff反序列化得到的DO中,这个成员一直为null;花了不少时间才定位这个问题,特此记录一下

190618-JDK的一次排序采坑记录

列表排序,我们可以说是用的比较多了,写起来也很溜,继承Comparable接口,实现compareTo方法,然后直接使用java.util.List#sort即可

虽说如此简单,今天却是一脚踩进去,花了不少时间才爬出来,下面复盘一下这个现场

190605-记录BigDecimal转int四舍五入的姿势

从db中查了一个BigDecimal数据,希望按照四舍五入的方式进行取整,发现直接使用 intValue 不太对,特此记录一下正确姿势

1
new BigDecimal(4.51).setScale(0, RoundingMode.HALF_EVEN).intValue()

190529-Java之HashMap迭代删除使用方法小结

map的迭代删除,和我们常见的list,set不太一样,不能直接获取Iteraotr对象,提供的删除方法也是单个的,根据key进行删除,如果我们有个需求,将map中满足某些条件的元素删除掉,要怎么做呢?

190521-JDK之List遍历删除的几种使用姿势

在实际的业务开发中,容器的遍历可以说是非常非常常见的场景了,遍历删除呢,用的机会也不会少,但你真的会用么

190515-老哥你真的知道ArrayList#sublist的正确用法么

我们有这么一个场景,给你一个列表,可以动态的新增,但是最终要求列表升序,要求长度小于20,可以怎么做?

这个还不简单,几行代码就可以了

1
2
3
4
5
6
7
8
public List<Integer> trimList(List<Integer> list, int add) {
list.add(add);
list.sort(null);
if (list.size() > 20) {
list = list.subList(0, 20);
}
return list;
}

190514-查看java进程jvm参数

java应用启动之后,有办法查看jvm参数么?

可以通过jps -v来实现

1
jsp -lv

如阿里的java进程输出如下

1
2
28996 com.aliyun.tianji.cloudmonitor.Application -Djava.compiler=none -XX:-UseGCOverheadLimit -XX:NewRatio=1 -XX:SurvivorRatio=8 -XX:+UseSerialGC -Djava.io.tmpdir=../../tmp -Xms16m -Xmx32m -Djava.library.path=../lib:../../lib -Dwrapper.key=drcJnFxDcXCZH8of -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.disable_console_input=TRUE -Dwrapper.pid=28989 -Dwrapper.version=3.5.27 -Dwrapper.native_library=wrapper -Dwrapper.arch=x86 -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1
2358 sun.tools.jps.Jps -Denv.class.path=.:/usr/java/jdk1.8.0_131/lib/dt.jar:/usr/java/jdk1.8.0_131/lib/tools.jar:/usr/java/jdk1.8.0_131/jre/lib -Dapplication.home=/usr/java/jdk1.8.0_131 -Xms8m

190412-FastJson序列化对象中非字符串类型key输出非标准格式json串问题记录

采用fastjson作为项目的json序列化和反序列化工具,遇到一个蛋疼至极的问题, 如Map,key为int,则输出的字符串中,key没有被双引号括起来,导致前端解析失败

190403-HashMap的key典型错误使用姿势

记录一个非常低级的错误导致的java应用一直fullgc的问题;根本原因就是HashMap的key使用姿势不对

181230-使用Java Socket实现一个http服务器

作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomcat的底层是怎么支持http服务的呢?大名鼎鼎的Servlet又是什么东西呢,该怎么使用呢?

在初学java时,socket编程是逃不掉的一章;虽然在实际业务项目中,使用这个的可能性基本为0,本篇博文将主要介绍如何使用socket来实现一个简单的http服务器功能,提供常见的get/post请求支持,并再此过程中了解下http协议

180926-Java之数值型的字面值中使用下划线

之前偶然在一个开源项目中看到下面这种写法,深感惊奇,当时没有记录,后来果不其然就忘掉了这种写法,现在又看到这种写法,特此记录

1
long price = 1_000_123L;

180918-JDK之Deflater压缩与Inflater解压

JDK 压缩与解压工具类

在实际的应用场景中,特别是对外传输数据时,将原始数据压缩之后丢出去,可以说是非常常见的一个case了,平常倒是没有直接使用JDK原生的压缩工具类,使用Protosutff和Kryo的机会较多,正好在实际的工作场景中遇到了,现在简单的看下使用姿势

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×