java中==与equals的区别及理解,java == 和equals

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: