Javaのオブジェクトクラスのメソッド解析

巴扎黑
リリース: 2017-04-15 09:06:14
オリジナル
1824 人が閲覧しました

声明

記事はすべて私の技術メモです。転載する場合は出典を明記してください https://segmentfault.com/u/yzwall

オブジェクトクラスの紹介

オブジェクトクラスはすべてのクラスの親クラスであり、 Java には基本データのみがあり、型はオブジェクトではありません。すべての配列型 (オブジェクト型と基本データ型配列) は Object クラスから継承されます。 equals メソッドをオーバーライドする限り、hashCode メソッドもオーバーライドする必要があります

// in java.lang.Object
public boolean equals(Object obj) {
    return (this == obj);
}
ログイン後にコピー
ログイン後にコピー

equals メソッドのオーバーライドの原則:


Reflexivity

: A.equals(A) returns true;

  • Symmetry : A.equals(B) の結果は B.equals(A) と同じです。

  • 推移性: A.equals(B) が true、B.equals(C) が true、そして A. quals(C) は true

  • 一貫性: null 以外の参照 A と B の場合、equals() 比較操作で使用されるオブジェクト情報が変更されない限り、A.equals(B) を複数回呼び出すと、

  • for 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 メソッド はオブジェクトのハッシュ コードを返します。
  • Equal オブジェクトは等しい hashCode を返す必要があります。異なるオブジェクトの hashCode は等しくありません。可能な限り

    ;

    // in java.lang.Object
    public native int hashCode();
    ログイン後にコピー
    ログイン後にコピー
    equals をオーバーライドするときは常に hashCode を書き換える

hashCode を書き換えずにequals を書き換えると、

「等しくないオブジェクトが同じ hashCode を持っています」

となり、コレクション クラス HashMap が生成されます。極端な場合、HashSetHashtable は機能しません。ハッシュ テーブル内のすべてのオブジェクトの hashCode が同じで、すべてのオブジェクトが同じバケットにマッピングされ、ハッシュ テーブルが同じです。

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

// in java.lang.Object
public boolean equals(Object obj) {
    return (this == obj);
}
ログイン後にコピー
ログイン後にコピー

重写equals时总要重写hashCode

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

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

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

toString()方法

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


Java Object类方法分析


声明

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

Object类简介

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

equals方法

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

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());
}
ログイン後にコピー
ログイン後にコピー

重写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方法示例

// in java.lang.Object
public native int hashCode();
ログイン後にコピー
ログイン後にコピー

hashCode()方法

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

rrreee

重写equals时总要重写hashCode

  • 重写equals不重写hashCode,会导致“不相等对象拥有相同的hashCode”,导致集合类HashMapHashSetHashtable

    は、2つのオブジェクトでequalが呼び出されると
  • true
  • を返し、2つのオブジェクトがequalを呼び出してfalseを返すと、それぞれがhashCode()を呼び出して同じ

    を返します。 、それぞれ hashCode() を呼び出した 2 つのオブジェクトによって返される hashCode は同じである可能性があります (ハッシュの競合は完全には回避できません

    )
  • toString() メソッド

    Object クラスの toString メソッドは、「オブジェクト クラス名」を出力しますオブジェクトの @hash code";

Java オブジェクト クラスのメソッド分析


Statement

記事はすべて私の技術メモです。再版のソースを示します https://segmentfault.com/u/yzwallすべての配列型 (オブジェクト型 && 基本データ型配列) は Object クラスから継承されます。


equals メソッド

Object クラスでは、2 つのオブジェクトが同じ参照を持っているかどうかを判断することで同じであるかどうかを判断します。 ;

サブクラスequalsメソッドをオーバーライドする限り、hashCodeメソッドをオーバーライドする必要があります🎜🎜rrreee🎜equalsメソッドをオーバーライドする原則:🎜🎜🎜🎜🎜Reflexivity🎜: A.equals(A) returns 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 を呼び出します) ) 複数回実行しても同じ結果になります。 🎜🎜🎜🎜for null 以外の参照の場合、x.equals(null) は false を返す必要があります。 type🎜🎜🎜🎜🎜equals メソッドをオーバーライドする例🎜rrreee🎜hashCode() メソッド🎜 🎜hashCode メソッド は、オブジェクトのハッシュ コードを返します。🎜Equal オブジェクトは、異なる hashCode を返す必要があります。オブジェクトは可能な限り等しくありません🎜; 🎜rrreee🎜equals をオーバーライドするときは常に hashCode を書き換えます🎜🎜 🎜🎜hashCode を書き換えずにequals を書き換えると、🎜「等しくないオブジェクトが同じ hashCode を持っています」🎜 となり、コレクション クラス HashMap が生成されます。 HashSet、および Hashtable は、ハッシュ テーブル内のすべてのオブジェクトの hashCode が等しく、すべてのオブジェクトが同じバケットにマッピングされる場合、機能しません。ハッシュ テーブルはリンク リストに縮退します。 🎜🎜🎜🎜 が 2 つのオブジェクトで呼び出されると 🎜🎜🎜 が返され、2 つのオブジェクトがそれぞれ hashCode() を呼び出して同じ 🎜🎜🎜🎜 を返します。等価で false を返す場合、それぞれ hashCode() を呼び出した 2 つのオブジェクトによって返される hashCode は同じである可能性があります (🎜ハッシュの競合は完全には回避できません🎜)🎜🎜🎜🎜toString() メソッド🎜🎜 Object クラスの toString メソッドは、オブジェクトの「オブジェクトクラス名@ハッシュコード」;🎜🎜🎜🎜🎜🎜🎜

以上がJavaのオブジェクトクラスのメソッド解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート