Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/vlsi/compactmap

Memory efficient java.util.Map implementation modelled after http://code.google.com/apis/v8/design.html
https://github.com/vlsi/compactmap

Last synced: 2 days ago
JSON representation

Memory efficient java.util.Map implementation modelled after http://code.google.com/apis/v8/design.html

Awesome Lists containing this project

README

        

[![Build Status](https://travis-ci.org/vlsi/compactmap.svg?branch=master)](https://travis-ci.org/vlsi/compactmap)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.vlsi.compactmap/compactmap/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.vlsi.compactmap/compactmap)

CompactHashMap
==============

Usage
-----

Add Maven dependency:
```xml

com.github.vlsi.compactmap
compactmap
1.3.0

```

Gradle:
```kotlin
compile("com.github.vlsi.compactmap:compactmap:1.3.0")
```

About
-----
This is a memory efficient alternative to HashMap.
Main design goal is taken from "Fast Property Access"
http://code.google.com/apis/v8/design.html#prop_access.

This implementation however can store specific key-value pairs out of the map,
so they do not consume memory when repeated in different maps.

The expected memory consumption (8u40, 64 bit, compressed references) is as follows:

# of elements CompactHashMap HashMap (with 1.0 fillFactor)
0 32 48
1 32 104
2 32 136
3 32 176
4 64 208
5 64 256
6 64 288
7 72 320
8 72 352

In other words, the first three non default values consume the same
32 bytes, then map grows as 32 + 16 + 4 * (n-2) == 40 + 4 * n.
Regular HashMap grows as 64 + 36 * n.

The runtime of put and get is constant.
The expected runtime is as follows (measured in hashmap and array accesses):

best case worst case
get 1 hashmap + 1 array 2 hashmap
put 1 hashmap + 1 array 6 hashmap

Sample
------

``` java
// Mark height->auto a default mapping entry, so it would not consume memory in CompactHashMaps
CompactHashMapDefaultValues.add("height", "auto");

// Mark all values of width as default, so they would not consume memory in real maps
CompactHashMapDefaultValues.add("width");

CompactHashMap map = new CompactHashMap();
map.put("height", "auto"); // does not consume memory in map
map.put("width", "100%"); // does not consume memory in map either
map.put("id", "myFirstButton"); // consumes some memory

map.get("height"); // => "auto"
map.get("width"); // => "100%"
map.get("id"); // => "myFirstButton"

map.put("height", "50px"); // consumes some memory (switches from default to custom)

map.get("height"); // => "50px"
```

License
-------
This library is distibuted under terms of Apache 2.0 License, see https://raw.githubusercontent.com/vlsi/compactmap/master/LICENSE

Change log
----------
v2.0:
* Change license: LGPL 2.0 -> Apache-2.0

v1.3.0
* Improvement: implement null keys
* Improvement: `Map#toString`
* Improvement: `Map#hashCode` + `equals`
* Improvement: `Map.Entry#hashCode` + `equals`
* Improvement: `Map.Entry#toString`
* Improvement: `Map#containsValue` (it is slow but it works)
* Test: use `guava-testlib` for `Map` implementation testing

v1.2.1
* Improvement: release to Maven Central
* Improvement: fix EntrySet.remove method

v1.2.0
* Improvement: reduce size of hidden classes by using persistent dexx-collections.
* Improvement: mavenize build
* Switch to semantic versioning

v1.1
* Fix: #1 containKey returns true on non existing key
* Fix: #2 size should account removed keys
* Improvement: #3 Default values should be serialized as map

Author
------
Vladimir Sitnikov