黑马程序员——集合的特殊功能之HashSet集合如何保证元素的唯一性

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

HashSet集合储存的元素的唯一性是怎么保证的呢?

1.查看add方法源码:

	public boolean add(E e) {
        return map.put(e, PRESENT)==null;
        //由此可见,使用的是map的put方法
    }
2.查看map
private transient HashMap<E,Object> map;
可以看到map是HashSet的一个成员变量,但是这个成员变量是HashMap类型

3.查看HashMap,是一个类
所以add方法最终使用的是HashMap的put方法

4.查看put方法

	public V put(K key, V value) {
        if (table == EMPTY_TABLE) {		//判断哈希表是否为空,如果为空则开辟空间
            inflateTable(threshold);
        }
        if (key == null)				//判断要添加的元素是否为空
            return putForNullKey(value);
        int hash = hash(key);			//计算元素的哈希值
        int i = indexFor(hash, table.length);	//在哈希表中查找元素的哈希值
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {		//如果查找到元素的哈希值才能进到此循环中
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {	//首先判断哈希值是否相等,然后判断地址值,最后判断equals方法的结果
                V oldValue = e.value;	//如果判断结果是false,则跳出循环,直接添加该元素。
                e.value = value;
                e.recordAccess(this);
                return oldValue;		//如果走到这一步说明不会添加元素
            }
        }		//for循环结束
		//如果没进for循环或for循环的判断结果为假,则直接添加元素
        modCount++;		
        addEntry(hash, key, value, i);
        return null;
    }

5.由put方法的分析可以知道
是否可以添加则取决于hashCode()方法和equals()方法,
判断过程如下:
首先,判断哈希值,如果哈希值相同则不添加
如果哈希值不相同,看元素的equals方法比较的内容是否相同,如果也相同则不添加。


6.所以在hashSet中储存元素时得到以下结论
A:如果元素是String类型
由于String重写了hashCode()和equals()方法,所以hashSet只存储内容不同的字符串。
B:如果元素是普通自定义对象
要看该类是否重新了hashCode()和equals()方法,自动重写比较的对象的成员变量的值



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一夸克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值