发表于: 2017-11-23 17:12:21

1 652


今日完成:

了解了hashmap是什么,然后听老大演讲,虽然网速原因断断续续很难受。

明日计划:

把之前代码重构一下,然后补基础。

hashmap理解:

hashmap最简单的用法就是put和set,最开始是在缓存中接触这个类型,但是当时不知道,hash就是键值对组成的,一个key对应一个value,他是通过key来索引的,就像数组的下标,而hashmap是无序的,hashmap通过hashcode对其内容进行快速查找,通过get来获取value,put来插入value,containskey检验这个对象是否已经存在。

这个类的操作流程是使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。

但是有时会出现put两个数据相同的对象进去,虽然他们的数据相同,但是引用不同,即两个对象a==b,但a.equals(b)却是false的情况下,插入时返回的hashcode是一样的,但是他们会在这个类中占两个位置,打印出来就会是这样的数据[com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1],类类型和数据都一样,但是就是分为两个数据。

因为hashmap会通过所有类的equals方法来判断是否需要在这个hashcode(HashTest@1)中放一个数据,在equals返回false的情况下就会返回两个,所以想要杜绝这个问题就需要自己重写一个equals方法,这样就可以在数据相同的情况下只生成一个节点。

public boolean equals(Object object) {
if (object == null) {
return false;
   }
if (object == this) {
return true;
   }
if (!(object instanceof HashTest)) {
return false;
   }
HashTest other = (HashTest) object;
   if (other.getI() == this.getI()) {
return true;
   }
return false;
}

此外,hashmap的大小超过了负载因子定义的容量时(负载因子的大小默认为0.75),就会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。

进度:

进行复盘任务的准备。




返回列表 返回列表
评论

    分享到