如果一个类的对象要用做hashMap的key,那么一定要注意覆盖该类的equals和hashCode方法。

equals()是基类Object的方法,用于判断对象是否有相同地址及是否为同一对象

public boolean equals(Object obj) {
return (this == obj);
}

hashCode()是基类Object的native方法,返回int。

hashCode的通用约定:

1.在程序运行期间,只要对象不改变,hashCode方法返回的值始终如一。

2.若两个对象equals方法返回相同,hashCode也应该相同。

3.若两个对象equals方法返回不同,hashCode也应该不同。

根据上面的约定,覆盖hashCode方法时注意:

1.需使用对象属性中关键且独立的部分

2.不要使用equals方法中未使用的属性

3.使用equals方法中使用的属性

String类的hashCode方法:

 public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

32*d == d<<5   aka   31*d == d<<5-d

一个例子:

----------------------------

 class TestClass {
// 若类较复杂,建议将hashCode缓存,以提高性能
private volatile int hashCode = 0; private int i;
private boolean b;
private char c; // 或byte short
private long l;
private float f;
private double d;
private int[] aa;
private String s; @Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o.getClass() == getClass())) {
return false;
}
TestClass ot = (TestClass) o;
return i == ot.i && b == ot.b && c == ot.c && l == ot.l && Float.compare(f, ot.f) == 0 && Double.compare(d, ot.d) == 0
&& Arrays.equals(aa, ot.aa) && s.equals(ot.s);
} @Override
public int hashCode() {
int result = hashCode;
if (result == 0) {
result = 31 * result + i;
result = 31 * result + Boolean.hashCode(b);
result = 31 * result + (int)c;
result = 31 * result + Long.hashCode(l);
result = 31 * result + Float.hashCode(f);
result = 31 * result + Double.hashCode(d);
result = 31 * result + Arrays.hashCode(aa);
result = 31 * result + s.hashCode();
hashCode = result;
}
return result;
} @Override
public String toString(){
//略
return s;
} }

----------------------------

HashMap

HashMap默认初始容量16,加载因子0.75,容量也就是内部数组table的大小,总是2的n次方,table中的元素为链表,链表的元素为包含key,value,hash和下一元素的Entry。

put方法根据key的hashCode来计算元素在table中的存放位置,不同的key将均匀的散列在table中。

HashMap的扩容将重新计算所有元素在新数组中的位置,所以如果预计存放大量数据,初始容量应该设置更大。

Java基础--HashCode的更多相关文章

  1. JAVA基础(1)之hashCode()

    JAVA基础(1)之hashCode() 看到一篇关于hashCode的文章(),写的很详细明白,瞬间有种恍然大悟的感觉,所以特地转过来.原文:http://blog.csdn.net/fenglib ...

  2. java基础解析系列(十一)---equals、==和hashcode方法

    java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...

  3. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

  4. Java基础:Object类中的equals与hashCode方法

    前言 这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢. 一切皆对象   对于软件工程来说面向对象编程有一套完整的解决方案:OOA.OOD.O ...

  5. Java 基础:hashCode方法

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一.前言 泥瓦匠最近被项目搞的天昏地暗.发现有些要给自己一些目标,关于技术的目标: 专注很重要.专注J ...

  6. Java基础之hashCode方法具体解释

    想要明确hashCode的作用,必须要先知道java中的集合.(不明确的请看Java基础之集合框架具体解释(二)List篇和Java基础之集合框架具体解释(三)Set篇) Java中的Collecti ...

  7. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  8. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  9. Java基础应用

    Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...

随机推荐

  1. RazorEngine性能研究(反射的延深)

    先说下结论 1)RazorEngine 确实很慢,编译过程特别慢,编译过后仍不适合大量重复调用的情况(一次调用可以接受). 2 )   RazorEngine 和 asp.net mvc 里的Razo ...

  2. java resources 红叉 Cannot change version of project facet Dynamic Web Module to 2.5

    在使用maven导入项目的时候,markers提示Cannot change version of project facet Dynamic Web Module to 2.5,不能将工程转换为2. ...

  3. hive学习2(Navicat连接hive)

    Navicat连接hive 第一步:win下安装好mysql 第二步:win下安装Navicat 第三步:启动hadoop集群,启动hive 第四步:Navicat连接hive 在第四步中需先配置ss ...

  4. MapReduce-读取HBase

    MapReduce读取HBase数据 代码如下 package com.hbase.mapreduce; import java.io.IOException; import org.apache.h ...

  5. VC读取文件内容

    // chopper.cpp : Defines the entry point for the console application. // #include "stdafx.h&quo ...

  6. File类之在指定目录中查找文件

    package IoDemo; import java.io.File; /** * @Title:FileDemo2 * @Description:在指定的目录中查找文件 * @author Cra ...

  7. 一个最简单的JMeter测试流程

    环境:     JMeter   3.3 JDK 1.8 首先下载JMeter安装包  可以去官网下载. http://jmeter.apache.org/ 然后选择Download Windows系 ...

  8. Java读取lob格式数据

    想要读出lob里面的图片数据,就要确认clob里面存储的是什么,一般情况下存储的base64的串串.所以就以base64为例,而Blob里面存储的大部分是图片数据,但也有xml内容数据. 1查询lob ...

  9. c++ STL库deque和vector的例子

    头文件wuyong.h: #pragma once #include<iostream> #include<vector> #include<deque> #inc ...

  10. Angular中文api

    Angular中文api:http://docs.ngnice.com/api