android 面试(基础篇 7)

本文详细对比了Java中HashMap与HashTable的七个主要区别,包括它们的实现方式、线程安全性、对null值的支持情况、提供的方法差异、迭代器类型、初始容量与扩容策略以及哈希值计算的不同。

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

Java中hashmap和hashtable的区别

1)继承和实现的区别

    Hashtable是基于成就的Dictonary类,完成了Map接口;HashMap是java1.2引进的Map接口的

    一个实现,继承于AbstractMap,AbstractMap完成了Map接口。


2)线程安全不同

    HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap。


3)对null的处理

    HashTable不允许null值(key和value值都不行),HashMap允许null(key和value都可以)。即

    HashTable不允许null值其实在编译期不会有任何不一样,会照样执行。但是在运行时会报空指针异常

    HashMap允许null值是指可以有一个或多个键对应的值为null。当get()方法返回null时,即可表示

    HashMap中没有该键,也可以表示该键对应的值是null。因此HashMap不能用get方法判断是否包含

    某个键,而是应该用containsKey方法来判断。


4)方法不同

    HashTable有一个contains方法和HashMap中的containsKey功能一样


5)HashTable使用Enumeration,HashMap使用Iteator。


6)HashTable中hash数组默认大小是11,增加方式是old*2+1,HashMap中hash数组的默认大小是16,

    而且一定是2的指数。


7)哈希值得使用不同,HashTable直接使用对象hashCode,代码是这样的:

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;


HashMap重新计算hash值,而且用与代替求摸:

int hash = hash(k);
int i = indexFor(hash, table.length);

static int hash(Object x) {
  int h = x.hashCode();
  h += ~(h << 9);
  h ^= (h >>> 14);
  h += (h << 4);
  h ^= (h >>> 10);
  return h;
}

static int indexFor(int h, int length) {
  return h & (length-1);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值