Object类

       Object类是Java中所有类的超类,每个类都是由Object继承而来。在Java中,只有基本类型(int,double,boolean等)不是对象,所有的数组类型,不管是对象数组还是基本类型的数组都是扩展Object类。Object类包含以下方法:

equals方法

在Object类中的equals方法用于检测一个对象是否等于另外一个对象。equals默认判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。为了防备调用对象为null的情况,可以使用Objects.equals方法。如果两个参数都为null,Object.equals(a,b)方法调用将返回true;如果其中一个参数为null,则返回false;否则如果两个参数都不为null,则调用a.equals(b)。
Java 语言规范要求equals方法具有以下的特性:

  • 自反性:对于任何的非空对象引用,x.equals(x)应该返回true。
  • 对称性:对于任何的引用,x和y,x.equals(y)返回true,则y.equals(x)也应该返回true。
  • 传递性:对于任何的引用,x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)也返回true。
  • 一致性:如果x和y的引用没有变化,则反复调用x.equals(y)应该返回true。
  • 对于任意的非空引用:x.equals(null)应该返回false。
对于数组类型的对象,可以使用静态的Arrays.equals方法检测相应的数组元素是否相等。

hashCode方法

散列码是由对象导出的一个整型值。散列码是没有规律的。如果x和y是两个不同的对象,x.hashCode()与y.hashCode()基本上不会相同。例如String类使用下列的算法计算散列码:
int hash = 0;
for(int i=0;i < length();i++){
hash = 31 * hash + charAt(i);
}
由于hashcode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址。散列码可以是任意的整数,包括正整数或者负数。请看如下的代码示例:
public class HashCodeTest {
    public static void main(String[] args) {
        String ok1 = "OK";
        String ok2 = new String("OK");
        System.out.println(ok1.hashCode() + ":" + ok2.hashCode());
        StringBuilder sb1 = new StringBuilder(ok1);
        StringBuilder sb2 = new StringBuilder(ok1);
        System.out.println(sb1.hashCode() + ":" + sb2.hashCode());
    }
}

字符串ok1和ok2拥有相同的散列码,这是因为String重写了Object的hashcode方法,该方法中定义的字符串的散列码是由内容导出的。而字符串缓冲sb1和sb2却有着不同的散列码,这是因为在StringBuilder类中没有定义hashcode方法,它的散列码是由Object类的默认hashCode方法导出的对象存储地址。

注意: equals与hashCode的定义必须一致,如果x.equals(y)返回true,那么x.hashCode就必须与y.hashCode具有相同的值。

toString方法

Object类中的toString方法用于返回表示对象值的字符串。只要一个对象与字符串通过操作符“+”连接起来,Java编译就会自动调用对象的toString()方法。

数组继承了Object类的toString()方法,因此数组类型的toString()方法是返回的数组的内存地址,此时我们可以使用Arrays的静态方法Arrays.toString方法打印出数组的内容,看如下代码:

public class ArrayTest {
    public static void main(String[] args) {
        int[] nums = {1,2,3,4,5,6,7};
        System.out.println(nums);
        System.out.println(Arrays.toString(nums));
    }
}
输出结果: [I@12504e0
         [1, 2, 3, 4, 5, 6, 7]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值