解密Object中的常用方法(equals和toStirng 源码分析)

我们都知道Object是所有对象的祖先类,那么它里面的一些方法你是否都理解了呢?
下面我们就以源码为基础来学习这些看似简单的方法吧!!

1.equals方法

我们都知道String中的equals是比较两个字符串对象内容是否相同,但你知道吗,String中的equals其实是对Object中的equals方法的重写,那么equals本来的面目是什么呢? 请看下面代码:

 public static void main(String[] args) {
        Object obj = new Object();
        obj.equals(obj);
    }
   public boolean equals(Object obj) {
        return (this == obj);
    }

从源码看很明显,他其实是判断两个对象的引用(地址)是否相同。

我们进行测试一下:

public static void main(String[] args) {
    Object obj = new Object();
    Object obj1 = new Object();
    System.out.println(obj.equals(obj1));
    System.out.println(obj);
    System.out.println(obj1);
}

在这里插入图片描述
果然,Object中的equals方法是比较对象的地址是否相同来判断的。

2.toString方法

在这里插入图片描述
我们先来调用下,看到底打印出什么信息:
在这里插入图片描述
在这里插入图片描述
从结果来看我们知道前面的java.lang.Object打印的是getClass().getName()的结果,以@为一个分隔符,后面的一串数字是Integer.toHexString(hashCode())的结果,前面的getClass().getName()我们容易理解,就是打印出这个类的完整的类名。

那后面的Integer.toHexString(hashCode());呢?我们先看看hashCode()这个方法:
在这里插入图片描述
它是个本地方法,用于生产一个hash码,然后以生产的hash码作为参数来执行Integer类中的toHexString 静态方法,
在这里插入图片描述
然后以hash码和4作为参数执行toUnsignedString方法返回它执行完成后的结果,这个方法其实就是讲十进制的数转化为16进制的数。 所以后面的一串数字其实就是生产的hash码的16进制的字符串表示。

我们可以进入toUnsignedString方法看看:
这个方法的作用是将整数转换成无符号数。
在这里插入图片描述
下面我们来分析下这个方法的执行逻辑:
首先定义一个局部变量mag,他的值是本不变类中常量SIZE(32)和numberOfLeadingZeros(val)的和:(val就是hash码)
在这里插入图片描述
这个方法用于返回指定int值的二补二进制表示中最高(“最左”)位之前的零位数。

然后定义一个局部变量chars,它的值是前面算出来的mag和4通过后面的式子计算出来的值。

然后定义一个char数组buf,其大小就是chars。

然后以hash码,4,buf,0,chars作为参数执行formatUnsignedInt方法:
这个方法用于将一个长字符(视为无符号)格式化到字符缓冲区中
在这里插入图片描述
所以这个方法主要会给buf进行赋值。

最后返回以buf为内容的字符串对象打印出来也就是hash码的16进制表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小牧之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值