天天看點

ToString方法和equals介紹以及改寫String方法(toString和equals)

String方法(toString和equals)

toString方法

定義一個對象類(Person)

代碼:(請讀者預設忽略重寫的equals以及tostring方法)

public class Person {
private String name;
private int age;

public Person() {
}

public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override//繼承自object類,覆寫重寫此方法。
public String toString() {
    return "我叫:"+name+",年齡為:"+age;
}
//equals比較兩個位址值沒有意義,是以覆寫重寫一下。

  /*  @Override
public boolean equals(Object obj) {
    //為了提高效率
    *//*1.傳遞的參數是自己*//*
    if (obj==this)
        return true;
    //2.傳遞的參數是空
    if (obj==null)
        return  false;
    //if語句防止類型轉換錯誤。
    if (obj instanceof Person)
    {
        Person p=(Person)obj;
        boolean b=this.name.equals(p.name)&&this.age==p.age;
        return b;
    }
    //向下轉型可以調用到子方法。
   return false;
}*/
//等效于上面的自定義的equals重寫。
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;//使用反射技術,判斷o是否是person類 等效于obj instanceof person。getclass()相當于擷取類名稱,如Getclass()擷取目前類的名稱。
    Person person = (Person) o;
    return age == person.age &&
            Objects.equals(name, person.name);
}

@Override
public int hashCode() {
    return Objects.hash(name, age);
}
}
           

測試tostring的方法類

代碼:

public class Demo01toString {

/*看一個類中有沒有重寫tostring方法直接列印出對象即可,如果列印的是位址值,則沒有重寫,否則重寫了。*/
public static void main(String[] args) {
    Person p=new Person("奧特曼",1542);
    System.out.println(p);//預設調用tostring方法。是位址值的意思,現在在preson類中覆寫重寫此方法。
    System.out.println(p.toString());
    //Scanner sc=new Scanner(System.in);
    //System.out.println(sc);//重寫了。
}

}
           

測試equals方法的類

代碼

/*Person類預設繼承object類,是以可以使用object類的equals方法。*/

public class Demo02equals {
public static void main(String[] args) {
    Person p1=new Person("喬峰",26);
    Person p2=new Person("蕭峰",26);
    Person p3=new Person("喬峰",26);
   // Person p4=new Person("蕭峰",26);
    /*基本資料類型的比較是值的比較
    * 引用資料類型是位址的比較。*/
 /*   public boolean equals(Object obj) {
        return (this == obj);
    }*/
    //誰引用誰就是this,調用的就是參數obj
    System.out.println("p1的位址值是:"+p1);
    System.out.println("p2的位址值是:"+p2);
    System.out.println("沒有重寫的方法位址值的比較。");
    System.out.println(p1.equals(p2));
    System.out.println("沒有重寫的方法兩個引用對象含相同的參數的比較");
    System.out.println(p1.equals(p3));//已修改
    System.out.println("重寫equals方法後兩個引用對象含相同的參數的比較");
    System.out.println(p1.equals(p3));
   // System.out.println();
    System.out.println(p1.getAge()==p2.getAge());
    System.out.println("給p1附上p2的值:");
    p1=p2;
    System.out.println(p1.equals(p2));
    List<String> list=new  ArrayList<>();
    System.out.println(p1.equals(list));
}
}
           

注意點方法都在代碼中注釋清楚!

objects(s1,s2)避免空指針異常

代碼:

//引用此方法是因為想避免空指針異常
public class Objectequals {
public static void main(String[] args) {
    String s1=null;
    String s2="abc";
   // boolean b=s1.equals(s2);//NullPointerException 空指針異常
    //System.out.println(b);
    //改進調用Object比較方法。
    boolean b1= Objects.equals(s1,s2);
    System.out.println(b1);

}
}