nineday_java toString与equals

1、object中常用的方法

1>、protected object clone()//负责对象克隆

2>、int hashCode()//获取对象哈希值

3>、boolean equals(object obj);//判断两个对象是否相等

4>、String toString()//将对象转换成字符串形式

5>、protected void finalize()//垃圾回收器负责调用的方法

2、toString

public class ToString {
  int year;
  int mouth;
  int day;
  public ToString(int year, int mouth, int day) {
      this.year = year;
      this.mouth = mouth;
      this.day = day;
  }
  //重写Object中的toString方法
  public String toString(){
      return year+"年"+mouth+"月"+day+"日";
  }

  public static void main(String[] args) {
      ToString ts=new ToString(1900,8,8);
      System.out.println(ts.toString());//1900年8月8日
      System.out.println(ts);//1900年8月8日 只要重写toString,程序自动调用toString方法
  }
}

3、equals

判断两个对象是否相等

public class equals01 {
  int year;
  int mouth;
  int day;
  public equals01(int year, int mouth, int day) {
      this.year = year;
      this.mouth = mouth;
      this.day = day;
  }

  public static void main(String[] args) {
      int a=23;
      int b=23;
      System.out.println(a==b);//true
      /*
      对于基本数据类型“==”比较的是数值
        */
      equals01 e1=new equals01(2000,8,8);
      equals01 e2=new equals01(2000,8,8);
      System.out.println(e1==e2);//false 对于引用类型,==比较的是内存地址
      System.out.println(e1.equals(e2));// 重写equals之前 false 重写之后true
      /*
      原因:Object中的equals:
      public boolean equals(Object obj){
          return (this==obj);//e1==e2 "=="比较两个对象 比较的是内存地址值,故需重写equals
          }
        */
  }
  //重写equals
  public boolean equals(Object obj){
      int year1=this.year;
      int mouth1=this.mouth;
      int day1=this.day;
      /*int year2=obj.year;
      int mouth2=obj.mouth;
      int day2=obj.day;
      这样的写法是错误的,因为obj 是Object类型的 里面没有year,mouth,day这些属性
      解决办法: 向下转型
        */
      if(obj instanceof equals01){
          equals01 e2=(equals01) obj;
          int year2=e2.year;
          int mouth2=e2.mouth;
          int day2=e2.day;
          if(year1==year2&&mouth1==mouth2&&day2==day1) return true;
      }
      return false;
  }
}

上述重写效率太过低

重写equals改良版

public boolean equals(Object obj){
  //如果obj为null或者obj不是equals01类型,直接false
  if(obj==null ||(!(obj instanceof equals01)))
      return false;
  //如果内存地址相同 直接true
  if(obj==this)
      return true;
  //如果上述都不是,则可直接强制转换obj
  equals01 e2=(equals01) obj;
  //return 返回比较后的布尔类型
  return this.year==e2.year && this.mouth==e2.mouth && this.day==e2.day;

}

4、String类的toString与equals

/*
注意:
基本类型使用“==”判断是否相等
引用类型使用equals比较是否相等(String类已经把equals与toString方法重写完成。自定义类需要手动重写)
*/
public class StringAndEquals {
  public static void main(String[] args) {
      String st1=new String("123");
      String st2=new String("123");
      System.out.println(st1.equals(st2));//true
      // 由上可知 String已经重写了equals方法,所以比较字符串必须调用equals方法,不能用==

      String st3=new String("好好学习!");
      //如果String未重写toString方法,则会出现java.long.String@十六进制数字
      System.out.println(st3);//好好学习 可知String已经重写了toString方法

  }
}

5、练习

public class student {
  int sno;
  String school;
  public student(){}
  public student(int sno,String school){
      this.sno=sno;
      this.school=school;
  }
  public String toString(){
      return "学号:"+sno+",学校名称:"+school;
  }
  //当一个学生的学号相同,学校名称也相同时,认为是同一个学生
  public boolean equals(Object obj) {
      if (this == obj) return true;
      if (obj == null || (!(obj instanceof student)))
          return false;
      student st = (student) obj;
      //引用数据类型 比较时使用equals
      return this.school.equals(st.school) && this.sno == st.sno;
  }

  public static void main(String[] args) {
      student st=new student(12,new String("二小"));
      student st1=new student(12,"二小");
      System.out.println(st.equals(st1));//true
  }
}

 

posted @ 2021-06-28 21:05  别不开心,过得去  阅读(62)  评论(0)    收藏  举报