Java基础Object的equals方法和“==”在何时使用

简介: Java基础Object的equals方法和“==”在何时使用

java语言当中的字符串String有没有重写toString方法,有没有重写equals方法


总结:


1、String类已经重写了equals方法,比较两个字符串不能使用==,必须使用equals。

equals是通用的。


2、String类已经重写了toString方法。


大结论:


java中什么类型的数据可以使用“双等于号”判断


java中基本数据类型比较是否相等,使用==

java中什么类型的数据需要使用equals判断


java中所有的引用数据类型统一使用equals方法来判断是否相等。


这是规矩


示例代码:


public class ObjectTest03{
  public static void main(String[] args){
   // 大部分情况下,采用这样的方式创建字符串对象
      String s1 = "Hello";
   String s2 = "abc";
   //疑问,此种情况下,==和equals比较的结果为什么一样?
   System.out.println(s1 == s2);
   System.out.println(s1.equals(s2));
   // 实际上String也是一个类。不属于基本数据类型。
  // 既然String是一个类,那么一定存在构造方法。
   String s3 = new String("new1");
   String s4 = new String("new1");
   // new两次,两个对象内存地址,s3保存的内存地址和s4保存的内存地址不同。
  // == 判断的是内存地址。不是内容。
   System.out.println(s3 == s4);// false
   // 比较两个字符串能不能使用双等号?
  // 不能,必须调用equals方法。
  // String类已经重写equals方法了。
   System.out.println(s3.equals(s4));// true
   // String类有没有重写toString方法呢?
   String x = new String("自学成才!");
   // 如果String没有重写toString()方法,输出结果:java.lang.String@十六进制的地址
  // 经过测试:String类已经重写了toString()方法。
   System.out.println(x.toString());
   System.out.println(x);//x是引用默认调用toString方法
  }
}


运行结果:


0a2653c851af460fa595bd959398a8f1.png


String对象比较的时候必须使用equals方法


示例代码:


public class ObjectTest04{
  public static void main(String[] args){
  Student s1 = new Student(11111,"清华大学");
  Student s2 = new Student(11111,"清华大学");
  System.out.println(s1 == s2);//false
  System.out.println(s1.equals(s2));//true
  /* Student s1 = new Student(11111,new String("清华大学"));
  Student s2 = new Student(11111,new String("清华大学"));
  System.out.println(s1 == s2);//false
  System.out.println(s1.equals(s2));//false */
  }
}
class Student{
  //学号
  int no;//基本数据类型,比较时使用:==
  //学校名称
  String school;//引用数据类型,比较时使用:equals方法。
  public Student(){
  }
  public Student(int no,String school){
  this.no = no;
  this.school = school;
  }
  // 重写toString方法
  public String toString(){
  return "学号" + this.no + ",学校名称" + this.school;
  }
  // 重写equals方法
  // 需求:当一个学生的学号相等,并且学校相同时,表示同一个学生。
  // 思考:这个equals该怎么重写呢?
  // equals方法的编写模式都是固定的。架子差不多。
  public boolean equals(Object obj){
  if(obj == null && !(obj instanceof Student)) return false;
  if(this == obj) return true;
  Student t = (Student)obj;
  return this.no == t.no && this.school.equals(t.school);
  //字符串用双等号比较可以吗?
  // 不可以
  //return this.no == t.no && this.school == t.school;
  }
}


equals方法重写的时候要彻底


示例代码:


public class ObjectTest05{
  public static void main(String[] args){
  //创建一个User对象u1,构造器中传入Address对象
  User u1 = new User("张三",new Address("中国河南","花园街道","11111"));
  //创建一个User对象u2,构造器中传入Address对象
  User u2 = new User("张三",new Address("中国河南","花园街道","11111"));
  System.out.println(u1.equals(u2));//true//重写的equals方法比较的是内容
  //创建一个User对象u3,构造器中传入Address对象
     User u3 = new User("张三",new Address("中国上海","花园街道","11111"));
  System.out.println(u1.equals(u3));//false//重写的equals方法比较的是内容
  }
}
class User{
  // 用户名
  String name;
  // 用户的住址
  Address addr;
  public User(){}
  public User(String name,Address addr){
  this.name = name;
  this.addr = addr;
  }
  // 重写equals方法
  // 重写规则:当一个用户的用户名和家庭住址都相同,表示同一个用户。
  // 这个equals判断的是User对象和User对象是否相等。
  public boolean equals(Object obj){
  if(obj == null && !(obj instanceof User)) return false;
  if(this == obj) return true;
  User u = (User)obj;
  return this.name.equals(u.name) && this.addr.equals(u.addr);
  } 
}
class Address{
  String city;
  String street;
  String zipcode;
  public Address(){}
  public Address(String city,String street,String zipcode){
  this.city = city;
  this.street = street;
  this.zipcode = zipcode;
  }
  // 注意:这里并没有重写equals方法。
  // 这里的equals方法判断的是:Address对象和Address对象是否相等。
  public boolean equals(Object obj){
  // 怎么算是家庭住址相同呢?
  // 城市相同,街道相同,邮编相同,表示相同。
  if(obj == null && !(obj instanceof Address)) return false;
  if(this == obj) return true;
  Address a = (Address)obj;
  return this.city.equals(a.city) && this.street.equals(a.street) && this.zipcode.equals(a.zipcode);
  } 
}
相关文章
|
18天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
67 4
|
29天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
48 17
|
23天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
64 2
|
1月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
1月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
24天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
|
1月前
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
|
3月前
|
Java
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
|
2月前
|
Python
类与面向对象编程(Object-Oriented Programming, OOP)
类与面向对象编程(Object-Oriented Programming, OOP)
|
3月前
|
前端开发 Java 编译器
【前端学java】java中的Object类和前端中的Object有什么区别(9)
【8月更文挑战第10天】java中的Object类和前端中的Object有什么区别
44 0
【前端学java】java中的Object类和前端中的Object有什么区别(9)
下一篇
无影云桌面