fastutil简介

16
fastutil 介介 myz

Upload: galena-hanson

Post on 02-Jan-2016

34 views

Category:

Documents


8 download

DESCRIPTION

fastutil 介绍 myz. fastutil简介. fastutil代码实例. fasutil的核心部分. 目录. fastutil 简介. fastutil 扩展了java的colleciton framework ,它提供了一系列特殊类型的maps,sets, - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: fastutil简介

fastutil介绍

myz

Page 2: fastutil简介

目录

fastutil 简介

fastutil 代码实例

fasutil 的核心部分

Page 3: fastutil简介

fastutil 简介

fastutil 扩展了 java 的 colleciton framework ,它提供了一系列特殊类型的 maps,sets,lists 和 priority queues , fastutil 具有内存占用小,访问速度快,提供大的( 64位)的 arrays ,sets ,lists 类型,以及快速实用的二进制及文本文件的的输入输出操作。

java collection framework

collecton

map

list

set

VectorArrayListLinkedListHashSet

TreeSet

Hashtable

HashMap

TreeMap

Page 4: fastutil简介

fastutil 简介

fastutil 三个核心

1 、对 java 集合框架 (collection framework) 特定类型的扩展

2 、支持大容器的类 (big arrays, big lists, big hashsets)

3 、对于二进制及文本文件的快速实用的访问类

Page 5: fastutil简介

typt-specific classes

在 java 里面, colleciton framework 的使用运用了泛型,而 fastutil 实现了更为严格的接口来扩展和强化 java 标准的接口。( 例如: Int2SortedMap , Long2IntHashMap , ShortArrays , IntListIterator)

8 种基本数据类型加上引用类型的组合,使得 fastutil 包含了 1794 个类

以至于在 API 中特地强调了这么一句话:( 原文如下 )The huge number of classes required a suitable division in subpackages (more than anything else, to avoid crashing browsers with a preposterous package summary).

所以学习 fastutil 最重要关键是 -------- 理解你所需要类的类名

Page 6: fastutil简介

typt-specific classes

Colleciotns 的命名:

value type collection type

Maps 的命名:

keytype2valuetype maptype

举例说明:<1> IntOpenHashSet 是一个存储 integers 类型的 hashset ,它同时实现了 IntSet 接口<2> Long2IntAVLTreeMap 是一个 key值为 long ,value 值为 int 并且用 AVLTree来构建 map, 它实现了 Long2IntMap 接口<3> Reference2ReferenceOpenHashMap 类似于 java 里面的 IdentityHashMap (一个用 hash 表实现了 map 接口的类,元素的相等性判断使用引用类型判断 , 而不是用 (k1==null ? k2==null : k1.equals(k2)) )

Page 7: fastutil简介

typt-specific classes

fastutil 中的包是按照元素或者 key 的数据类型来分类的

例如:

IntSet 是在 it.unimi.dsi.fastutil.ints 包下Int2ReferenceRBTreeMap 也是放在 it.unimi.dsi.fastutil.ints 包下所有的非基本数据类型放在饿了 it.unimi.dsi.fastutil.objects 包下最后,还有一些非特殊类型的类放在了 it.unimi.dsi.fastutil 包下

fastutil 的组织结构

Page 8: fastutil简介

typt-specific classes

在 fastutil 中增添了不少新特性:

例如:1 、 HashSet 增加了一个 get() 方法( java 中要用迭代器),返回集合中的值。2 、迭代器 iterators 是双向的( java 中 iterator 只能是单向移动,只有 ListIterator 可以双向移动),所有的迭代器都有 nexttype() 方法,直接返回一个基本数据类型,也可以用 previous() 向前迭代。3 、可以通过数组或者迭代器轻松的构造一个 sets (在 java 里面要用 add 或者 addll 方法才可以),例如快速的创建一个 Strings 的 set new ObjectOpenHashSet(new String[] { " foo " , " bar " }); 或者用迭代器: new IntArrayList( iterator )4 、基于树的类一般都有两种选择: AVL 和红黑树( java 中,元素是存储在 RB 树中),都是自平衡的二叉查找树,红黑树删除操作快,所以处理小规模树的时候用红黑树,处理大数据集的时候用 AVL 树, AVL 有更新速度慢,但是搜索速度快的特点

看一个 example

Page 9: fastutil简介

big arrays

BigArrays 是一个提供了静态方法的类,用来处理大数组BigArrays 的表现形式是“数组的数组”,比如一个 integers 元素类型的大数组,其实就是一个二维数组 int [] [] 。假如 a 是一个大数组, a[0],a[1],…… 被称为是大数组的分段( segment ),所有的分段最大长度是 SEGMENT_SIZE(2^27)可以这样理解 Big Arrays 在小于 2^27 个元素的时候是一维数组,当大于此数后就自动扩充为二维数组。

big arrays 的分类是按数据类型分的 ( 下面十个类分别放在不同的包里 )

BigArrays , IntBigArrays , ByteBigArrays , CharBigArrays , DoubleBigArrays , FloatBigArrays , LongBigArrays , ObjectBigArrays , ShortBigArrays , BooleanBigArrays ( 8 个基本数据类型加上 Object 和 BigArrays )

