Skip to content

扩展guava 支持高性能原生类型集合,添加java8 lambda collector支持

License

Notifications You must be signed in to change notification settings

linlinisme/beyond-guava

 
 

Repository files navigation

beyond-guava: 在guava原有基础上提供高性能的原生类型集合,并与java原有集合一样可以支持lambda-stream流操作、collecor收集

maven引入

       <dependency>
          <groupId>com.github.linlinisme</groupId>
          <artifactId>beyond-guava</artifactId>
          <version>1.0.0</version>
      </dependency>

性能对比

原生类型性能上天生比包装类型更有优势。包装类型在java内存中是以对象的形式存在,java对象的构成包括对象头、数据部分、对齐填充三部分,所以包装类型更占内存空间,在进行运算时则需要频繁的拆箱、装箱,并且获取真正数值时因集合中保存的是对象引用并不是对象本身,所以还需要一次内存寻址。这些在很多场景下其实都是一些无谓的损耗。下面以intHashSet和HashSet为例随机add,remove,contains 数量[5000,100000]个随机整数进行一个性能测试

测试结果

avatar

从测试结果我们看到数据量越大的时候两者的之间差居是越明显,remove,contains因为刻度比例的关系看上去差距不明显,其实两者的差距也不小。

使用例子

 //原生list操作
 IntArrayList intArrayList = new IntArrayList();
        for(int i = 0; i < 50000; i++) intArrayList.add(i); 
 IntStream.rangeClosed(0,5000).boxed().collect(PrimitiveCollectors.toIntArrayList());
 
  //原生set操作
  IntHashSet intHashSet = new IntHashSet();
        for(int i = 0; i < 1000; i++){
            intHashSet.add(i);
        }
 intHashSet.stream().collect(Collectors.toList());
 IntHashSet collect = IntStream.rangeClosed(0, 100).boxed().collect(PrimitiveCollectors.toIntHashSet());                                
 
 //原生map操作
  Int2IntHashMap intHashMap = new Int2IntHashMap();

  for(int i = 0; i < 1000; i++){
            intHashMap.put(i,i);
        }
  List<Integer> keyList = intHashMap.keySet().stream().collect(Collectors.toList());
  Int2IntHashMap hashMap = keyList.stream().collect(PrimitiveCollectors.toInt2IntHashMap(i -> i, Function.identity()));
 

About

扩展guava 支持高性能原生类型集合,添加java8 lambda collector支持

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 100.0%