文档章节

java基础入门-hashcode与equals方法

raylee2015
 raylee2015
发布于 2015/08/24 14:39
字数 537
阅读 4
收藏 0

equils方法的特性:

1.自反性,对于任何非空引用x,x.equals(x)返回true

2.对称性,对于任何引用x,y,x.equals(y)返回true,那么y.equals(x)返回true

3.传递性,对于任何应用x,y,z,如果x.equals(y)回返true,以及x.equals(z)回返true,则y.equals(z)回返true

4.一致性,如果x,y,没有变化,则x.equals(y)应该返回同意的结果

5.对于任何非空的x,x.equals(null)返回false

 

hashcode,散列码,是由对象导出的一个整型值。

 

但是,对于不同的类,他都有可能重写equals和hashcode方法

我们在平常对比两个对象的时候需要注意这两个地方

 

下面是详细的代码例子

 

package com.ray.testobject;

/**
 * equals与hashcode
 * 
 * @author ray
 * @since 2015-05-02
 * @version 1.0
 */
public class Test {
	public static void main(String[] args) {
		String a = "ok";
		String b = new String("ok");
		System.out.println(a.equals(b));
		// 下面是string里面重写的equils方法
		// 可以看见首先对比两个obj是否一致,明显不是同一个字符串
		// 然后它里面再次对比字符串里面每个字符,只要认定字符一致,则字符串一致
		// public boolean equals(Object anObject) {
		// if (this == anObject) {
		// return true;
		// }
		// if (anObject instanceof String) {
		// String anotherString = (String)anObject;
		// int n = count;
		// if (n == anotherString.count) {
		// char v1[] = value;
		// char v2[] = anotherString.value;
		// int i = offset;
		// int j = anotherString.offset;
		// while (n-- != 0) {
		// if (v1[i++] != v2[j++])
		// return false;
		// }
		// return true;
		// }
		// }

		StringBuilder asb = new StringBuilder(a);
		StringBuilder bsb = new StringBuilder(b);
		System.out.println(asb.equals(bsb));
		// 由于StringBuilder没有重写equils方法,所以调用的是object里面的equils方法
		// 下面是object里面的方法,他至对比两者指向的对象是否一致,所以返回是false
		// public boolean equals(Object obj) {
		// return (this == obj);
		// }

		// 同理,在hashcode方法里面string已经重写, 而stringbuilder却没有
		System.out.println("a.hashCode:" + a.hashCode());
		System.out.println("b.hashCode:" + b.hashCode());
		System.out.println("asb.hashCode:" + asb.hashCode());
		System.out.println("bsb.hashCode:" + bsb.hashCode());
	}
}


 

输出:

true
false
a.hashCode:3548
b.hashCode:3548
asb.hashCode:29013258
bsb.hashCode:12830537

 

由上面的代码可以看见,每个类都有可能重写相应的equals和hashcode方法,所以,

在对比对象的时候必须注意上面两个方法的使用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
私信 提问
叮!您收到一份超值Java基础入门资料!

摘要:Java语言有什么特点?如何最大效率的学习?深浅拷贝到底有何区别?阿里巴巴高级开发工程师为大家带来Java系统解读,带你掌握Java技术要领,突破重点难点,入门面向对象编程,以详细示例...

聒小小噪
2018/05/12
0
0
Java 基础:hashCode方法

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

泥沙砖瓦浆木匠
2015/04/27
1K
4
GC复制存活的对象,内存地址会变吗?以前的引用怎么办?

问题 先执行gc方法,10S后打印数组的地址,发现没变,是不是说明复制算法不改变对象的内存地址 解读 toString打印的值现有的匿名回答是正解:题主做的实验根本没有涉及对象地址。java.lang.O...

细节探索者
02/13
46
0
Java拾遗:001 - 重写 equals 和 hashCode 方法

重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被设计成可覆盖(override)的。但任何一个子类在覆盖这些方法时都应遵守一些通用...

一别丶经年
2018/08/02
114
0
Java 208 道面试题:Java 基础模块答案

目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态;第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多...

王磊的博客
03/05
582
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部