HashOjbect之HashObjectMap(3)

本文详细介绍了哈希表的基本操作,包括如何计算哈希值对应的索引、获取哈希表中键值对的数量、判断哈希表是否为空、以及如何插入新的键值对等核心功能。同时,还探讨了当哈希冲突发生时的处理方式,并提供了扩容策略来确保哈希表的高效运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}

/**
* Returns the number of key-value mappings in this map.
*
* @return the number of key-value mappings in this map
*/
public int size() {
return size;
}

/**
* Returns <tt>true</tt> if this map contains no key-value mappings.
*
* @return <tt>true</tt> if this map contains no key-value mappings
*/
public boolean isEmpty() {
return size == 0;
}

public T put(BaseHashObject object) {
if (object == null)
return null;
int hash = object.keyHashCode();
int i = indexFor(hash, table.length);
for (BaseHashObject e = table[i]; e != null; e = e.getNext()) {
if (e.keyHashCode() == hash && (e.keyEquals(object))) {
e.copyObject(object);
return (T)e;
}
}
modCount++;
addObject(hash, object, i);
return null;
}

void addObject(int hash, BaseHashObject object, int bucketIndex) {
BaseHashObject e = table[bucketIndex];
object.setNext(e);
table[bucketIndex] = object;
if (size++ >= threshold)
resize(2 * table.length);
}
void resize(int newCapacity) {
HashObject[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
if(logger.isDebugEnabled())
{
logger.debug("resize(),threshold:"+threshold+"size:"+size);
}
return;
}

BaseHashObject[] newTable = new BaseHashObject[newCapacity];
transfer(newTable);
table = newTable;
threshold = (int)(newCapacity * loadFactor);
if(logger.isDebugEnabled())
{
logger.debug("resize(),threshold:"+threshold+"size:"+size);
}
}

void transfer(BaseHashObject[] newTable) {
BaseHashObject[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
BaseHashObject e = src[j];
if (e != null) {
src[j] = null;
do {
BaseHashObject next = e.getNext();
int i = indexFor(e.keyHashCode(), newCapacity);
e.setNext(newTable[i]);
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值