Fastutil使用

Download Report

Transcript Fastutil使用

fastutil介绍
myz
目录
fastutil简介
fasutil的核心部分
fastutil代码实例
fastutil 简介
fastutil 扩展了java的colleciton framework ,它提供了一系列特殊类型的maps,sets,
lists 和priority queues,fastutil具有内存占用小,访问速度快,提供大的(64位)
的arrays ,sets ,lists类型,以及快速实用的二进制及文本文件的的输入输出操作。
list
collecton
set
Vector
ArrayList
LinkedList
HashSet
TreeSet
java collection framework
Hashtable
map
HashMap
TreeMap
fastutil简介
fastutil 三个核心
1、对java集合框架(collection framework)特定类型的扩展
2、支持大容器的类(big arrays, big lists, big hashsets)
3、对于二进制及文本文件的快速实用的访问类
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最重要关键是--------理解你所需要类的类名
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)) )
typt-specific classes
fastutil的组织结构
fastutil中的包是按照元素或者key的数据类型来分类的
例如:
IntSet 是在it.unimi.dsi.fastutil.ints包下
Int2ReferenceRBTreeMap也是放在it.unimi.dsi.fastutil.ints包下
所有的非基本数据类型放在饿了it.unimi.dsi.fastutil.objects包下
最后,还有一些非特殊类型的类放在了it.unimi.dsi.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
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)
big arrays
BigArrays的所有方法(一):
newBigArray( long length) 新建一个big arrays
get(int [ ] [ ] , index):返回指定下标的值
fill ( int [ ] [ ] , value):对big arrays 的值进行填充
set( int [ ] [ ] , long index , int value):设置指定位置的值为value
swap( int [ ] [ ] , long first , long second ):交换两个位置的值
add ( int [ ] [ ] array , long index , int incr):把index处的值加上incr
mul ( int [ ] [ ] , long index , int factor):把index处的值乘以factor
incr ( int [ ] [ ] , long index):把指定位置的值加1
decr ( int [ ] [ ] , long index):把指定位置的值减1
length ( int [ ] [ ] array):求big arrays 的长度
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 array
int [ ] [ ] grow( int [ ] [ ] array,long length,long preserve):让big array 长大到长度
为length ,但是只保留preserve个元素可用
int [ ] [ ] trim( int [ ] [ ] array , long length):修剪给定的big array
int [ ] [ ] setLength( int [ ] [ ] array, long length):设置给定big array的长度
equals( int [ ] [ ] a1, int [ ] [ ] a2)比较两个big array (会快)
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
fastutil----I/O
fastutil--I/O中的接口、类、枚举变量
Interface
MeasurableStream
提供一个能够获得文件或者流的长度或者跟踪当前的位置,例如:读了多少字节或者
当前文件指针位置
RepositionableStream
一个针对字节流给出定位方法的基本接口
Class
BinIO
提供一些能够更容易操作二进制I/O的static方法
FastBufferedInputStream
针对标准库中的一些输入流进行改造,能够更好的实现一些不同步或者行读取的方法,
能够更容易和更快的进行读取。
FastBufferedOutputStream
与上边相同,只不过提供的是输出流
FastByteArrayInputStream
简单快速并且更准确的实现字节输入流
FastByteArrayOutputStream
与上边的类似
FastMultiByteArrayInputStream
能够在多个阵列数组中实现简单快速和能够重新定位的字节输入流
MeasurableInputStream
实现了MeasurableStream接口中的内容
MeasurableOutputStream
同上
Enum
FastBufferedInputStream.
LineTerminator
提供了针对行结束字符的枚举
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)
该方法是从一个文件对象里读出数据,存储到一个大数组里。
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
谢谢观赏
WPS Office
Make Presentation much more fun
@WPS官方微博
@kingsoftwps