资讯专栏INFORMATION COLUMN

Java Object类方法分析

zhisheng / 1991人阅读

摘要:类方法分析声明文章均为本人技术笔记,转载请注明出处类简介类是所有类的父类,在中只有基本数据类型不是对象。对于所有数组类型对象类型基本数据类型数组都继承于类方法类中通过判断两个对象是否具有相同引用,从而判断两个对象是否相同子类只要重写方法,就

Java Object类方法分析 声明

文章均为本人技术笔记,转载请注明出处https://segmentfault.com/u/yzwall

Object类简介

Object类是所有类的父类,在Java中只有基本数据类型不是对象。对于所有数组类型(对象类型&&基本数据类型数组)都继承于Object类;

equals方法

Object类中通过判断两个对象是否具有相同引用,从而判断两个对象是否相同;
子类只要重写equals方法,就必须重写hashCode方法

// in java.lang.Object
public boolean equals(Object obj) {
    return (this == obj);
}
重写equals方法原则:

自反性:A.equals(A)返回true;

对称性:A.equals(B)结果和B.equals(A)相同;

传递性:A.equals(B)为true,B.equals(C)为true,则A.equals(C)为true

一致性:对于非null引用A,B, 只要equals()比较操作所用到对象信息不变,多次调用A.equals(B),结果一致;

对于任何非null引用,x.equals(null)必须返回false;

重写equals方法时,参数类型必须为Object类型

重写equals方法示例
class myObject {
    private String name;
    private int age;
    ...
    public getName() {
        return this.name;
    }
    public getAge() {
        return this.age;
    }
}

/**
 * 重写equals方法demo步骤
 * Effective Java中推荐方式
 */
public boolean equals(Object x) {
    // 1. 检查x和this是否引用同一个对象
    if (x == this) {
        return true;
    }
    
    // 2. 检查x对象类型是否是myObject派生
    if (!(x instanceof myObject)) {
        return false;
    }

    // 3. 比较数据域
    // 经过1,2检查,将参数转换为正确类型
    myObject o = (myObject)(x);
    return this.name.equals(x.getName()) && this.age == (x.getAge());
}
hashCode()方法

hashCode方法返回对象的散列码,相等对象必须返回相等的hashCode,不同对象的hashCode尽可能不相等

// in java.lang.Object
public native int hashCode();
重写equals时总要重写hashCode

重写equals不重写hashCode,会导致“不相等对象拥有相同的hashCode”,导致集合类HashMapHashSetHashtable无法工作;极端情况下,在散列表中使所有对象的hashCode都相等,所有对象都被映射到同一个桶中,散列表退化成链表;

当两个对象调用equal返回true,则两个对象各自调用hashCode()返回相同hashCode;

当两个对象调用equal返回false, 两个对象各自调用hashCode()返回的hashCode可以相同(散列冲突不能完全避免

toString()方法

Object类中toString方法,输出对象的“对象类名@散列码”;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67023.html

相关文章

  • 源码|jdk源码之Object及装箱分析

    摘要:作为条件变量的的不仅可以认为内嵌了一把锁,还内嵌了一个条件变量。操作条件变量的函数将当前线程在条件变量上阻塞,一般是为了等待其他线程的某件事情执行完成。其它装箱类其它装箱类的代码这里就不分析了。重点关注下各装箱类的缓存范围。 jdk源码读到现在这里,重要的集合类也读了一部分了。集合类再往下读的话,就要涉及到两个方向。第一,是比较典型的但是不常用的数据结构,这部分我准备将数据结构复习、回...

    VioletJack 评论0 收藏0
  • 详细深入分析 Java ClassLoader 工作机制

    摘要:作用负责将加载到中审查每个类由谁加载父优先的等级加载机制将字节码重新解析成统一要求的对象格式类结构分析为了更好的理解类的加载机制,我们来深入研究一下和他的方法。就算两个是同一份字节码,如果被两个不同的实例所加载,也会认为它们是两个不同。 申明:本文首发于 详细深入分析 ClassLoader 工作机制 ,如有转载,注明原出处即可,谢谢配合。 什么是 ClassLoader ? 大家...

    mdluo 评论0 收藏0
  • Java 代理模式与 AOP

    摘要:本文首发于作者最近在学,研究了下和代理模式,写点心得和大家分享下。所以下面来重点分析下代理模式。这里代理模式分为静态代理和动态代理两种,我们分别来看下。代理模式,代理,意味着有一方代替另一方完成一件事。 本文首发于 https://jaychen.cc作者 jaychen 最近在学 Spring,研究了下 AOP 和代理模式,写点心得和大家分享下。 AOP 先说下AOP,AOP 全称 ...

    jk_v1 评论0 收藏0
  • #yyds干货盘点#Java ASM系列:(091)冗余变量分析

    摘要:程序中定义的变量是存储在当中。判断和是否相同,如果相同,那么表示是冗余的变量。示例冗余变量分析预期目标在下面的代码中,会提示和局部变量是多余的我们的预期目标识别出和是冗余变量。 本文属于Java ASM系列三:Tree API当中的一篇。 1. 如何判断变量是否冗余 如果在IntelliJ IDEA当中编写如下的代码,它会提示str2和str3局部变量是多余的: ...

    mengbo 评论0 收藏0
  • 分析 JDK 源码

    Object 相关概念 Object 是 java 中的顶级父类,它是所有类的超类,所有对象以及数组均会实现这个类提供的方法 JVM 在编译源码过程中,遇到没有继承 Object 的对象时,编译器会指定默认父类 Object 接口没有继承顶级父类,但会隐式的声明一套和 Object 中的方法签名完全一样的方法,这也就符合万物皆对象的面向对象思想,任何对象直接或间接的跟 Object 对象有关 O...

    godruoyi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<