Extension of Colt HashMap using Generics for storage of Objects
This is based on part of the code from Colt Project: http://acs.lbl.gov/software/colt/ The Colt Project is made before generics was introduced in Java. This means that the HashMap from Colt Project cannot be used as a drop-in replacement for Java's HashMap.
This version contains only the HashMap part of Colt Project (version 1.2.0) and adds the support for generics, so that it can now be used as a drop-in replacement for Java's HashHamp
Download
JAR also contains source code
Date | Version | File | Description |
---|---|---|---|
22. June 2013 | 1.01 | http://files.subsecret.dk/ColtHashMap101.jar | Benchmark code updated |
16. June 2013 | 1.00 | http://files.subsecret.dk/ColtHashMap100.jar | Initial release |
Changes to original code
- Removed all non-hashmap relevant code
- Fixed bug where OpenLongObjectHashMap.indexOfValue(...) and OpenIntObjectHashMap.indexOfValue(...) used "==" rather than equals for Object types.
- Created new interfaces and classes for wrapping Colt Project HashMap in Java's Map<K,V> interface.
Usage
Class | Key type | Value type |
---|---|---|
ColtIntHashMap | Int | Object |
ColtIntIntHashMap | Int | Int |
ColtQuickIntIntHashMap | Int | Int |
ColtIntDoubleHashMap | Int | Double |
ColtLongHashMap | Long | Object |
ColtDoubleIntHashMap | Double | Int |
Existing code can easily be changed to use new HashMaps's. By changing to Colt's HashMap there will be a memory saving because of more efficient storage of keys and possibly values. However the penalty for autoboxing is still present unless using put(...) and get(...) on the native type.
//From Map<Integer, String> map = new HashMap<Integer,String>(); map.put(3,"test"); //To ColtIntHashMap<String> native = new ColtIntHashMap<String>(); Map<Integer, String> map = native; map.put(3,"test"); //For maximum performance, its necessary to use the original type when putting and retrieving from the map. native.put(3,"test"); //Caveat: When using ColtIntHashMap<Integer> the compiler cannot infer which of the two put methods you want, and you need to use putNative(...) method native.putNative(3,"test");
Benchmark
JVM options: -Xms8g -Xmx8g Insertions: 20 million (7 million duplicates) get(...) 13 million Contains key: 20 million Removals: 6 million containsValue(): 100
JVM 1.6
Map | Memory usage (mb) | Insertion | get(...) (sec.) | containsKey(...) (sec.) | containsValue(...) (sec.) | Removing keys and validating (sec.) |
---|---|---|---|---|---|---|
Java HashMap | 2485 | 8 | 8 | |||
Colt HashMap | 1711 | 7 | 4 | |||
Colt (Native) HashMap | 1706 | 6.1 | 2.6 | |||
Colt (IntInt) HashMap | 1304 | 4.7 | 1.9 | |||
Colt (Quick IntInt) HashMap | 1304 | 4.8 | 1.9 |
JVM 1.7
Map | Memory usage (mb) | Insertion | get(...) (sec.) | containsKey(...) (sec.) | containsValue(...) (sec.) | Removing keys and validating (sec.) |
---|---|---|---|---|---|---|
Java HashMap | ||||||
Colt HashMap | ||||||
Colt (Native) HashMap | ||||||
Colt (IntInt) HashMap | ||||||
Colt (Quick IntInt) HashMap |
License
Packages cern.colt* , cern.jet*, cern.clhep
Copyright (c) 1999 CERN - European Organization for Nuclear Research. Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. CERN makes no representations about the suitability of this software for any purpose. It is provided "as is" without expressed or implied warranty.
Packages com.subsecret.*
Same as above.