java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
//Object中的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
当然,你也可以重写Object的equals方法,这儿就有个问题啦,参加公司笔试的时候相信N多人都被要求回答过这样的问题:在重写了对象的equals方法后,还需要重写hashCode方法吗?为什么?
我认为,出于程序完整性的考虑,在重写了对象的equals方法后,是有必要重写对象的hashCode方法的。
因为,你重写了equals方法,你调用它来进行对象间的比较,你可以达到你的比较目的,但是,当你想将你的对象存入类似HashSet这类对象中时,问题就出现了(没有重写hashCode方法的情况下)。
Set(集)中是不允许有重复的值的,而判断值是否重复,是通过比较他们的hashCode值的。你通过你重写后的equals比较对象,结果是相等,但用hashCode值比较他们时是不相等的,所以,为了比较结果的一致性,需要重写hashCode方法。
下面是String类重写了的equals方法和hashCode方法:
//此方法的目的是,实现在不同的String对象之间比较,比较的是他们的字符串值
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;
}
//返回的值是基于字符串的值运算出来的,
//字符串值相等则他们的hashCode值也相等,否则,不相等
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value; //字符串的值,用字符数组表示
int len = count;
//基于字符串的值产生hash值
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
问:对象的hashcode是用来干什么的?
简答:容器类经常用到hascode,比如说set判断重复值,比如说hashmap散列。等等。
分享到:
相关推荐
详细介绍和讲解Java中的==和equals区别
能够加强对java中equals与==区别的理解。
Java中的==与equals()实例方法Java中测试两个变量是否相等的方法有两个,一个是用==运算符,另一个就是object类提供的equals()方法。2
对于开发的程序员小伙伴,大家肯定对于==和equals不陌生,而且会经常用到他,那么又有几个能够说清楚了==和equals是怎么回事呢?他了呢两个有什么区别呢? 比较 == 比较的是栈中的值,基本数据类型是变量值,引用...
java中比较值大小,==和equals的区别,基本数据类型和引用数据类型比较值方法
简单介绍java中的“==”和equals
==运算符和Equals()方法区别,从网上找到的,大家看一看吧~
关于Java中==的用法与equals的用法,醉重要的是比较它们的不同之处
主要介绍了Java中==与equals的区别小结,本文总结结论:== 与 equals()比较的内容是不同的,equals()方式是String类中的方法,它用于比较两个对象引用所指的内容是否相等,而 == 比较的是两个对象引用的地址是否相等,...
==和equals方法究竟有什么区别? == 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。 ...
java中equals和==的区别.doc java中equals和==的区别.doc
主要介绍了java 中equals和==的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了java基础之 “==”与“equals”区别详解,需要的朋友可以参考下
主要介绍了Java中==运算符与equals方法的区别及intern方法详解的相关资料,需要的朋友可以参考下
【Java面试题】equals与==的区别
下面小编就为大家带来一篇Java中==符号与equals()的使用详解(测试两个变量是否相等)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了java==运算符和equals()方法的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
接触c#一年了,一直没搞懂“==”和equals之间的具体区别,今天特意研究了一番,终于豁然开朗了,高兴中!给大家分享
用此blog记录我学习的过程,文中若有不恰当的地方,还望友情指出互相学习。 一、== 主要有两种比较形式 基本数据类型(也称原始数据类型):byte,...Java中所有的类都继承自Object类,equals()方法就在Object类中被