Java API:Object and Objects

Java API:Object and Objects

1 Object

Object是类层次结构的根。 每个class都有Object作为超类。 所有对象(包括数组)都实现此类的方法。

1.1 常用方法

1.1 Object类的toString方法

public String toString()
  • 返回对象的字符串表示形式。 通常, toString方法返回一个“文本表示”此对象的字符串。
  • 建议所有子类都覆盖此方法。
  • ObjecttoString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“ @ ”以及对象的哈希码的无符号十六进制表示形式组成。 换句话说,此方法返回一个等于值的字符串:
    • getClass().getName() + '@' + Integer.toHexString(hashCode())

1.1.1 示例

package com.fcarey.api;

public class Person {
    private String name;
    private int age;
    public Person() {}

    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
    public String toString() {
        return "ToStringDemo [name=" + name + ", age=" + age + "]";
    }
}


package com.fcarey.api;

public class ToStringDemo {
    public static void main(String[] args) {
        Person tsd = new Person();
        tsd.setName("ToString Demo");
        tsd.setAge(20);
        System.out.println(tsd);
        System.out.println(tsd.toString());
    }
}

// 输出:
// ToStringDemo [name=ToString Demo, age=20]
// ToStringDemo [name=ToString Demo, age=20]

1.2 equals

public boolean equals​(Object obj)  // 指示某个其他对象是否“等于”此对象。
  • equals方法在非null对象引用上实现等价关系:

    • 自反性:对于任何非空的参考值xx.equals(x)应该返回true

    • 对称性 :对于任何非空引用值xyx.equals(y)应该返回true当且仅当y.equals(x)回报true

    • 传递性 :对于任何非空引用值xyz ,如果x.equals(y)回报truey.equals(z)回报true ,然后x.equals(z)应该返回true

    • 它是一致的 :对于任何非空引用值xy ,多次调用x.equals(y)始终返回true或始终返回false ,前提是未修改对象上的equals比较中使用的信息。

    • 对于任何非空的参考值xx.equals(null)应该返回false

  • Objectequals方法实现了对象上最具区别的可能等价关系; 也就是说,对于任何非空引用值xy ,当且仅当xy引用同一对象( x == y具有值true )时,此方法返回true

  • 重写equals方法的场景:不希望比较对象的地址值,想要结合对象属性进行比较的时候。

    • 请注意:通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希代码。

1.2.1 示例

package com.fcarey.api;

import java.util.Objects;

public class Person {
    private String name;
    private int age;
    public Person() {}

    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
    public String toString() {
        return "ToStringDemo [name=" + name + ", age=" + age + "]";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

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


package com.fcarey.api;

public class EqualsDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("user");
        person.setAge(20);

        Person person2 = new Person();
        person2.setName("user");
        person2.setAge(20);
        System.out.println(person.equals(person2));
    }
}

1.2.2 面试题

package com.fcarey.api;
// 看程序,分析结果


public class Test {

    public static void main(String[] args) {
        String s = "abc";
        StringBuilder sb = new StringBuilder();
        sb.append("abc");
        // 1.此时调用的是String类中的equals方法.
        // 保证参数也是字符串,否则不会比较属性值而直接返回false
        System.out.println(s.equals(sb));  // false

        //  StringBuilder类中是没有重写equals方法,用的就是Object类中的.
        System.out.println(sb.equals(s)); // false

        // 此时比较的是内容
        System.out.println(s.contentEquals(sb));  // true
    }
}

2 Objects

  • 此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括nullnull方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。

  • 常用方法:

    变量和类型 方法 描述
    static boolean deepEquals(Object a, Object b) 返回 true如果参数是深层相等,彼此 false其他。
    static boolean equals(Object a, Object b) 返回 true如果参数相等,彼此 false其他。
    static boolean isNull(Object obj) 返回 true如果提供的参考是 null ,否则返回 false
    static boolean nonNull(Object obj) 返回 true如果提供的参考是非 null否则返回 false
    static String toString(Object o) 返回调用的结果 toString对于非 null参数, "null"null的说法。
    static String toString(Object o, String nullDefault) 如果第一个参数不是 null ,则返回在第一个参数上调用 toString的结果,否则返回第二个参数。

2.1 示例

package com.fcarey.api;

import java.util.Objects;

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
    public String toString() {
        return "ToStringDemo [name=" + name + ", age=" + age + "]";
    }
}


package com.fcarey.api;

import java.util.Objects;

public class MyObjectsDemo {
    public static void main(String[] args) {
        Person person = new Person("abc",22);
        person = null;
        String s = Objects.toString(person,"没有东东");
        System.out.println(s);  // 输出:没有东东

        Person person2 = new Person();
        boolean res = Objects.isNull(person2);
        System.out.println(res);  // 输出:false

        boolean res2 = Objects.nonNull(person2);
        System.out.println(res2);  // 输出:true

    }
}
posted @ 2024-09-02 21:02  f_carey  阅读(5)  评论(0编辑  收藏  举报