equals和==最根本的区别

55、相等性的比较(==)

A)对于原生数据类型来说,比较的是左右两边的值是否相等。

B)对于引用类型来说,比较左右两边的引用是否指向同一个对象。或者说左右两边的引用地址是否相同。

56、equals()方法,该方法定义在Object类当中,因此java中的每个类都具有该方法,对于Object类的equals()方法来说,它是判断调用equals方法的引用与传进来的引用是否一致,即这两个引用是否指向的是同一个对象。对于Object类的equals()方法来说它等价于==。

57、对于String类的equals()方法来说,它重写了Object的equals方法()。它是判断当前字符串与传进来的字符串的内容是否一致。

【String的equals方法:

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){

  Charv1[] = value;

  Charv2[] = anotherString.value;

  int i= offset;

  int j= anotherString.offset;

  while(n--!= 0){

   if(v1[i++]!= v2[j++]){

      returnfalse;

}

}

return true;

}

}

}


 

Object的equals方法:

Public Boolean equals (Object anObject){

   Return(this == anObject);

}

58、对于String对象的相等性判断来说,请使用equals()方法,而不要使用==。

59、String是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。

60、String Pool(字符串池)

61、Strings = aaa;(采用字面值方式赋值)

    1)查找String Pool 中是否存在aaa 这个对象,如果不存在,则在String Pool中创建一个aaa对象,然后将String Pool中的这个aaa对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个aaa字符串对象

    2)如果存在,则不创建任何对象,直接将String Pool中的这个aaa对象地址返回来,赋给s引用。

62、Strings = new String(aaa);

    1)首先在String Pool中查找有没有aaa这个字符串对象,如果有,则不在String Pool中再去创建aaa这个对象了,直接在堆中(heap)中创建一个aaa字符串对象,然后将堆中的这个aaa对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个aaa字符串对象。

    2)如果没有,则首先在String Pool中创建一个aaa对象,然后再在堆中(heap)创建一个aaa对象,然后将堆中的 这个aaa对象的地址返回来,赋给s引用,导致s指向了堆中所创建的这个aaa对象。

 

=================================以上文字出自张龙老师的视频=================================

对于很多初学者来说,往往很难分辨equals和==的区别,有的人一开始甚至了解的很模糊,甚至看看课本就不管了。其实像这种规定一类的东西,光片面的看,是很理解的。

就如我一样,我是从c开始学的,学了有差不多一年,就开始学java了。在c里面,==就是判断两个字符串是否相等。而java里却不一样了。刚开始判断字符串时,老师讲的也很片面,当时,也就硬记的。其实并没什么用。后来看到张龙老师讲的视频,才知道原理。像这种原理性的东西,看源码会更容易理解。

上面出现的代码出自JDK 1.6 。现在分析下源码:

之前我们都知道传值,有值传递,引用传递。equals是Object的方法,所以所有类都会继承该方法。而有的类会重写该方法。同时也说明,我们自己定义的类,不要忘了重写该方法,不然用equals方法时,实际就是调用的父类Object的equals方法。

String重写的equals方法:

public Boolean equals(Object anObject) { //Object属于对象,多以此处是引用传递

if(this == anObject){  //this代指当前对象,除非自身与自身相等,正如世界上没有两个相同的人一个道理。

return true;

}

If(anObject instanceof String){   //判断接受的引用所指的对象是否属于String类。instanceof的作用就是区别一个对象是否是某个类的实例。

String anotherString =(String)anObject;   //如果是,则把anObject强制转换为String类。

Int n = count;   //以下就是判断相比较的两个对象的内容的。

If(n == anotherString.count){

  Charv1[] = value;

  Charv2[] = anotherString.value;

  int i= offset;

  int j= anotherString.offset;

  while(n--!= 0){

   if(v1[i++]!= v2[j++]){

      return false; //  内容不同则返回false。

}

}

return true;

}

}

}


 

Object的equals方法:

Public Boolean equals (Object anObject){  //同样是引用传递

   Return(this == anObject);   //  判断两个引用是否相等。除非是原生数据类型相等外,其他均为false;

}

 

=========================================================================

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值