博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashSet集合的add()方法的源码
阅读量:6004 次
发布时间:2019-06-20

本文共 2547 字,大约阅读时间需要 8 分钟。

interface Collection {    ...}
interface Set extends Collection {    ...}
class HashSet implements  {    private static final Object PRESENT = new Object();    private transient HashMap
; public HashSet() { map = new HashMap<>(); } public boolean add(E e) { //e=hello,world return .put(e, PRESENT)==null; }}
class  implements Map {    public V put(K key, V value) { //key=e=hello,world            //看哈希表是否为空,如果空,就开辟空间        if (table == EMPTY_TABLE) {            inflateTable(threshold);        }                //判断对象是否为null        if (key == null)            return putForNullKey(value);                int hash = (key); //和对象的hashCode()方法相关                //在哈希表中查找hash值        int i = indexFor(hash, table.length);        for (Entry
e = table[i]; e != null; e = e.next) { //这次的e其实是第一次的world Object k; if (e.hash == hash && ((k = e.key) == key || key.(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; //走这里其实是没有添加元素 } } modCount++; addEntry(hash, key, value, i); //把元素添加 return null; } transient int hashSeed = 0; final int (Object k) { //k=key=e=hello, int h = hashSeed; if (0 != h && k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h ^= k.(); //这里调用的是对象的hashCode()方法 // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 at default load factor). h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }}
//对应源码
addEntry(hash, key, value, i);
//
把元素添加
void addEntry(int hash, K key, V value, int bucketIndex) {    Entry
e = table[bucketIndex]; table[bucketIndex] = new Entry
(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); }
  1. hs.add("hello"
);//由于table里面没有,直接进addEntry
hs.add(
"world"
);//同上
hs.add(
"java"
);//同上
hs.add(
"world");//table里已经存在,(hash和equals相等),则在put()时,用新值替代老值。ps:这里的老值和新值都是world。

总结:

首先比较哈希值

    如果相同,继续走,比较地址值或者走equals()
    如果不同,就直接添加到集合中
按照方法的步骤来说:
    先看hashCode()值是否相同
        相同:继续走equals()方法
            返回true:说明元素重复,就不添加
            返回false:说明元素不重复,就添加到集合
        不同:就直接把元素添加到集合
如果类没有重写这两个方法,默认使用的Object()。一般磊说不会相同。
而String类重写了hashCode()和equals()方法,所以,它就把内容相同的字符串去掉,只留下一个。

开始做,坚持做,重复做

转载地址:http://uhpmx.baihongyu.com/

你可能感兴趣的文章
为了工作必须弄死面试算法题
查看>>
用visual studio 2017来调试python
查看>>
Tony's tour(poj1739,男人题之一,插头dp)
查看>>
C# 委托和事件 实现窗体间的通信
查看>>
怎么成为合格的WEB前端开发工程师
查看>>
CF459E Pashmak and Graph (DP?
查看>>
CMD命令行窗口 复制黏贴
查看>>
PHP autoload实践
查看>>
linux命令:find命令
查看>>
curl命令备注
查看>>
hdu(2859)——Phalanx(dp)
查看>>
cloudera manager的7180 web界面访问不了的解决办法(图文详解)
查看>>
Spring mvc4 + ActiveMQ 整合
查看>>
pascal+sublime搭建Pascal学习环境
查看>>
聚类(三)FUZZY C-MEANS 模糊c-均值聚类算法——本质和逻辑回归类似啊
查看>>
像屎一样的 Spring Boot入门,总算有反应了
查看>>
Device Tree碎碎念
查看>>
STM32F103ZET6 之 ADC+TIM+DMA+USART 综合实验
查看>>
oracle 锁系列
查看>>
HBuilder开发App教程06-首页
查看>>