Java中==和equals()详解
java中的数据类型分为两种:
⼀、基本数据类型:
byte、short、int、long、float、double、char、boolean
⽐较它们需要⽤ == ,⽐较的是它们的值是否相等
⼆、引⽤数据类型:
也就是对基本数据类型的封装,⽤ == ⽐较的是它们的内存地址(其实还是⽐较的基本数据类型,它们的内存地址不就是int吗)。当new的时候,会给它⼀个新的内存地址,所以再通过==⽐较,就会返回false;在Object类中的equals⽅法其实⽐较的也是内存地址,⽤==和equals⽅法⽐较结果是⼀样的,但在⼀些类中把equals⽅法重写了,如String、Integer等类中,⽽不是单纯的⽐较内存地址了。
这个equals⽅法不是固定的,有需要的时候,我们根据情况⾃⼰重写。
下⾯⽤简单的代码来测试⼀下吧,⾥⾯的注释要注意看哦!其中的java源码在⽂章末尾有截图
public class Text{
public static void main(String[] args){
String str = "abcd";
String str1 = "abcd1";
int i = 1;
String str2 = new String("abcd");
//⽐较的是内存地址,内存地址是什么?⼀个16进制的整形值
//java对象内存地址经过哈希算法得出⼀个int类型数字
System.out.println( "abcd1" == str1 );
//⽤的是String的equals⽅法,对字符串进⾏挨个⽐较
System.out.println( str.equals("abcd") );
/
/在javac的时候,虚拟机把字符串⾃动组合了
System.out.println( str.equals('a'+"bcd") );
//⽐较的是内存的地址,str2创建的时候,⽤了⼀个关键字new,明确告诉虚拟机,我要⼀个新的,所以字符串"abcd"被当做⼀个新的创建,并且有⼀个新的内存地址
if (str == str2) {
System.out.println( "str == str2" );
}else{
System.out.println( "str != str2" );
//调⽤的String⾥⾯的hashCode⽅法(⽂章末尾有java源码),所以相等.那String中的hashCode⽅法算的是什么呢?难道是ASCII?
////确实是ASCII码, 作者⾃⼰算过,
//
//有些地⽅我们需要重写hashCode⽅法,什么地⽅?
//最常见的是当⼀个对象被加⼊收集对象(collection object)时,这两个函数必须⾃⼰设计。更细化的定义是:如果你想将⼀个对象A放⼊另⼀个收集对象B⾥,
//或者使⽤这个对象A为查⼀个元对象在收集对象B⾥位置的钥匙,并⽀持是否容纳,删除收集对象B⾥的元对象这样的操作,那么,equals()和hashCode()函数必须开发者⾃⼰定义。 //其他情况下,这两个函数是不需要定义的。
System.out.println( str.hashCode() );
System.out.println( str2.hashCode() );
}
//调⽤String的equals java.lang.String中964⾏equals⽅法
//字符串底层是字符数组,所以String中的equals⽅法⽤两个char数组,对⽴⾯的字符⼀个⼀个的⽐较
//
/
/对象内容的⽐较才是设计equals()的真正⽬的,Java语⾔对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间:
//对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
//反射性:x.equals(x)必须返回是“true”。
//类推性:如果x.equals(y)返回是“true”,⽽且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
//还有⼀致性:如果x.equals(y)返回是“true”,只要x和y内容⼀直不变,不管你重复x.equals(y)多少次,返回都是“true”。
//任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
//
//有些情况下,我们需要⾃⼰重写equals()⽅法,根据情况⽽定
if (str.equals(str2)) {
System.out.println( "str equals str2" );
}else{
System.out.println( "str is not equals str2" );
}
}
}
运⾏结果:
总结:
equals()方法 == : ⽐较的是基本数据类型,⽐较的是它们的值
equals(): ⽐较的是引⽤数据类型,⽐较的是引⽤数据类型,不同类型有不同的equals⽅法,根据不同的数据类型调⽤不同的equals⽅法。也可以在特殊情况下重写equals⽅法。
Object中的equals(): String中的equals(): String中的hashCode():
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论