背景
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/