背景
java的集合框架中ArrayList,Map,Set等是我们平时最常用的集合类,但是由于这些集合类涉及拆装箱操作,所以内存的消耗比较大,并且性能也不是非常理想,在应付大量的数据时,容易导致gc以及性能较慢的问题,本文就介绍下可以用来比较好的替代这些java集合实现类的框架fastutil
fastutil 集合类
fastutil集合类通过提供各种基础类型的集合,直接去掉了泛型和boxed/unboxed的开销,不仅仅操作性能上提高了,其消耗的内存也大大减少了。这对于大的集合操作来说非常合适,可以大量的减少gc的频率,不过fastutil的集合类不是线程安全的,也就是多线程读写会有线程安全问题,只能通过工具类把这个类变成线程安全的类,然后这个线程安全的类由于加锁的粒度比较大,比如java集合的无锁并发数据结构,性能并不理想,所以想要使用线程安全的类还是使用java的无锁并发类合适,当然如果锁的粒度能满足要求,而对于内存的减少更关注的话,使用fastutil保证的线程安全的类也是可以的,我们下面就来看一下fastutil类和java集合类的一些例子
package org.example.fastutil;
import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.ints.*;
import it.unimi.dsi.fastutil.longs.Long2IntSortedMaps;
import java.util.Collections;
import java.util.List;
public class FastUtilTest {
public static void main(String[] args) {
javaList();
System.out.println("----------");
javaThreadSafeList();
System.out.println("----------");
fastutilList();
System.out.println("----------");
fastutilThreadSafeList();
}
/**
* 普通int 列表集合类
*/
private static void javaList() {
List<Integer> list = Lists.newArrayList();
list.add(100);
list.add(200);
for (Integer i : list) {
System.out.println(i);
}
}
/**
* 线程安全的普遍int 列表集合类
*/
private static void javaThreadSafeList() {
List<Integer> list = Collections.synchronizedList(Lists.newArrayList());
list.add(100);
list.add(200);
for (Integer i : list) {
System.out.println(i);
}
}
/**
* fastutil int列表集合类
*/
private static void fastutilList() {
IntArrayList list = new IntArrayList();
list.add(100);
list.add(200);
IntListIterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.nextInt());
}
}
/**
* fastutil int线程安全的列表集合类
*/
private static void fastutilThreadSafeList() {
IntList list = IntLists.synchronize(new IntArrayList());
list.add(100);
list.add(200);
IntListIterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.nextInt());
}
}
}
对fastutil集合进行遍历操作时不要直接foreach()的形式,要使用对应的迭代器,这样遍历过程中也不会有boxed/unboxed的开销了
官网:https://fastutil.di.unimi.it/docs/