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);
  } 
}
目录
打赏
0
0
0
0
4
分享
相关文章
|
19天前
|
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
46 25
|
13天前
|
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
23 1
Java中的异常处理方法
本文深入剖析Java异常处理机制,介绍可检查异常、运行时异常和错误的区别与处理方式。通过最佳实践方法,如使用合适的异常类型、声明精确异常、try-with-resources语句块、记录异常信息等,帮助开发者提高代码的可靠性、可读性和可维护性。良好的异常处理能保证程序稳定运行,避免资源泄漏和潜在问题。
|
27天前
|
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
47 5
|
1月前
|
java.time常用方法汇总
`java.time` API 是从 Java 8 开始引入的时间日期处理库,旨在替代老旧的 `java.util.Date` 和 `Calendar`。它提供了更简洁、强大和灵活的方式处理日期、时间、时区及时间间隔,支持全球化和时间计算需求。API 包含获取当前时间、创建指定时间、解析和格式化字符串、进行加减运算、比较时间、获取年月日时分秒、计算时间间隔、时区转换以及判断闰年等功能。示例代码展示了如何使用这些功能,极大简化了开发中的时间处理任务。
|
7月前
|
|
8月前
|
java 中为什么重写 equals 后需要重写 hashCode
java 中为什么重写 equals 后需要重写 hashCode
90 8
|
10月前
|
JAVA中比较对象是否相等的方式是什么?为什么重写equals就一定要重写hashcode?百天百题(3/100)
JAVA中比较对象是否相等的方式是什么?为什么重写equals就一定要重写hashcode?
【java面试题】- 为什么重写 equals() 时必须重写 hashCode() 方法?
为什么重写 equals() 时必须重写 hashCode() 方法?
131 0

热门文章

最新文章