HashMap和HashTable/HashSet的区别

HashMap和HashTable的比较:

属性HashMapHashTable
线程安全非线程安全(如果要保证线程安全用ConcurrentHashMap)线程安全(内部的方法基本都被sychronized修饰)
效率高于HashTable低(因为线程安全)
对于Null  Key  和Null Value的支持null可以作为键,但只能有一个null键,可有多个键所对应的值为null不允许为null,只有键值中有一个为nul,就抛出空指针异常
初始容量和每次扩充量
  1. 不指定容量初始值,默认初始容量为16,每次扩充,容量变为原来的2倍
  2. 指定容量初始值,每次扩充,扩充为2的幂次方大小(可看源码中的tableSizeFor方法)
  1. 不指定容量初始值,默认初始大小为11,每次扩充,容量变为原来的2n+1
  2. 指定容量初始值,直接使用给定的大小      

HashMap和HashSet的比较:

看HashSet源码可发现,HashSet底层是基于HashMap实现的,除去clone()方法、writeObject()方法、readObjcet()方法是自己实现之外,其余方法都是直接调用HashMap里的方法。

属性HashMapHashTabe
实现接口实现了Map接口实现了Set接口
存储内容存储键值对,key不可重复,值可重复仅存储对象,不允许有重复值
添加元素方法put(key,value)add()
相等性判断使用键key计算Hashcode使用成员对象比较Hashcode,如果Hashcode的相同,调用equals()方法比较
效率快,因为通过唯一key获取值相对慢

 

测试代码:

public class TestHash {

    public static void main(String[] args){
        HashMap map = new HashMap();
        Hashtable table = new Hashtable();
        HashSet set = new HashSet();

        map.put("1k","1");
        map.put("2k","2");
        map.put("3k","3");
        map.put("1k","4");
        map.put("4k",null);

        table.put("1k","1");
        table.put("2k","2");
        table.put("3k","3");
        table.put("1k","4");

        set.add("1");
        set.add("2");
        set.add("3");
        set.add("1");

        System.out.println("key:8k"+" value:"+map.get("8"));//HashMap中允许一个键为空,即没有对应的key时,会返回null
        System.out.println("key:4k"+" value:"+map.get("4k"));//有对应的key,但是值为空
        //为区别以上两种情况,最好通过containsKey来判断
        System.out.println("是否含有8k这个key:"+map.containsKey("8k"));
        for(Object m:map.entrySet()){
            System.out.println("HashMap:"+m);
        }
        for(Object t :table.keySet()){
            System.out.println("HashTable:"+t);
        }
        for(Object s :set){
            System.out.println("HashSet:"+s);
        }
    }

}

结果:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值