java基础(六)-----浅谈java中“==”和“equals”的区别

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-29 13:37   164   0
学习java已经差不多有一整年的时间了,暂时学到servlet,每次想继续学习新知识的时候,总是听到旁边的人说java基础如何如何重要,的确,万丈高楼平地起,只有经过时间和代码的积累,才会有一个相对的提升。学习java并不是你看了几本书,看了多少的视频,关键在于学习的基础上多总结。比如说,java中“eqals”与“==”的异同。我反正在这个问题上面犯晕过。截止现在想写关于“equals”与“==”的区别时候,也可能理解的有偏颇。废话不说了。
首先我们先撇开字符串类。后面再说。

对于一般的类,“==”与“equals“的效用相同。都是比较两个对象的hasnCode是相等。即比较两个对象在内存中的地址是否相同。相同返回true,不同则返回false。

package myday01;

public class Test {

 public static void main(String[] args) {
  
  
  Person p1=new Person("a","123");//创建两个person对象 
  Person p2=new Person("a","123");
  System.out.println(p1==p2);//创建了两个对象,返回false
  System.out.println(p1.equals(p2));//返回false

 }

}
class Person
{
 private String name;
 private String password;
 
 Person(String name,String password)
 {
  this.name=name;
  this.password=password;
  
 }
 
 /*public boolean equals(Object obj)
 {
  if(obj instanceof Person)
  {
   Person p = (Person)obj;
   if(name.equals(p.name)&&password.equals(p.password))
   {
    return true;
   }
  
 }
  return super.equals(obj);
 }
 
 public int hashCode()
 {
  return name.hashCode();
 }*/
}
综上,如果类没有改写equlas和hashcode,那么,他们的用途相同。但是,在String和Integer等其他类来说,他们不相同,这是为什么呢? 因为这些包装类已经重写了equlas方法和hasnCode方法。这些类的equals方法已经不是比较两个对象的hash值,也就是重写了hashcode方法。见代码:

package myday01;

public class Test2 {

 public static void main(String[] args) {
  
  Integer i1=new Integer(111);
  Integer i2=new Integer(111);
  System.out.println(i1==i2);//返回false,比较的是hashcode,即内存中的地址
  System.out.println(i1.equals(i2));//返回true,改写了Object的方法,只要构造函数中的参数相同,就返回t//rue

 }

}
再看一例:


package myday01;

public class Test3 {

 public static void main(String[] args) {
  
  String s1=new String("abc");
  String s2=new String("abc");
  System.out.println(s1==s2);//,根据上面的结论,可以得出:返回false
  System.out.println(s1.equals(s2));//返回true

 }

}
再看一例:

package myday01;

public class Test4 {

 public static void main(String[] args) {
  
  String s1="abc";
  String s2="abc";
  System.out.println(s1==s2);//??
  System.out.println(s1.equals(s2));//毫无疑问,此处为true

 }

}

问号处答案为:true。与上面例子的结果不同。为甚?
因为java的字符串中有一个字符串常量池的概念,定义s1的时候,虚拟机会再常量池中寻找是否有”abc“的对象,找到以后,就把该对象的地址赋值给s1,第一步没有“abc”对象,所以会创建一个,第二步会找到该对象,也会把该对象得地址(也可以说是hash值)赋值给s2。所以两变量指向同一个对象,结果就为两个true。
综上:常常听见有人说equals是比较值是否相等,==比较地址,这种说法很片面。


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP