object的方法

类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。在包java.lang.Object

表1 Object类的常用方法
方法说明
Object clone() 创建与该对象的类相同的新对象
boolean equals(Object) 比较两对象是否相等
void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,对象的圾回收器调用该方法
Class getClass() 返回一个对象运行时的实例类
int hashCode() 返回该对象的散列码值
void notify() 激活等待在该对象的监视器上的一个线程
void notifyAll() 激活等待在该对象的监视器上的全部线程
String toString() 返回该对象的字符串表示
void wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待

 常用的两个,toString()和equals()。

1、toString()

  返回该对象的字符串表示。通常, toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())
返回:
该对象的字符串表示形式。
String s = "abc";
        System.out.println(s.toString());
        User user = new User();
        System.out.println(user.toString());
output:
abc
com.test.basicJava.User@7852e922

 

2,equals()

 指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

  • 自反性:对于任何非空引用值 xx.equals(x) 都应返回 true
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true
  • 传递性:对于任何非空引用值 xy 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
  • 对于任何非空引用值 xx.equals(null) 都应返回 false

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 truex == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

 

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false
2.1  字段串“==”和equals的比较
String a = "a";
        String b = new String("a");
        if(a == b){
            System.out.println("a ==  b" + " : ==");
        }else{
            System.out.println("a == b" +  ": not ==");
        }
        
        if(a.equals(b)){
            System.out.println("a equals b" + " : equals");
        }else{
            System.out.println("a equals b" +  ": not equals");
        }
        
        String c = "c";
        String d = "c";
        if(c == d){
            System.out.println("c == d" + " : ==");
        }else{
            System.out.println("c == d" + ": not ==");
        }

output:
a == b: not ==
a equals b : equals
c == d : ==

字符串比较一定不能用 “==”,这个只能确定两个字符在同一个位置上。当然如果在同一个位置上,必然相等。要用equals方法。

 String类重写了Object的equals()方法。

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

2.2 整型“==”和equals的的比较

        Integer a = 1;
        Integer b = 1;
        if (a.equals(b)) {
            System.out.println("a.equals(b)" + ":equals");
        } else {
            System.out.println("a.equals(b)" + ":not equals");
        }
        if (a == b) {
            System.out.println("a == b" + ":==");
        } else {
            System.out.println("a == b" + ":not ==");
        }
        // new 说明对象不一样
        Integer c = new Integer(1);
        Integer d = new Integer(1);
        if (c.equals(d)) {
            System.out.println("c.equals(d)" + ":equals");
        } else {
            System.out.println("c.equals(d)" + ":not equals");
        }
        if (c == d) {
            System.out.println("c == d" + ":==");
        } else {
            System.out.println("c == d" + ":not ==");
        }
output:
a.equals(b):equals
a == b:==
c.equals(d):equals
c == d:not ==
// 常量大于127,== 就没用了
Integer a = 128;
        Integer b = 128;
        if (a.equals(b)) {
            System.out.println("a.equals(b)" + ":equals");
        } else {
            System.out.println("a.equals(b)" + ":not equals");
        }
        if (a == b) {
            System.out.println("a == b" + ":==");
        } else {
            System.out.println("a == b" + ":not ==");
        }
output:
a.equals(b):equals
a == b:not ==

2.3 对象的equals()

新建类

public class User {
    private int id;
    private int age;
    public User(int id, int age) {
        super();
        this.id = id;
        this.age = age;
    }
}
User user1 = new User(1,20);
        User user2 = new User(1,20);
        System.out.println(user1 == user2);// false
        System.out.println(user1.equals(user2));// false

new了两个对象,引用不一样,引用内容也不一样,所以不会相等。

重写User类的equls()方法

public class User {
    private int id;
    private int age;

    public User(int id, int age) {
        super();
        this.id = id;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        } else {
            if (obj instanceof User) {
                User user = (User) obj;
                if (this.id == user.id && this.age == user.age) {
                    return true;
                }
            }
        }
        return false;
    }

}
User user1 = new User(1,20);
        User user2 = new User(1,20);
        System.out.println(user1 == user2);// false
        System.out.println(user1.equals(user2));// true

 

3,hashCode()

返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

  • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

返回:
此对象的一个哈希码值。

2.3中,只是重写了equals方法,还要再重写hashCode方法。让equals方法和hashCode方法始终在逻辑上保持一致性。参考:浅谈Java中的hashcode方法   Java中equals()与hashCode()方法详解

posted @ 2019-03-15 18:24  阿罗luo  阅读(267)  评论(0编辑  收藏  举报