另外几种Java集合框架具体解释续

作者:chszs,未经博主同意不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

fastutil库优于Trove库的地方:Trove库已经三年未更新了,属于非活跃的开源项目。而fastutil一直在更新。fastutil有更丰富的特性。支持超大的集合(大于2^32,即4GB的集合)。文档也更丰富。

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

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

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<Double> 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的最佳文档。

另外几种Java集合框架具体解释续的更多相关文章

  1. Java集合框架GS Collections具体解释

    Java集合框架GS Collections具体解释 作者:chszs.未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs GS Collec ...

  2. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  3. 《深入理解Java集合框架》系列文章

    Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framewo ...

  4. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  5. Java集合框架类

    java集合框架类图 Collection接口(List.Set.Queue.Stack):

  6. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  7. Java集合框架面试题目

    1.为什么Map接口不继承Collection 接口? Set是无序集合,并且不允许重复的元素 List是有序的集合,并且允许重复的元素 而Map是键值对 它被视为是键的set和值的set的组合 Ma ...

  8. Java集合框架源码分析(2)LinkedList

    链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...

  9. java集合框架——Map

    一.概述 1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

随机推荐

  1. 嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av13570243/?from=search&seid=15873837810484552531 中的15-23讲

    #coding=gbk#嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av13570243/?from=search&seid=1587383 ...

  2. 【BZOJ 1588】[HNOI2002] 营业额统计(Treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  3. 【Codeforces 140A】New Year Table

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 算出来每个盘子要占用多少角度. 然后乘n看看是不是小于等于2π就好 (精度最好定在1e-7) [代码] #include <bits/s ...

  4. Mysql学习总结(44)——Linux下如何实现mysql数据库每天自动备份定时备份

    概述   备份是容灾的基础,是指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机的硬盘或阵列复制到其它的存储介质的过程.而对于一些网站.系统来说,数据库就是一切,所以做好 ...

  5. ExtJs 滚动条问题

    bodyStyle :'overflow-x:visible;overflow-y:scroll', //隐藏水平滚动条 通过这个方法可以显示或隐藏滚动条 var form = new Ext.for ...

  6. POJ-1861,Network,最小生成树水题,,注意题面输出有问题,不必理会~~

    Network Time Limit: 1000MS   Memory Limit: 30000K          Special Judge http://poj.org/problem?id=1 ...

  7. 【记录】新建Cordova项目出现ios-deploy找不到的问题

    按老流程 Cordova create helloApp Cordova platform add ios 之前一般这种操作之后就能有执行的iOS目录了,像这样   然后 Cordova build ...

  8. [转]genymotion Unable to load VirtualBox engine 某种解决办法

    genymotion Unable to load VirtualBox engine 某种解决办法 耳闻genymotion这款模拟器很强力.于是下下来试试看.我的机器上是有virtualbox的了 ...

  9. 路线统计(codevs 1482)

    题目描述 Description N个节点的有向图, 求从start到finish刚好经过时间time的总方案数 mod 502630. 输入描述 Input Description 第一行包含一个整 ...

  10. 2016 Multi-University Training Contest 7 solutions BY SYSU

    Ants 首先求出每个点的最近点. 可以直接对所有点构造kd树,然后在kd树上查询除本身以外的最近点,因为对所有点都求一次,所以不用担心退化. 也可以用分治做,同样是O(NlogN)的复杂度. 方法是 ...