HashMap、HashTable和HashSet的区别及基本使用

1、HashMap与HashTable的区别

HashMapHashTable
是否线程安全非线程安全,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合线程安全
是否允许null值作为key允许null值作为key不允许null值作为key
初始容量1611
效率相对稍高相对稍低
计算hash的方法对key的hashcode进行二次hash(以获得更好的散列值)然后对table数组长度取模计算key的hashcode并对table数组长度进行取模

2、HashMap与HashSet的区别

HashSet相当于简化版的HashMap

HashMapHashSet
接口实现实现了Map接口实现了Set接口
存储目标存储键值对(Key-Value)仅存储对象
添加元素的方法put()add()
计算hashcode计算key的hashcode值使用成员对象来计算hashcode值,两个对象的hashcode值可能相同,所以需要利用equals()方法来判断对象是否相等
速度相对较快相对较慢

3、HashMap的使用

/*HashMap测试*/
HashMap<String, Integer> hashMap = new HashMap<>();

//1、添加键值对put()
hashMap.put("a",1);
hashMap.put("b",2);
hashMap.put("c",3);
hashMap.put("c",33);//使用put()方法添加元素时,元素的key不能重复,若重复则会覆盖之前的value值

//2、获取指定key的value值get()
System.out.println(hashMap.get("c"));//输出结果:33

//3、获取集合中键值对的数量size()
System.out.println(hashMap.size());//输出结果:3

//4、判断集合是否为空isEmpty()
System.out.println(hashMap.isEmpty());//输出结果:false

//5、删除键为key的键值对并返回其value值
System.out.println(hashMap.remove("a"));//输出结果:1

//6、返回集合中所有key组成的Set集合keySet()
Set<String> set=hashMap.keySet();
for (String key:set){
    System.out.println(key);
}//输出结果:b  c

//7、返回集合中所有value值组成的以Collection数据类型格式数据values()
Collection<Integer> collection=hashMap.values();
for (Integer value:collection){
    System.out.println(value);
}//输出结果:2  33

//8、将集合中每个键值对转换为Entry对象并返回所有Entry对象组成的Set集合entrySet()
Set<Map.Entry<String,Integer>> entries=hashMap.entrySet();
for (Map.Entry<String,Integer> entry:entries){
    System.out.println(entry.getKey()+":"+entry.getValue());
}//输出结果:b:2  c:33

//9、清空集合所有键值对clear()
hashMap.clear();
System.out.println(hashMap.size());//输出结果:0

4、HashSet的使用

/*HashSet测试*/
HashSet<Integer> hashSet = new HashSet<>();//创建

//1、添加元素add()
hashSet.add(1);
hashSet.add(2);
hashSet.add(3);
hashSet.add(1);
for (int i:hashSet){
    System.out.println(i);//输出结果:1 2 3
}

//2、获取集合元素个数size()
System.out.println(hashSet.size());//输出结果:3

//3、删除指定元素remove()
hashSet.remove(3);
for (int i:hashSet){
    System.out.println(i);//输出结果:1 2
}

//4、判断集合是否为空
System.out.println(hashSet.isEmpty());//输出结果:false

//5、判断集合是否包含指定元素contains()
System.out.println(hashSet.contains(2));//输出结果:true

//6、清空集合clear()
hashSet.clear();
System.out.println(hashSet.size());//输出结果:0

5、HashTable

​ HashTable的操作几乎和HashMap一致,主要的区别在于HashTable为了实现多线程安全,在几乎所有的方法上都加上了synchronized锁,而加锁的结果就是HashTable操作的效率比较低。

​ HashTable现在基本已被淘汰,单线程转为使用HashMap,多线程使用ConcurrentHashMap(详解见链接:https://www.itqiankun.com/article/concurrenthashmap-principle)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值