疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java中equals与==的对比


 

   

  ==

  (1)用于 基本类型(int, float等)的比较时,返回数值意义/大小是否相同的结果

  (2)用于对象比较时(Interger,String, 库对象、自定义对象等),返回 两对象地址是否相同的结果

  equals

  (1)不能用于基本类型,只能作为对象的方法被调用

  (2)java中所有对象继承于Object对象, 其中Object 的 equals 表示 两个对象的地址空间是否相同,

  所以如果 子类未覆盖equals方法,则继承Object的equals

  如下自定义类 B,未覆盖equals,所以返回结果为两个对象的地址空间是否相同。

  class B {

  private int num;

  B() {

  num = 1;

  }

  }

  B a = new B();

  B b = new B();

  System.out.println(a.equals(b));//false

  但java中一些类在实现时覆盖了equals方法,如String

  String 中 equals 表示两个 String 对象所存储字段(字面意义)是否相同

  String str_a = new String("abc");

  String str_b = new String("abc");

  System.out.println(str_a.equals(str_b)); //true

  System.out.println(str_a==str_b); // false

  而StringBuffer并未覆盖 equals方法,采用继承自Object的equals

  StringBuffer sb1 = new StringBuffer("a");

  StringBuffer sb2 = new StringBuffer("a");

  System.out.println(sb1.equals(sb2)); //false

  System.out.println(sb1==sb2); // false

  自定义类中重新定义equals方法

  class A {

  private int a;

  A() {

  a = 1;

  }

  public boolean equals(A b) {

  if (a == b.a)

  return true;

  else

  return false;

  }

  }

  A a = new A();

  A b = new A();

  System.out.println(a.equals(b)); //true

  System.out.println(a == b); //false

  结论:如此可见 equals的意义取决于该对象中 对equals是否覆盖,以及覆盖后的意义。

  ps:类定义时,常常需要根据自身需要覆盖 toString, equals等方法。