欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HashMap、HashTable、HashSet区别

程序员文章站 2022-07-10 17:42:13
1、HashMap和HashTable1.1 hashmap是线程不安全的,hashtable线程安全(这个区别就像Vector和ArrayList一样)1.2 hashmap的key值可以为null,hashtable不行(虽然不建议这样设置)1.3 hashmap继承自AbstractMap类,而hashtable继承自Dictionary类。但二者都实现了Map接口。1.4 hashmap对key的hashcode进行了二次哈希,然后取模获得插入位置,hashtable直接使用key的hash...

1、HashMap和HashTable

1.1 hashmap是线程不安全的,hashtable线程安全(这个区别就像Vector和ArrayList一样)

1.2 hashmap的key值可以为null,hashtable不行(虽然不建议这样设置)

1.3 hashmap继承自AbstractMap类,而hashtable继承自Dictionary类。但二者都实现了Map接口。

1.4 hashmap对key的hashcode进行了二次哈希,然后取模获得插入位置,hashtable直接使用key的hashcode,位置 index = hashcode % 数组长度

2、HashSet

首先来说说set集合:

Set集合,基础自Collection。特征是插入无序,不可指定位置访问。
Set集合的实现类可说是基于Map集合去写的。通过内部封装Map集合来实现的比如HashSet内部封装了HashMap。
Set集合中不能重复(== 或 eqauls)的元素
Set集合的常用实现类有 HashSet TreeSet

hashset底层为hashmap,是线程不安全的,于此同时具有set集合的特点。
那么,hashset存放的是对象引用还是对象呢?

HashSet<MyBean> setBean = new HashSet<> ();
MyBean b1 = new MyBean(1,"B1");
MyBean b2 = new MyBean(2,"B2");
setBean.add(b1);
setBean.add(b2);
MyBean b3;
//复制引用
b3=b1;
setBean.add(b3);
System.out.println(setBean.size());

以上代码没有重写MyBean的equals()和hashcode(),输出的size为2,是否说明Set里存放的是引用而不是对象?(我自己理解的是存放的是引用,希望各位大佬能在评论区解答)

本文地址:https://blog.csdn.net/qq_26030275/article/details/109614530