Hashtable和HashMap的几点区别

1、关于驼峰命名 Hashtable 是java1.0创建的,而集合的定义是之后约定的为啥没有完善也无从可知;而HashMap显然符合
2、从安全的方法:HashMap 是非同步的;而Hashtable 是同步的,一些方法被synchronized关键字修饰(put、remove、get和clean),这也导致了效率会比较低
3、索引(定位算法):
Hashtable的索引 是通过(key的hash值&0x7FFFFFF)%表的容量(table.length)
在这里插入图片描述
而HashMap 是通过计算(表的容量-1)&表的hash值hash
4、插入方式
Hashtable 插入时是头插法在这里插入图片描述
而HashMap 是尾插法
如果e是最后的结点,则后面直接创建一个此结点,而且如果结点数超过(treeify_threshold)TREEIFY_THRESHOLD=8 存储的结构是红黑树在这里插入图片描述
5、扩容方式不同:初始值也不一样 table是11 ;map是16 加载因子都是0.75
Hashtable是通过计算 newCapacity=(oldCapacity << 1) + 1;(左移1位即旧容量乘以2)+1
而HashMap扩容后 旧容量值乘以2即可
在这里插入图片描述
6、Iterator在测试时 Hashtable 不是快速失败的 而在HashMap 实现时 是快速失败的

   @Test
    public  void Test2(){
        HashMap<Integer, Person> hashMap1 = new HashMap<>();
        Person person = new Person("zhao",23,1213L);
        Person hahah = new Person("hahah", 22, 1232L);
        hashMap1.put(1,person);
        hashMap1.put(2,hahah);

        System.out.println("hashmap entryset");
        Iterator<Map.Entry<Integer, Person>> iterator = hashMap1.entrySet().iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("hashmap values");
        Iterator<Person> iterator1 = hashMap1.values().iterator();
        while (iterator1.hasNext()){
            System.out.println(iterator1.next());
        }
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("h1", "1");
        hashMap.put("h2", "2");
        hashMap.put("h3", "3");

        Iterator<Map.Entry<String, String>> iterator2 = hashMap.entrySet().iterator();



        Iterator<String> iterator3 = hashMap.values().iterator();
        System.out.println("values方法");
        while (iterator3.hasNext()){
            System.out.println(iterator3.next());
        }
        hashMap.remove(iterator2.next().getKey());
        System.out.println("remove方法");
        System.out.println("entrySet方法");
        while (iterator2.hasNext()) {
            System.out.println(iterator2.next());
        }
    }

会抛出一个java.util.ConcurrentModificationException异常这在1.8JDKapi中有介绍在这里插入图片描述
在测试中当存放类型是 自定义类型的对象 如Person 就不会报错

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值