另外几种Java集合框架详解续

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50521754 另外几种Java集合框架详解续作者:chszs,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50521754

另外几种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的最佳文档。

目录
相关文章
|
29天前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
25 0
|
1月前
|
算法 Java 数据处理
Java集合框架的优缺点
Java集合框架的优缺点
|
5天前
|
Java Maven 开发工具
《Java 简易速速上手小册》第5章:Java 开发工具和框架(2024 最新版)
《Java 简易速速上手小册》第5章:Java 开发工具和框架(2024 最新版)
26 1
|
9天前
|
Java 大数据 云计算
Spring框架:Java后台开发的核心
【4月更文挑战第15天】Spring框架在Java后台开发中占据核心位置,因其控制反转(IoC)、面向切面编程(AOP)、事务管理等特性提升效率和质量。Spring提供数据访问集成、RESTful Web服务和WebSocket支持。优势包括高效开发、灵活扩展、强大生态圈和广泛应用。应用于企业级应用、微服务架构及云计算大数据场景。掌握Spring对Java开发者至关重要。
|
12天前
|
存储 Java 编译器
Java集合丛林:深入了解集合框架的秘密
Java集合丛林:深入了解集合框架的秘密
15 0
Java集合丛林:深入了解集合框架的秘密
|
15天前
|
Java BI
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
|
16天前
|
存储 Java 数据库连接
java使用mp持久化框架,写入5000个字符,但是VARCHAR(255) 会报错
使用Java的MyBatis Plus框架时,如果尝试将超过VARCHAR(255)限制的字符串(如5000个字符)存入数据库,会抛出异常。解决方法是将列类型改为TEXT。可通过在实体类属性上添加`@TableField(typeHandler = JdbcType.CLOB)`注解,如`private String content;`,将属性映射到CLOB类型列,以存储更长字符串。
9 0
|
16天前
|
存储 Java
java反射——设计框架的灵魂
java反射——设计框架的灵魂
|
21天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南
|
23天前
|
Java 关系型数据库 数据库连接
52 类 110 个常用 Java 组件和框架整理
52 类 110 个常用 Java 组件和框架整理
16 0