日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java map 优化_java.util.map和java.util.set的优化实现?

發布時間:2025/3/12 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java map 优化_java.util.map和java.util.set的优化实现? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

您可以通過以下方式節省一點內存:

(a)使用A

更強、更寬的哈希代碼

因此

避免儲存鑰匙

;

(b)從陣列中分配自己,

避免為每個哈希表條目創建單獨的對象

.

如果它是有用的,這里是一個不加修飾的Java實現

數字接收器

我有時發現哈希表很有用。您可以直接在一個字符序列(包括字符串)上鍵入鍵,否則您必須自己為您的對象設計一個強大的64位哈希函數。

記住,這個實現

不儲存鑰匙

,因此,如果兩個項目具有相同的哈希代碼(按照2^32的順序進行哈希處理后會得到相同的哈希代碼,或者如果具有良好的哈希函數,則會有幾十億個項目),則一個項目將覆蓋另一個項目:

public class CompactMap implements Serializable {

static final long serialVersionUID = 1L;

private static final int MAX_HASH_TABLE_SIZE = 1 << 24;

private static final int MAX_HASH_TABLE_SIZE_WITH_FILL_FACTOR = 1 << 20;

private static final long[] byteTable;

private static final long HSTART = 0xBB40E64DA205B064L;

private static final long HMULT = 7664345821815920749L;

static {

byteTable = new long[256];

long h = 0x544B2FBACAAF1684L;

for (int i = 0; i < 256; i++) {

for (int j = 0; j < 31; j++) {

h = (h >>> 7) ^ h;

h = (h << 11) ^ h;

h = (h >>> 10) ^ h;

}

byteTable[i] = h;

}

}

private int maxValues;

private int[] table;

private int[] nextPtrs;

private long[] hashValues;

private E[] elements;

private int nextHashValuePos;

private int hashMask;

private int size;

@SuppressWarnings("unchecked")

public CompactMap(int maxElements) {

int sz = 128;

int desiredTableSize = maxElements;

if (desiredTableSize < MAX_HASH_TABLE_SIZE_WITH_FILL_FACTOR) {

desiredTableSize = desiredTableSize * 4 / 3;

}

desiredTableSize = Math.min(desiredTableSize, MAX_HASH_TABLE_SIZE);

while (sz < desiredTableSize) {

sz <<= 1;

}

this.maxValues = maxElements;

this.table = new int[sz];

this.nextPtrs = new int[maxValues];

this.hashValues = new long[maxValues];

this.elements = (E[]) new Object[sz];

Arrays.fill(table, -1);

this.hashMask = sz-1;

}

public int size() {

return size;

}

public E put(CharSequence key, E val) {

return put(hash(key), val);

}

public E put(long hash, E val) {

int hc = (int) hash & hashMask;

int[] table = this.table;

int k = table[hc];

if (k != -1) {

int lastk;

do {

if (hashValues[k] == hash) {

E old = elements[k];

elements[k] = val;

return old;

}

lastk = k;

k = nextPtrs[k];

} while (k != -1);

k = nextHashValuePos++;

nextPtrs[lastk] = k;

} else {

k = nextHashValuePos++;

table[hc] = k;

}

if (k >= maxValues) {

throw new IllegalStateException("Hash table full (size " + size + ", k " + k);

}

hashValues[k] = hash;

nextPtrs[k] = -1;

elements[k] = val;

size++;

return null;

}

public E get(long hash) {

int hc = (int) hash & hashMask;

int[] table = this.table;

int k = table[hc];

if (k != -1) {

do {

if (hashValues[k] == hash) {

return elements[k];

}

k = nextPtrs[k];

} while (k != -1);

}

return null;

}

public E get(CharSequence hash) {

return get(hash(hash));

}

public static long hash(CharSequence cs) {

if (cs == null) return 1L;

long h = HSTART;

final long hmult = HMULT;

final long[] ht = byteTable;

for (int i = cs.length()-1; i >= 0; i--) {

char ch = cs.charAt(i);

h = (h * hmult) ^ ht[ch & 0xff];

h = (h * hmult) ^ ht[(ch >>> 8) & 0xff];

}

return h;

}

}

總結

以上是生活随笔為你收集整理的java map 优化_java.util.map和java.util.set的优化实现?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。