I have read chokudai's Submission46. I saw he use HashMap. I wrote Java version of his code.
It is faster than java.util.HashMap.

result

[put, 0.337204343]
[get, 0.340456201]
[put, 0.990776216]
[get, 2.399216921]

source code

import java.util.Arrays;
import java.util.HashMap;

public class ChokudaisHashMap {
private int COUNTMAX = 1600000;
private int hashmax = (1 << 24);
private int nowhashcount;
private int[] prehash = new int[hashmax];
private int[] nextpos = new int[COUNTMAX];
private long[] keys = new long[COUNTMAX];
private int[] values = new int[COUNTMAX];

public void init() {
nowhashcount = 0;
for (int i = 0; i < hashmax; i++)
prehash[i] = -1;
}

public int get(long key) {
int h = (int) (key & (hashmax - 1));
int nowpos = prehash[h];
while (nowpos != -1) {
if (keys[nowpos] == key) {
return values[nowpos];
}
nowpos = nextpos[nowpos];
}
return 0;
}

public void put(long key, int value) {
int h = (int) (key & (hashmax - 1));
nextpos[nowhashcount] = prehash[h];
prehash[h] = nowhashcount;
keys[nowhashcount] = key;
values[nowhashcount] = value;
nowhashcount++;
}

public static void main(String[] args) {
int n = 1000000;
{
ChokudaisHashMap map = new ChokudaisHashMap();
map.init();
{
XorShift rnd = new XorShift();
long start = System.nanoTime();
for (int i = 0; i < n; i++) {
map.put(rnd.nextLong(), rnd.nextInt());
}
double time = (System.nanoTime() - start) / 1e9;
message("put", time);
}
{
XorShift rnd = new XorShift();
long start = System.nanoTime();
for (int i = 0; i < n; i++) {
int v = map.get(rnd.nextLong());
if (v != rnd.nextInt()) {
throw new RuntimeException();
}
}
double time = (System.nanoTime() - start) / 1e9;
message("get", time);
}
}
{
HashMap<Long, Integer> map = new HashMap<Long, Integer>(2 * n);
{
XorShift rnd = new XorShift();
long start = System.nanoTime();
for (int i = 0; i < n; i++) {
map.put(rnd.nextLong(), rnd.nextInt());
}
double time = (System.nanoTime() - start) / 1e9;
message("put", time);
}
{
XorShift rnd = new XorShift();
long start = System.nanoTime();
for (int i = 0; i < n; i++) {
int v = map.get(rnd.nextLong());
if (v != rnd.nextInt()) {
throw new RuntimeException();
}
}
double time = (System.nanoTime() - start) / 1e9;
message("get", time);
}
}
}

private static final void message(Object... o) {
System.err.println(Arrays.deepToString(o));
}

}

class XorShift {
private int w = 88675123;
private int x = 123456789;
private int y = 362436069;
private int z = 521288629;

/**
* Returns the next pseudorandom {@code double} value, greater than or equal to {@code 0.0} and less than {@code 1.0}.
*
* @return the next pseudorandom
*/
public double nextDouble() {
return (double) (nextInt() + (1L << 31)) / (1L << 32);
}

/**
* Returns the next pseudorandom {@code int} value, greater than or equal to {@code Integer.MIN_VALUE} and less than or equal to {@code Integer.MAX_VALUE}.
*
* @return the next pseudorandom
*/
public int nextInt() {
final int t = x ^ (x << 11);
x = y;
y = z;
z = w;
w = w ^ (w >>> 19) ^ (t ^ (t >>> 8));
return w;
}

/**
* Returns the next pseudorandom {@code long} value.
*
* @return the next pseudorandom
*/
public long nextLong() {
return ((long) nextInt() << 32) ^ (((long) nextInt() << 32) >>> 32);
}

}