java中的hashtable和hashmap区别

  今天偶尔看了别人去阿里巴巴的面试题,其中有一道题就是关于题目的,大公司确实不一样啊,对于util包中的考查是不一样。这个问题先问度娘清一色的答案,鸡肋没什么参考价值。

  这两个类度娘笼统的说一个现成安全一个线程不安全。有些方法是的有些方法不是的,size方法,hashcode方法和clear方法就是。在hashtable中描述其大小的变量名为count而在hashmap中是size。这两个类分别也继承了不同的类,前者继承了一个Dictionary后者继承了AbstractMap类,他们都实现了Map接口,其中还有一点就是loadFactor加载因子,在hashtable中的允许修改加载因子的因为源码里面没有添加关键字final,而hashmap中有这个关键字。还有初始化变量threshold也是不同的,在hashtable中声明加了private关键字,而在hashmap中式默认的访问权限。父类Dictionary和AbstractMap两个区别也很大(一个明显代码都多了好多^_^),在AbstractMap中重写了Object的equals和hashcode方法,在AbstractMap中还定义了一个SimpleEntry静态内部类。

HashtableHashMapJava两种常用的哈希表实现的Map接口的实现类,它们之间有以下几个区别: 1. 线程安全性:Hashtable是线程安全的,而HashMap不是。Hashtable的所有方法都是同步的,可以在多线程环境下使用,但是会影响性能。而HashMap在多线程环境下需要通过外部同步来保证线程安全。 2. 同步性:Hashtable是通过synchronized关键字实现同步的,而HashMap不是。因此,在单线程环境下,HashMap的性能比Hashtable更好。 3. 允许null键和null值:Hashtable不允许键或值为null,而HashMap允许null键和null值。当需要存储null值时,可以选择使用HashMap。 4. 迭代器的失败-fast-fail机制:当在迭代过程对集合进行修改时,Hashtable会抛出ConcurrentModificationException异常,而HashMap则不会。这是因为Hashtable在迭代过程使用了一个modCount变量来记录集合被修改的次数,而HashMap没有。 5. 初始容量和扩容机制:Hashtable的初始容量为11,扩容时容量会翻倍加1;HashMap的初始容量为16,扩容时容量会翻倍。因此,HashMap的扩容次数相对较少,性能相对较好。 下面是一个演示HashtableHashMap区别的例子: ```java import java.util.Hashtable; import java.util.HashMap; public class HashTableHashMapDemo { public static void main(String[] args) { // 创建HashtableHashMap对象 Hashtable<Integer, String> hashtable = new Hashtable<>(); HashMap<Integer, String> hashMap = new HashMap<>(); // 添加键值对 hashtable.put(1, "One"); hashtable.put(2, "Two"); hashtable.put(3, "Three"); hashMap.put(1, "One"); hashMap.put(2, "Two"); hashMap.put(3, "Three"); // 输出键值对 System.out.println("Hashtable: " + hashtable); System.out.println("HashMap: " + hashMap); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值