今天有幸接触到了 Trove,搜索资料后,进一步了解了Trove ,使用之后效率提升明显、内存占用量显著减少。
Trove 是一个快速、轻量级 Collection 类的集合。Trove 提供所有标准 java.util Collections 类的更快的版本以及能够直接在原语(primitive)(例如包含 int 键或值的 Map 等)上操作的 Collections 类的版本。
官方网站:http://www.open-open.com/lib/view/home/1326885882890
传统的集合类,比方说 Map
吧,它包括键和值,每个键或者值都可以是 Object
或者 8 种基本数据类型之一: byte
、 short
、 char
、 int
、 long
、 float
、 double
和 boolean
。这样就有 9 种键和 9 种值,组成 81 种不同类型的 Map
!更糟的是,只要其中一个存在缺陷,就意味着其他 80 种很可能也存在缺陷,而能够共用的代码很有限,因为为了有效地处理每种数据类型,需要分别实现算法,从而,维护的工作量太大了
HashMap
版本之外(比如 TIntIntHashMap
、 TIntObjectHashMap
等),还有 List
和 Set
类可以存储基本类型(如 TIntHashSet
、 TFloatArrayList
等)。这种体系结构甚至允许您插入自己的散列策略,以便选择对您的数据集而言可能更有效(或者更灵活)的算法。当然,支持灵活的散列算法也要付出性能代价 —— 如果散列映射成为瓶颈,很可能是因为大量地使用它,这意味着散列函数被反复不断地调用。因此,散列函数中每一点多余的开销都可能成为瓶颈。(顺便说一下,如果散列函数足够简单,JIT 编译器就可能将其编译成内联函数,这样在支持灵活的散列策略的同时又不会带来额外的开销 —— 真是免费的午餐!)
如下是一个写的集合工具类
1 import gnu.trove.THashMap;
2 import gnu.trove.TIntObjectHashMap;
3 import gnu.trove.THashSet;
4 import gnu.trove.TLinkedList;
5
6 import java.util.HashMap;
7 import java.util.HashSet;
8 import java.util.LinkedList;
9 import java.util.List;
10 import java.util.Map;
11 import java.util.Set;
12
13
14 public class CollectionFactory {
15
16 static boolean trove = true;
17
18 static {
19 if (System.getProperty("trove").equalsIgnoreCase("true"))
20 trove = true;
21 }
22
23 public static Map getHashMap() {
24 if (trove) {
25 return new THashMap();
26 } else {
27 return new HashMap();
28 }
29 }
30
31 public static TIntObjectHashMap getHashMap2() {
32 return new TIntObjectHashMap();
33 }
34
35
36
37 public static Map getHashMap(int capacity) {
38 if (trove) {
39 return new THashMap(capacity);
40 } else {
41 return new HashMap(capacity);
42 }
43 }
44
45 public static Set getHashSet() {
46 if (trove) {
47 return new THashSet();
48 } else {
49 return new HashSet();
50 }
51 }
52
53 public static Set getHashSet(int capacity) {
54 if (trove) {
55 return new THashSet(capacity);
56 } else {
57 return new HashSet(capacity);
58 }
59 }
60
61 public static List getLinkedList() {
62 if (trove) {
63 return new TLinkedList();
64 } else {
65 return new LinkedList();
66 }
67 }
68
69 }