天天看点

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);

}
}