Page 10: fastutil简介

big arrays

BigArrays 的所有方法 ( 一 ) :

newBigArray( long length) 新建一个 big arraysget ( int [ ] [ ] , index ) : 返回指定下标的值fill ( int [ ] [ ] , value) :对 big arrays 的值进行填充 set ( int [ ] [ ] , long index , int value ) :设置指定位置的值为 valueswap( int [ ] [ ] , long first , long second ):交换两个位置的值 add ( int [ ] [ ] array , long index , int incr):把 index 处的值加上 incr mul ( int [ ] [ ] , long index , int factor):把 index 处的值乘以 factorincr ( int [ ] [ ] , long index):把指定位置的值加 1decr ( int [ ] [ ] , long index):把指定位置的值减 1length ( int [ ] [ ] array):求 big arrays 的长度

Page 11: fastutil简介

fastutil 简介

BigArrays 的所有方法(二)

copy(itn[][] srcArray ,long srcPos,int[][] destArray,long destPos,long length) copyFromBIg(int[][] rcArray , long srcPos ,int[] destArray , int destPos, int length) copyToBig(int[][] srcAray , int srcPos , int[][] destArray , long destPos , long length) int [ ] [ ] warp ( int [ ] array ):把一个标准数组转化成 big arrayint [ ] [ ] grow( int [ ] [ ] array,long length,long preserve) :让 big array 长大到长度为 length ,但是只保留 preserve 个元素可用int [ ] [ ] trim( int [ ] [ ] array , long length) :修剪给定的 big arrayint [ ] [ ] setLength( int [ ] [ ] array, long length):设置给定 big array 的长度equals( int [ ] [ ] a1, int [ ] [ ] a2) 比较两个 big array (会快)

Page 12: fastutil简介

fastutil 简介

BigArrays 所有方法(三)

quickSort( int [ ] [ ] x ,long from ,long to, IntComparator comp)quickSort( int [ ] [ ] x , IntComparator comp)quickSort( int [ ] [ ] x, long from,long to)quickSort( int [ ] [ ] x)

binarySearch(int [ ] [ ] a, long from ,long to ,int key)二分查找在 big array 中从下标为 from 到 to 中查找 key ,返回下标值binarySearch(int [ ] [ ] a,int key)二分查找在 big array 中查找 key ,返回下标值radixSort ( ) 基数排序Shuffle( int [ ] [ ] a ,long from, long to ,Randomo random)Shuffle( int [ ] [ ] a ,Random random)混排算法(用的是 Knuth 混排算法)big arrays 的 example

Page 13: fastutil简介

fastutil----I/O

fastutil--I/O 中的接口、类、枚举变量Interface

MeasurableStream 提供一个能够获得文件或者流的长度或者跟踪当前的位置,例如:读了多少字节或者当前文件指针位置

RepositionableStream 一个针对字节流给出定位方法的基本接口

ClassBinIO 提供一些能够更容易操作二进制 I/O的 static方法

FastBufferedInputStream 针对标准库中的一些输入流进行改造,能够更好的实现一些不同步或者行读取的方法,能够更容易和更快的进行读取。

FastBufferedOutputStream 与上边相同,只不过提供的是输出流

FastByteArrayInputStream 简单快速并且更准确的实现字节输入流

FastByteArrayOutputStream 与上边的类似

FastMultiByteArrayInputStream 能够在多个阵列数组中实现简单快速和能够重新定位的字节输入流

MeasurableInputStream 实现了MeasurableStream接口中的内容

MeasurableOutputStream 同上

EnumFastBufferedInputStream.LineTerminator

提供了针对行结束字符的枚举

Page 14: fastutil简介

fastutil----I/O

public static BooleanIterator asBooleanIterator(File file)将一个文件的内容存入一个迭代器对象

public static byte[] loadBytes(File file)从给定的文件对象中读出数据,存储到一个字节数组里面(类似的方法有, loadInts , loadChars , loadDoubles , loadFloats , loadLongs , loadShorts )用这些方法的时候有一个非常大限制,假设新创建一个 txt 文档,然后输入一些字符并保存,用上述方法是无法读取(乱码),只有 loadBytes() 才能正常读取,如果要使用上述方法,必须配套使用 storeX() 方法。

public static byte[][] loadBytesBig(File file)该方法是从一个文件对象里读出数据,存储到一个大数组里。

Page 15: fastutil简介

fastutil----I/O

FastBufferedInputStream---------- 用法与熟知的 BufferedInputStream 相同

使用方法:文本的一行内容为: I am a good student.

FastBufferedInputStream fbin = new FastBufferedInputStream(new FileInputStream(file));

byte[] buffer = new byte[10];int count = fbin.readLine(buffer);System.out.println(count);System.out.println(new String(buffer));

输出结果: 10   I am a goo

Page 16: fastutil简介

谢谢观赏

WPS OfficeMake Presentation much more fun

@WPS官方微博

@kingsoftwps