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);
  } 
}
相关文章
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
100 9
|
2天前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
27天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
59 4
|
2月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
59 4
|
2月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
83 4
|
2月前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
32 1
JAVA中Object类的常用方法详解
JAVA中Object类的常用方法详解
  JAVA中Object类的常用方法详解

热门文章

最新文章