Java基础--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的扩容将重新计算所有元素在新数组中的位置,所以如果预计存放大量数据,初始容量应该设置更大。
Java基础--HashCode的更多相关文章
- JAVA基础(1)之hashCode()
JAVA基础(1)之hashCode() 看到一篇关于hashCode的文章(),写的很详细明白,瞬间有种恍然大悟的感觉,所以特地转过来.原文:http://blog.csdn.net/fenglib ...
- java基础解析系列(十一)---equals、==和hashcode方法
java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...
- Java基础系列-equals方法和hashCode方法
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
- Java基础:Object类中的equals与hashCode方法
前言 这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢. 一切皆对象 对于软件工程来说面向对象编程有一套完整的解决方案:OOA.OOD.O ...
- Java 基础:hashCode方法
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一.前言 泥瓦匠最近被项目搞的天昏地暗.发现有些要给自己一些目标,关于技术的目标: 专注很重要.专注J ...
- Java基础之hashCode方法具体解释
想要明确hashCode的作用,必须要先知道java中的集合.(不明确的请看Java基础之集合框架具体解释(二)List篇和Java基础之集合框架具体解释(三)Set篇) Java中的Collecti ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- Java基础知识【下】( 转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- Java基础应用
Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...
随机推荐
- RazorEngine性能研究(反射的延深)
先说下结论 1)RazorEngine 确实很慢,编译过程特别慢,编译过后仍不适合大量重复调用的情况(一次调用可以接受). 2 ) RazorEngine 和 asp.net mvc 里的Razo ...
- 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. ...
- hive学习2(Navicat连接hive)
Navicat连接hive 第一步:win下安装好mysql 第二步:win下安装Navicat 第三步:启动hadoop集群,启动hive 第四步:Navicat连接hive 在第四步中需先配置ss ...
- MapReduce-读取HBase
MapReduce读取HBase数据 代码如下 package com.hbase.mapreduce; import java.io.IOException; import org.apache.h ...
- VC读取文件内容
// chopper.cpp : Defines the entry point for the console application. // #include "stdafx.h&quo ...
- File类之在指定目录中查找文件
package IoDemo; import java.io.File; /** * @Title:FileDemo2 * @Description:在指定的目录中查找文件 * @author Cra ...
- 一个最简单的JMeter测试流程
环境: JMeter 3.3 JDK 1.8 首先下载JMeter安装包 可以去官网下载. http://jmeter.apache.org/ 然后选择Download Windows系 ...
- Java读取lob格式数据
想要读出lob里面的图片数据,就要确认clob里面存储的是什么,一般情况下存储的base64的串串.所以就以base64为例,而Blob里面存储的大部分是图片数据,但也有xml内容数据. 1查询lob ...
- c++ STL库deque和vector的例子
头文件wuyong.h: #pragma once #include<iostream> #include<vector> #include<deque> #inc ...
- Angular中文api
Angular中文api:http://docs.ngnice.com/api