Java

全てのクラスがの持っておくべきメソッド

多くのインスタンスに共通して行える5つの基本操作

メソッド 操作の内容 関連するクラス
toString() 文字列表現を得る Object
equals() 等価判定を行う Object
hashCode() ハッシュ値を得る Object
compareTo() 大小関係を判定する Comparable
clone() 複製する Object, Cloneable

インスタンスの文字列表現

toString()メソッドは、「インスタンスの内容を、人が読んで理解できる文字列で表現したもので返す」という目的があります。

インスタンスの等価判定

 

equals()メソッドは、「インスタンスを比較して等価であるかを判定する」という目的があります

等価と等値の違い

・等価(equals)
指している2つのものが「同じ内容」であること
(同じアドレスを指してなくても良い)

 

・等値(==)
指しているものが「完全に同一の存在」であること
(つまり同じアドレスを指していること)

 

インスタンスの要約

コレクションクラスなどは、remove()メソッドを実行する時は、equals()メソッドを用いて、等価判定を行い等価だったら、remove()メソッドを実行します。つまり、equals()メソッドを正しくオーバーライドしないとremove()がうまく実行されない場合があります。

さらに!!

Hash系のコレクションはequals()メソッドを正しくオーバライドしても、remove()メソッドが正しく実行されない場合があります。理由は、Hash系のコレクションは、HashCode()メソッドでハッシュ値を比べてから、equals()メソッドの2段階で等価判定を行います。(ArrayListなどはremove()をする時はequals()メソッドの1段階で等価判定を行う。)

つまり!!

hashCode()メソッドを正しくオーバーライドしないと、正しく等価判定が行われない場合があるわけです。

インスタンスの順序づけ

順序づけすると言っても、何を持って並び変えをするのかをcompareTo()メソッドに記述しなければいけません。

例えば、3教科(国語、数学、英語)のテストを行ったら、国語の点数で順序をするのか、数学か、英語か、もしくは総合点で並び変えるのかをcompareTo()メソッドに記述するということです。

具体的に言うと、、、

public class Account imprements Comparable<Account>{

int number;//講座番号

    public int compareTo (Account obj){
        if(this.number < obj.number) return -1;
        else if(this.number > obj.number) return 1;
        return 0;
    }

}

 

compareTo()の戻り値

自分自身の方がobjよりも小さい場合・・・負の数
自分自身とobjとが等しい場合   ・・・0
自分自身の方がobjよりも大きい場合・・・正の数

インスタンスの複製

インスタンス自体を複製するために、①new,②全フィールドのコピーをする必要があります。