zoukankan      html  css  js  c++  java
  • 另外几种Java集合框架具体解释续

    另外几种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("	Doubles 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("	Fastutil 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("	Peek: " + stack.peek(0) + "; After Size: " + stack.size());
            System.out.println("	Pop: " + stack.pop() + "; After Size: " + stack.size());
            System.out.println("	Peek: " + 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("	Class: " + unmodifiableIntegers.getClass().getCanonicalName());
            try{
                unmodifiableIntegers.add(15);
            }catch(Exception e){
                System.out.println("	Exception 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 + "	");
        }
    }
    

    输出为:

    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 + "	");
        }
    }
    

    输出为:

    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 + "	"));
    }
    

    输出为:

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

  • 相关阅读:
    Hibernate学习笔记
    Servlet:从入门到实战学习(3)---Servlet实例【图文】
    Servlet:从入门到实战学习(2)---Servlet生命周期
    Servlet:从入门到实战学习(1)---全·环境配置
    java复习(9)---数据库JDBC
    java复习(8)---I/O
    java复习(7)---集合类、泛型
    java复习(6)---异常处理
    C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏
    C# TTS 文本转语音中断实现方式
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7159579.html
Copyright © 2011-2022 走看看