下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Java开源的集合框架的扩展详解

作者:课课家教育     来源: http://www.kokojia.com点击数:977发布时间: 2016-04-14 15:43:07

标签: Java开源Java集合框架Java模板

大神带你学编程,欢迎选课

  fastutil是一个开源的java集合框架的扩展,它继承了Java Collection Framework,提供了数种特定类型的容器,包括映射map、集合set、列表list、优先级队列(prority queue),实现了java.util包的标准接口(还提供了标准类所没有的双向迭代器),还提供了很大的(64位)的array、set、list,以及快速、实用的二进制或文本文件的I/O操作类。

  fastutil为专用的集合类提供了大容量的功能,而且类比普通Java集合类显得更紧凑、速度更快。除了对象和原始类型,fastutil类还提供了对引用的支持,也即对象是可以使用等号操作符进行比较的,无需使用equals()方法。

Java开源的集合框架的扩展详解_Java集合框架_课课家

  fastutil以Apache 2.0许可证发布。使用它需要JDk 7以上版本。

  把元素添加到fastutil集合与添加到标准Java集合使用的API是相同的,下面的代码示例展示了插入元素到标准JDK的ArrayList和插入元素到fastutil的DoubleArrayList。

  1、插入Double对象到JDK的ArrayList和插入Double对象到fastutil的DoubleArrayList

  import java.util.ArrayList;

  import it.unimi.dsi.fastutil.doubles.DoubleArrayList;

  public class DoubleArrayListTest {

  public static void main(String[] args) {

  demoJdkArrayListForDoubles();

  demoFastutilArrayListForDoubles();

  }

  public static void demoJdkArrayListForDoubles(){

  final ArrayList doubles = new ArrayList<>();

  doubles.add(98.5);

  doubles.add(24.7);

  doubles.add(52.8);

  doubles.add(1234.3);

  doubles.add(20.0);

  System.out.println("\\tDoubles List: " + doubles);

  }

  public static void demoFastutilArrayListForDoubles(){

  final DoubleArrayList doubles = new DoubleArrayList();

  doubles.add(98.5);

  doubles.add(24.7);

  doubles.add(52.8);

  doubles.add(1234.3);

  doubles.add(20.0);

  System.out.println("\\tFastutil DoubleArrayList: " + doubles);

  }

  }

  输出为:

  Doubles List: [98.5, 24.7, 52.8, 1234.3, 20.0]

  Fastutil DoubleArrayList: [98.5, 24.7, 52.8, 1234.3, 20.0]

  从上面的代码可以看出,fastutil集合的实现与标准JDK集合的实现保持了一致。下面我们再看一个例子:

  2、使用fastutil的DoubleArrayList作为堆栈

  public static void demoFastutilDoubleStack(){

  final DoubleArrayList stack = new DoubleArrayList();

  stack.push(19.9);

  stack.push(32.1);

  stack.push(11.8);

  stack.push(3.3);

  System.out.println("Fastutil Stack of Doubles");

  System.out.println("\\tPeek: " + stack.peek(0) + "; After Size: " + stack.size());

  System.out.println("\\tPop: " + stack.pop() + "; After Size: " + stack.size());

  System.out.println("\\tPeek: " + stack.peek(0) + "; After Size: " + stack.size());

  }

  输出为:

  Fastutil Stack of Doubles

  Peek: 3.3; After Size: 4

  Pop: 3.3; After Size: 3

  Peek: 11.8; After Size: 3

  应注意DoubleArrayList的peek()方法和pop()方法均已被废弃,DoubleArrayList继承了AbstractDoubleList,抽象类AbstractDoubleList中废弃了peek()方法和pop()方法,官方建议应直接使用具体的指定类型的类提供的方法,这里也就是add()方法和getDouble()方法。

  Trove库提供了gnu.trove.TCollections类,它类似于java.util.Collections,可看作是一个子集。fastutil提供了相似的功能,但是它提供的是静态方法,且被分到指定类型或指定结构的集合类中。

  比如IntSets类,与IntLinkedOpenHashSet结合使用,正如其名字,是指定了整型类型的集合类,提供了相应的静态方法。

  3、IntSets与IntLinkedOpenHashSet结合使用

  public static void demofastutilCollectionsClass(){

  final IntLinkedOpenHashSet integers = new IntLinkedOpenHashSet();

  integers.add(43);

  integers.add(4);

  integers.add(8);

  integers.add(6);

  final IntSet unmodifiableIntegers = IntSets.unmodifiable(integers);

  System.out.println("Unmodifiable Integers: ");

  System.out.println("\\tClass: " + unmodifiableIntegers.getClass().getCanonicalName());

  try{

  unmodifiableIntegers.add(15);

  }catch(Exception e){

  System.out.println("\\tException caught: " + e);

  }

  }

  输出为:

  Unmodifiable Integers:

  Class: it.unimi.dsi.fastutil.ints.IntSets.UnmodifiableSet

  Exception caught: java.lang.UnsupportedOperationException

  fastutil支持标准Java迭代方法,使用明确定义的迭代器和Java 5引入的for-each循环。fastutil集合还支持JDK 8风格的.forEach()方法,因为fastutil集合实现了java.util.Iterable接口。下面用代码进行说明:

  4、fastutil集合以标准Java风格进行迭代

  public static void demoIterationWithIterator(){

  final LongOpenHashSet longs = new LongOpenHashSet();

  longs.add(11);

  longs.add(23401203413l);

  longs.add(3);

  longs.add(32);

  longs.add(9);

  final LongIterator longIterator = longs.iterator();

  while(longIterator.hasNext()){

  final long longValue = longIterator.next();

  System.out.print(longValue + "\\t");

  }

  }

  输出为:

  9 32 11 3 23401203413

  .

  public static void demoIteratorWithForEach(){

  final LongLinkedOpenHashSet longs = new LongLinkedOpenHashSet();

  longs.add(11);

  longs.add(23401203413l);

  longs.add(3);

  longs.add(32);

  longs.add(9);

  for(final long longValue : longs){

  System.out.print(longValue + "\\t");

  }

  }

  输出为:

  11 23401203413 3 32 9

  public static void demoIteratorWithJdk8ForEach(){

  final LongLinkedOpenHashSet longs = new LongLinkedOpenHashSet();

  longs.add(11);

  longs.add(23401203413l);

  longs.add(3);

  longs.add(32);

  longs.add(9);

  longs.forEach(longValue -> System.out.print(longValue + "\\t"));

  }

  输出为:

  11 23401203413 3 32 9

  fastutil相关的其它情况

  1)fastutil集合实现了标准JDK8集合的接口,故其API易于使用。

  2)fastutil集合通常都提供了一个带参数(以基本数据类型的array为参数)的构造器,并重写了toArray()方法,以及提供了一个指定类型的方法(比如toDoubleArray()面向Double集合)。

  3)fastutil集合通常提供了明确重写toString()的实现,易于让每一个数据元素输出,这与Java标准的Arrays.toString()不同。

  4)fastutil的包是根据原始类型与不同数据结构的实现来进行组织的,且都在同一个包中。

  5)由于每一个fastutil集合都是跟特定的原始数据类型相关,故每一个集合都不需要泛型参数,也就不存在泛型相关的问题。

  6)fastutil的API文档是学习使用fastutil的最佳文档。

赞(27)
踩(1)
分享到:
华为认证网络工程师 HCIE直播课视频教程