java中==与equals的区别及理解,java == 和equals
==的分析
1、对于基本数据类型,比较的是他们的具体内容是不是一样,跟他们的内存地址无关。
举个例子:
公共类测试{
公共静态void main(String[] args) {
int i=10
双j=10.0
浮动m=10.0f
char k=10
布尔b=真;
系统。出去。println(I==j);
系统。出去。println(I==m);
系统。出去。println(m==k);
系统。出去。println( * * * * * * * * * * * * * * * * * * *);
//系统。出去。println(I==b);很明显,布尔型不能和其他基本数据类型比较,编译报错。
系统。出去。println(系统。身份hashcode(I));
系统。出去。println(系统。身份hashcode(j));
系统。出去。println(系统。身份hashcode(m));
系统。出去。println(系统。身份hashcode(k));
系统。出去。println(系统。身份hashcode(b));
}
}输出:
真实的
真实的
真实的
*******************
366712642
1829164700
2018699554
1311053135
118352462相关视频教程推荐:java免费视频教程
分析:
根据比较的结果和内存地址来看,内容一样,内存地址不一样,但是返回的结果都是没错,说明比较的时候只看变量中存储的内容是否相同,而跟内存地址无关。
==比较的两边数据需要能强制转换成同一类型,比如(同国际组织)国际组织和两倍的比较,会强制转换到双倍。
布尔类型不能和int,float,double,char等基本数据类型做比较,编译时就报错。
2、对于引用数据类型的比较:
公共类测试{
公共静态void main(String[] args) {
测试t1=新测试();
测试T2=新测试();
字符串名称1=琼宝;
字符串名称2=琼宝;
系统。出去。println(名称1==名称2);//真
系统。出去。println(系统。身份hashcode(名称1));//366712642
系统。出去。println(系统。identity hashcode(name 2));//366712642
系统。出去。println(t1==T2);//假
系统。出去。println(系统。身份hashcode(t1));//366712642
系统。出去。println(系统。身份哈希码(T2));//1829164700
系统。出去。println(系统。identity hashcode(new Test()));//2018699554
系统。出去。println(系统。identity hashcode(new Test()));//1311053135
System.out.println(新测试()==新测试());
}
}输出:
真实的
366712642
366712642
错误的
366712642
1829164700
2018699554
1311053135
错误的分析:
对于引用数据类型,此时涉及到两块内存的问题,而且比较的也是内存地址是否相同,比如执行语句:
测试t1=新测试()测试t2=新测试()时,会开辟两块内存,一块用于储存t1 t2,一块用于储存两个新测试().而很明显的是,t1和t2的内存地址不一样,就连两个新测试()的地址都不一样,所以此时用==来比较的时候,结果必然是假的。
(补充:t1和t2中存储的其实是new Test() 对象使用的内存的首地址。)
对于线类型来说,内容相同的时候,其内存地址也相同,比较的时候看的也是地址。
如果要比较对象中存储的内容是否相同(不是比较地址),那么==就无法实现,此时需要等于100 .
equals的分析
1、先看一个等于比较的例子:
公共类TestEquals {
公共静态void main(String[] args) {
测试等于t1=新测试等于();
测试等于T2=新测试等于();
系统。出去。println(t1。equals(T2));//假
字符串s1=新字符串();
字符串s2=新字符串();
系统。出去。println(系统。身份哈希码(S1));
系统。出去。println(系统。身份哈希码(S2));
系统。出去。println(系统。identity hashcode(new String());
系统。出去。println(系统。identity hashcode(new String());
系统。出去。println(S1。equals(S2));//真
}
}
输出结果:
错误的
366712642
1829164700
2018699554
1311053135
true2,分析:
t1和t2的比较是假的,而s1和s2的比较是没错,这里就涉及到了等于方法的重写问题,先看目标类中等于的源码:
公共布尔等于(对象对象){
return(this==obj);
} 对于s1.equals(s2),这是s1,obj是s2,源代码中的比较用的是==,很明显是引用数据类型的比较。它查看s1和s2的内存地址。上面的分析已经知道他们的地址不同,所以结果自然是假的。
S1和s2的比较结果为真,因为在String类中,equals方法被重写了。看看源代码:
公共布尔等于(对象与对象){
if (this==anObject) {
返回true
}
if(字符串的对象实例){
String another String=(String)an object;
int n=value.length
if(n==another string . value . length){
char v1[]=值;
char v2[]=another string . value;
int I=0;
而(n -!=0) {
if (v1[i]!=v2[i])
返回false
我;
}
返回true
}
}
返回false
} 对比object中的equals源代码,可以看出String中的equals方法不再是比较对象的地址,而是看两个对象的内容,或者两个对象的属性是否相同。
字符串、日期、文件等类。全部重写equals方法。
总结:
1.==比较基本数据类型时,我们比较内容是否相等,比较引用数据类型时,我们看内存地址是否相等。
2.equals只能比较引用数据类型(对象)。在重写之前,它使用==来比较内存地址。重写后,它比较对象的有形内容和属性是否一致。
更多文章和教程,请访问:java编程入门。以上是java中==和等于的解析的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。