==

它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型+String常量==比较的是值,引用数据类型==比较的是内存地址)

==与equals - 图1

equals()

它的作用也是判断两个对象是不是相等。但是它一般有两种使用情况:

  • 情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于”==”比较这两个对象。
  • 情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
  1. public class testEquals {
  2. public static void main(String argu[]){
  3. String a = new String("ab"); // a 为一个引用
  4. String b = new String("ab"); // b为另一个引用,对象的内容一样
  5. String aa = "ab"; // 放在常量池中
  6. String bb = "ab"; // 从常量池中查找
  7. Integer aaa = 127; // 放在常量池中
  8. Integer bbb = 127; // 从常量池中查找
  9. Integer aaaa = 128; // 放在常量池中
  10. Integer bbbb = 128; // 在堆内存中创建一个新的对象
  11. if (aa == bb){ //true
  12. System.out.println("aa == bb");
  13. }
  14. if (a == b){ //false,非同一对象
  15. System.out.println("a == b");
  16. }
  17. if (a.equals(b)){ //true
  18. System.out.println("a.equals(b)");
  19. }
  20. if (aa.equals(bb)){ //true
  21. System.out.println("aa.equals(bb)");
  22. }
  23. if (aa.equals(b)){ //true
  24. System.out.println("aa.equals(b)");
  25. }
  26. if (a.equals(bb)){ //true
  27. System.out.println("a.equals(bb)");
  28. }
  29. if (42 == 42.0){ //true
  30. System.out.println("42 == 42.0");
  31. }
  32. if (aaa==bbb){ //true
  33. System.out.println("aaa==bbb");
  34. }
  35. if (aaa.equals(bbb)){ //true
  36. System.out.println("aaa.equals(bbb)");
  37. }
  38. if (aaaa==bbbb){ //false,非同一对象
  39. System.out.println("aaaa==bbbb");
  40. }
  41. if (aaaa.equals(bbbb)){ //true
  42. System.out.println("aaaa.equals(bbbb)");
  43. }
  44. }
  45. }

程序运行结果:
image.png

说明

  • String中的equals()方法是被重写过的,因为object的equals()方法是比较对象的内存地址,而String的**equals()方法是比较对象的值**;
  • 创建String类型的对象时,虚拟机会在常量池中查找**有没有已经存在的值和要创建的值相同对象**,如果有,则就把它赋值给当前引用。如果没有就在常量池中重新创建一个String对象;
  • 因为 Integer 在常量池中的存储范围为[-128,127],127在这范围内,因此是直接存储于常量池的,而128不在这范围内,所以会在堆内存中创建一个新的对象来保存这个值,所以aaaa,bbbb分别指向了两个不同的对象地址,故而导致了不相等。