equals
日本語 | 一致比較 |
英語 | equals |
ふりがな | いこーるず |
フリガナ | イコールズ |
変数の「実際の値が一致しているか」を調べるためのメソッド。
通常、値の比較には==演算子を使用するが、この方法が有効なのはプリミティブ型のみである。クラスの場合、変数が持つ「参照の値」を比較してしまい、正しい比較が行えない。
そこでクラス同士の比較に使用するのがequals()メソッドである。このメソッドは引数として渡されたクラスと値が一致していたらtrueを、一致していなければfalseを返す。
equals()メソッドはObjectクラスのメソッドのため、クラスであれば必ず使用できる。
ただし、自分で作成したクラスでequals()メソッドを使用する場合には、equals()メソッドをオーバーライドし、クラスの中のデータを比較する実装を行う必要がある。
通常、equals()メソッドの実装は、全てのフィールドが一致しているか比較すればよい。
ただし、基本的に「他のクラス」に対して「一致している」と見なすのはやめた方がいいだろう。たとえば「日付」を意味するクラスがふたつあった場合に、この異なるクラスをequals()メソッドで比較した時に「日付が同じだからtrue」を返すというのは正しくない。値は正しいが、クラスそのものが異なるためである。
このように、本当に値のみで比較する場合にはcompareTo()メソッドを使用する。
通常、値の比較には==演算子を使用するが、この方法が有効なのはプリミティブ型のみである。クラスの場合、変数が持つ「参照の値」を比較してしまい、正しい比較が行えない。
そこでクラス同士の比較に使用するのがequals()メソッドである。このメソッドは引数として渡されたクラスと値が一致していたらtrueを、一致していなければfalseを返す。
equals()メソッドはObjectクラスのメソッドのため、クラスであれば必ず使用できる。
ただし、自分で作成したクラスでequals()メソッドを使用する場合には、equals()メソッドをオーバーライドし、クラスの中のデータを比較する実装を行う必要がある。
通常、equals()メソッドの実装は、全てのフィールドが一致しているか比較すればよい。
ただし、基本的に「他のクラス」に対して「一致している」と見なすのはやめた方がいいだろう。たとえば「日付」を意味するクラスがふたつあった場合に、この異なるクラスをequals()メソッドで比較した時に「日付が同じだからtrue」を返すというのは正しくない。値は正しいが、クラスそのものが異なるためである。
このように、本当に値のみで比較する場合にはcompareTo()メソッドを使用する。
参考サイト
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// Stringクラスを2つ作ります。
String string1 = new String( "あいうえお" );
String string2 = new String( "あいうえお" );
// そのまま比較すると、参照で比較するため一致しません。
System.out.println( string1 == string2 );
// false
// 中身で比較する場合にはequals()メソッドを使用します。
System.out.println( string1.equals( string2 ) );
// true
// 自クラスで実装したequals()メソッドを使用します。
Sample sample1 = new Sample();
Sample sample2 = new Sample();
sample1.i = 100;
sample1.string = "あいうえお";
sample2.i = 100;
sample2.string = "あいうえお";
System.out.println( sample1.equals( sample2 ) );
// true
}
/** Sampleクラスが持つ値。 */
public int i = 0;
public String string = "";
/**
* equals()メソッドのオーバーライド。
*/
public boolean equals( Object object )
{
Sample sample = (Sample)object;
// iの比較の結果を返します。
return ( this.i == sample.i ) && ( this.string.equals( sample.string ) );
// このように、プリミティブ型であれば==の結果を、
// クラスであればequals()メソッドの結果を返すのが
// 基本的なパターンです。
}
}
public class Sample
{
public static void main( String[] args )
{
// Stringクラスを2つ作ります。
String string1 = new String( "あいうえお" );
String string2 = new String( "あいうえお" );
// そのまま比較すると、参照で比較するため一致しません。
System.out.println( string1 == string2 );
// false
// 中身で比較する場合にはequals()メソッドを使用します。
System.out.println( string1.equals( string2 ) );
// true
// 自クラスで実装したequals()メソッドを使用します。
Sample sample1 = new Sample();
Sample sample2 = new Sample();
sample1.i = 100;
sample1.string = "あいうえお";
sample2.i = 100;
sample2.string = "あいうえお";
System.out.println( sample1.equals( sample2 ) );
// true
}
/** Sampleクラスが持つ値。 */
public int i = 0;
public String string = "";
/**
* equals()メソッドのオーバーライド。
*/
public boolean equals( Object object )
{
Sample sample = (Sample)object;
// iの比較の結果を返します。
return ( this.i == sample.i ) && ( this.string.equals( sample.string ) );
// このように、プリミティブ型であれば==の結果を、
// クラスであればequals()メソッドの結果を返すのが
// 基本的なパターンです。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // Stringクラスを2つ作ります。 String string1 = new String( "あいうえお" ); String string2 = new String( "あいうえお" ); // そのまま比較すると、参照で比較するため一致しません。 System.out.println( string1 == string2 ); // false // 中身で比較する場合にはequals()メソッドを使用します。 System.out.println( string1.equals( string2 ) ); // true // 自クラスで実装したequals()メソッドを使用します。 Sample sample1 = new Sample(); Sample sample2 = new Sample(); sample1.i = 100; sample1.string = "あいうえお"; sample2.i = 100; sample2.string = "あいうえお"; System.out.println( sample1.equals( sample2 ) ); // true } /** Sampleクラスが持つ値。 */ public int i = 0; public String string = ""; /** * equals()メソッドのオーバーライド。 */ public boolean equals( Object object ) { Sample sample = (Sample)object; // iの比較の結果を返します。 return ( this.i == sample.i ) && ( this.string.equals( sample.string ) ); // このように、プリミティブ型であれば==の結果を、 // クラスであればequals()メソッドの結果を返すのが // 基本的なパターンです。 } }