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);
  } 
}
相关文章
|
10天前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
124 18
|
17天前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
135 4
|
23天前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
169 5
|
27天前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
82 11
|
1月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
2月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
269 0
|
2月前
|
存储 Java 数据处理
Java映射操作:深入Map.getOrDefault与MapUtils方法
结合 `getOrDefault`方法的简洁性及 `MapUtils`的丰富功能,Java的映射操作变得既灵活又高效。合理地使用这些工具能够显著提高数据处理的速度和质量。开发人员可以根据具体的应用场景选择适宜的方法,以求在性能和可读性之间找到最佳平衡。
119 0
JAVA中Object类的常用方法详解
JAVA中Object类的常用方法详解
  JAVA中Object类的常用方法详解