Hashcode
引入Hash的背景
为什么的JDK中,我们为什么要引入Hash呢?我们可以来看一下。
Java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在Set 中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样的方法就会非常多了。
于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的 哈希码就可以确定该对象应该存储的那个区域。
Hash的主要目的
由上述来看,Hash算法是为了提高集合中查找元素的效率而发明的
HashCode方法
我们经常看到的HashCode方法可以这样理解
它返回的就是根据对象的内存地址换算出的一个值。这样一来,当 集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理 位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如 果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相 同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
Hash的巧妙用法
我们可以以HashMap为例,我们可以用Hash来巧妙得统计一个String字符串中出现的字符的个数
代码如下
String str = "abfdsgfgfdabs";
HashMap<Character, Integer> map = new HashMap<>();
// 统计每个字符出现的次数
for (int i = 0; i < str.length(); i++) {
map.put(str.charAt(i), map.getOrDefault(str.charAt(i), 0) + 1);
}