HashCode
如果一个类的对象要用做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的扩容将重新计算所有元素在新数组中的位置,所以如果预计存放大量数据,初始容量应该设置更大。
HashCode的更多相关文章
- Java Map hashCode深究
[Java心得总结七]Java容器下——Map 在自己总结的这篇文章中有提到hashCode,但是没有细究,今天细究整理一下hashCode相关问题 1.hashCode与equals 首先我们都知道 ...
- How to implement equals() and hashCode() methods in Java[reproduced]
Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and ...
- ArrayList_HashSet的比较及Hashcode分析
ArrayList_HashSet的比较及Hashcode分析 hashCode()方法的作用 public static void main(String[] args) { Collectio ...
- OC与c混编实现Java的String的hashcode()函数
首先,我不愿意大家需要用到这篇文章里的代码,因为基本上你就是被坑了. 起因:我被Java后台人员坑了一把,他们要对请求的参数增加一个额外的字段,字段的用途是来校验其余的参数是否再传递过程中被篡改或因为 ...
- 为什么要重写hashcode() 方法
Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 那么我们怎么判断两个元素是否重复呢? 这就是 ...
- 【C#公共帮助类】给大家分享一些加密算法 (DES、HashCode、RSA、AES等)
AES 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的 ...
- JDK源码分析:hashCode()方法
提问: 1.hashCode()源码是怎么实现的. 2.hashCode()是为了配合基于散列的集合而设计的 3.hash数据结构,如何做到存取的时间复杂度为O(1)的.{函数算>逐个比较} 答 ...
- 对hashcode、equals的理解
1.首先hashcode和equals都是java每个对象都存在的方法,因为他们两是Object的方法. 2.hashcode方法默认返回的是该对象内存地址的哈希码,然而你会发现,Object类中没有 ...
- java中hashcode()和equals()的详解
今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashc ...
- Java基础知识点2:hashCode()方法
hashCode()方法基本实现 hashCode方法是Java的Object类所定义的几个基本方法之一.我们可以深入到Object类的源码中去查看: public native int hashCo ...
随机推荐
- 数据库---T-SQL语句提纲
T-SQL语句: 创建表:create table Name(Code varchar(50)) 主键:primary key自增长列:auto_increment外键关系:references非空: ...
- JavaBean组件的基本使用-语法
<jsp:useBean id="实例化对象名称" scope="保存范围" class="包.类名"> </jsp:us ...
- ThinkPHP 3.2.3 中设置和使用 Session
Session 的配置 可以在 config.php(可以是应用公用的 config.php 或模块的 config.php)中对 Session 进行配置,例如: config.php <?p ...
- the major advances since the birth of the computer
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION • The family concept: ...
- rabbitmq之消息转储vm_memory_high_watermark_paging
rabbitmq为了预防内存达到上限,会在内存使用到了一定比例后,将消息转储到磁盘去.
- Spring的RMI远程调用 - (示例)
一.定义远程服务器上接口 public interface RMIService { public String getInfo(); } 二.实现远程服务器上接口 public class RMIS ...
- linux的mount(挂载)命令
前言: 1.挂载点必须是一个目录. 2.一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用. 对于其他操作系统建立的文件系统的挂载也是这样.但是需要理解的是:光 ...
- Mac系统上用Node做APNS
1.安装Node,下载地址:http://nodejs.org 2.更新npm,终端命令:sudo npm update npm -g 3.安装apn,终端命令:npm install apn 4.导 ...
- 湖大OJ-实验E----可判定的DFA的空问题
实验E----可判定的DFA的空问题 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB Total submit ...
- 使用 robotframework 自动化测试系列 一 -----简介
robotframework 是自动化测试框架. Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可 ...