【java】Object对象

什么是对象

大家都知道,万物皆可为对象,在java中,object是一个类,是所有类的基类。在 JDK5 的API中说明了object类是在 java.lang 这个软件包内,下面这张图是API中对类object的说明。
API
基类中的函数对所有类都适用,大家一定都很好奇所有对象共有的函数到底有哪些啊?嗯…真的好奇!真的有对世界上一切物体都适用的函数么?
那我们抱着好奇心,逐一详细地认识一下他们吧~

equals(Object obj)

public boolean equals(Object obj)

意义
指示某个其他对象是否与此对象“相等”。
参数
obj - 要与之比较的引用对象。
返回
若此对象与 obj 参数相同,则返回 true;否则返回 false。

源码

    public boolean equals(Object obj) {
        return (this == obj);
    }

this==obj比较的是this与obj这两个对象是否一样,由于对象为引用数据类型,所以比较的是内存地址。

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

hashCode()

public int hashCode()

意义
返回对象的哈希码值。

hashCode 的常规协定是:

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

同一个对象的hashCode一定相同;
两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置
,所以不能根据hashCode判断两个对象是否相等。

源码

   /*s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]*/
   public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
            for (int i = 0; i < value.length; i++) {//计算哈希码的那个计算式
                h = 31 * h + val[i];
            }			    
            hash = h;
        }
        return h;
   }

哈希算法到底算的是什么东西?其实是一个字符串的31进制的值。
比如有一个字符串“abcde”,采用31进制的计算方法来计算这个字符串的总和,你会写出下面的计算式子

式子
a 31^4 +b31^3+ c 31^2 +d31^1+ e*31^0.

好神奇!阅读hashcode源码竟然可以学到计算进制的好算法!!
所以可以把这个源码改成进制计算的函数,以后可以调用(我记到小本本上了!哈哈,一切都为了以后的便利!!)。

至于为什么要选择31这个数字,跟物理学家做实验一样吧,经过大量测试做出的选择,也有人反对,理由是31太小了,容易造成生成的码值重复,则降低了效率,所以在以后版本java的源码也许会做出调整。

验证实验

在这里插入图片描述
abc的hashcode是96354,我们用计算器算一下abc的31进制:97^2+ 98^1+ 99 =96354,是的,没错,这里要注意计算用的是ASCII码10进制的值。

toString()

public String toString()

意义
返回该对象的字符串表示。

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

源码

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

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

返回
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

验证实验

在这里插入图片描述

wait()

public final void wait() throws InterruptedException

意义
使当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

notify()

notifyAll()

为什么wait、notify、notifyAll定义在Object类中而不是Thread类中呢?

答:因为只能由对象锁来调用,对象锁又可以是任意一个唯一对象。Thread只能声明线程类,就不能声明wait、notify、notifyAll。

发布了30 篇原创文章 · 获赞 13 · 访问量 1131

猜你喜欢

转载自blog.csdn.net/qq_30738155/article/details/103605724