实用库推荐

这篇博客主要是记录一些比较好用的库。

分析JVM中对象布局:JOL

JOL的maven三元组:

1
2
3
4
5
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>

使用也非常简单,通过它可以了解对象布局情况,以下是示例代码:

1
2
3
4
5
6
7
8
9
10
11
public class Test {
private long a = 2;
private short b = 1;
public static void main(String[] args) {
Object o = new Object();
// 查看普通对象布局
System.out.println(ClassLayout.parseInstance(o).toPrintable());
// 查看Class对象布局
System.out.println(ClassLayout.parseClass(Test.class).toPrintable());
}
}

结果如下:

  1. 对象头的mark word部分
  2. 对象头的class ref部分
  3. 对象内部填充(内存对齐,即偏移是数据类型长度的整倍数)
  4. 对象末尾填充(64bit机器上是8字节填充)
  5. 对象中的实例数据(8种基本数据类型和引用)

标准工具库Apache Commons Lang

标准库为其核心类没有提供足够的操纵方法。针对于此,Apache Commons Lang提供了这些额外的方法,主要集中在以下方面:字符串操作,基础数值操作,对象反射,并发等等。
引入依赖:

1
2
3
4
5
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>

基本使用如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
// ArrayUtils
// 内置了各种类型的空数组
int[] emptyArray = ArrayUtils.EMPTY_INT_ARRAY;
// 提供了包装类和基本类型之间的转换
int[] basicArray = {1, 2, 3};
Integer[] wrapArray = ArrayUtils.toObject(basicArray);

// ClassUtils
System.out.println(ClassUtils.getPackageName(String.class));
System.out.println(ClassUtils.getAllSuperclasses(ArrayList.class));
System.out.println(ClassUtils.getAllInterfaces(ArrayList.class));

...
}

事实上,工具库的选择还有很多,比如google的guava,国内的hutool等。