java中 hashCode() 和 equals()
1. 值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址来自堆,而其本身则存储在栈中。
2. ==操作比较的是两个变量的值是否相等,
3. 对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
Object:
1-----public native int hashCode();
该方法返回的值一般是通过将该对象的内部地址转换成一个整数来实现的。
这样能保证每个对象的哈希码值不一样。
native:方法修饰符 ——(标志外部已实现)
Native方法是由另外一种语言(如c/c++,汇编)实现的本地方法。
因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于借口方法。
Native可以和其他一些修饰符连用,
但是abstract方法和Interface方法不能用native来修饰,
2-----public boolean equals(Object obj) {
return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。
由于String 、Math、还有Integer、Double。。。。
等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。
Integer 和 String中的。hashCode()、equals();
Integer:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
public int hashCode() {
return value;
}
String:
public int hashCode() {
int h = hash;
if (h == 0) {
//这就是为什么在集合set在保证一般元素无异性 比较hashcode时会很高效的原因的来源
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
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;
}
}
return false;
}
示例:
public class HashCodeAndEquals {
public static void main(String args[])
{
test1();
test2();
test3();
}
public static void test1()
{
Integer a1 = new Integer(182);
Integer a2 = new Integer(182);
System.out.println(a1 == a2);
// false
System.out.println(a1.equals(a2));
// true
System.out.println(a1.hashCode() == a2.hashCode()) ;
// true
System.out.println();
}
public static void test2()
{
Integer a1 = new Integer(182);
String s2 = new String("182");
System.out.println(a1.equals(s2));
//if (anObject instanceof String) 直接 return false,
// instanceof 表示是否是该类的一个示例,
System.out.println();
}
public static void test3()
{
String s1 = new String("182");
String s2 = new String("182");
System.out.println(s1 == s2);
// 栈值比较 false
System.out.println(s1.equals(s2));
// true
System.out.println(s1.hashCode() == s2.hashCode()) ;
// 因为覆写了hashcode,实体内同容 true
T t1 = new T();
T t2 = new T();
System.out.println(t1.hashCode() == t2.hashCode()) ;
// 地址映射比较 false
}
}
class T{
}
总结:
由上面我们可以知道
- 自定义类如无重写equals方法,equals和==是等价的。
- 如果没有重写hashCode() 则是对引用型数据内存地址的一个映射的比较,肯定不同
- Integer的 hashCode和equals则都是比较 值:
- String的equals则是比较实体是否相同,而hashCode则是一个 value[] 值的哈希值
- (String实例极小极小可能会出现hashCode值相同,但equals不同)
(但是,equals相同时,hashCode一定相同)
java中 hashCode() 和 equals()的更多相关文章
- java 中hashcode和equals 总结
一.概述 在Java中hashCode的实现总是伴随着equals,他们是紧密配合的,你要是自己设计了其中一个,就要设计另外一个.当然在多数情况下,这两个方法是不用我们考虑的,直 ...
- java中hashcode()和equals()的详解
今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashc ...
- Java中hashcode,equals和==
hashcode方法返回该对象的哈希码值. hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先通过has ...
- java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- java中hashCode()与equals()详解
首先之所以会将hashCode()与equals()放到一起是因为它们具备一个相同的作用:用来比较某个东西.其中hashCode()主要是用在hash表中提高 查找效率,而equals()则相对而言使 ...
- 深入探究Java中hashCode()和equals()的关系
目录 一.基础:hashCode() 和 equals() 简介 equals() hashCode() 二. 漫谈:初识 hashCode() 与 equals() 之间的关系 三. 解密:深入理解 ...
- Java中HashCode()和equals()的作用
引言 我们知道Java中的集合(Collection)大致可以分为两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 这里就引出一个问题: ...
- Java中hashCode、equals、==的区别
ref:http://www.cnblogs.com/skywang12345/p/3324958.html 1.==作用: java中的==用来判断两个对象的地址是否相等:当对象是基本数据类型时,可 ...
- java中hashCode和equals什么关系,hashCode到底怎么用的
Object类的hashCode的用法:(新手一定要忽略本节,否则会很惨) 马 克-to-win:hashCode方法主要是Sun编写的一些数据结构比如Hashtable的hash算法中用到.因为ha ...
随机推荐
- d3 使用数据
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 20140323组队赛 2012福建省第三届ACM省赛题目
A - Solve equation Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- 如果dom节点是动态添加进页面的,在页面节点绑定事件如何解决的问题。
如果dom节点是动态添加进页面,想在节点绑定事件,传统的做法就是遍历节点,但会出现问题,也肯能有其他的办法,突然想到 可以依据事件冒泡,这样就不惧页面后添加节点而不响应事件的问题.比较结实.示例代码如 ...
- UVA - 10050 Hartals
#include <cstdio> #include <cstring> ]; ]; int main() { int t; scanf("%d", &am ...
- 浅谈APP的分享功能,有时候社交裂变形式比内容更“重要”
回顾2018年的移动互联网,“社交裂变”“下沉”等成为年度关键词.一方面我们可以看到社交裂变助推用户增长,另一方面我们也看到了以拼多多.趣头条为代表的互联网企业对于社交裂变模式表现出的空前关注度.作为 ...
- ABP开发框架前后端开发系列---(2)框架的初步介绍
在前面随笔<ABP开发框架前后端开发系列---(1)框架的总体介绍>大概介绍了这个ABP框架的主要特点,以及介绍了我对这框架的Web API应用优先的一些看法,本篇继续探讨ABP框架的初步 ...
- Xamarin.Forms中为WebView指定数据来源Source
Xamarin.Forms中为WebView指定数据来源Source 网页视图WebView用来显示HTML和网页形式内容.使用这种方式,可以借助网页形式进行界面设计,并利于更新和维护.WebVi ...
- 用LCT解一类动态图的问题
很显然,学过了LCT,大家一定都会用LCT来维护动态树结构了 那么,遇到图问题的时候,是不是也能用lct来解决呢? 解决图问题的时候,我们必须要仍然维护一棵树的形态,否则,lct是做不动的 那么下面来 ...
- chrome mac 快捷键
⌘-N 打开新窗口. ⌘-T 打开新标签页. ⌘-Shift-N 在隐身模式下打开新窗口. 按 ⌘-O,然后选择文件. 在 Google Chrome 浏览器中打开计算机中的文件. 按住 ⌘ 键,然后 ...
- 用Redis存储Tomcat集群的Session(转载)
本文转自http://blog.csdn.net/chszs/article/details/42610365 感谢作者 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署, ...