2

次のようなプリミティブフィールドを持つクラスがあります。

public class Person{  
  String name;  
  int age;  
  int id;  
  int height;  
  public Person(String name, int age, int id, int height){  
      this.name = name;
      this.age = age;  
      this.id = id;  
      this.height = height;  
  } 
  //other methods
}  

年齢別に並べ替えたい人がたくさんいます。

Person p87 = new Person("John", 87, 123, 185);  
Person p22 = new Person("George", 22, 12, 180);  
//etc  ....for other persons. Then I create a list of them
List<Person> persons= Arrays.asList(p87, p22, p45, p31, p55, p62 );  
Collections.sort(persons, new Comparator<Person>() {

            @Override
            public int compare(Person p1, person p2) {
                return p1.age - p2.age;
            }

        });   

ここで、正しくソートされているかどうかをテストしたいので、次のJUnitテストケースがあります。

assertEquals(Arrays.asList(p22, p31, p45, p55, p62, p87 ), persons);

テストケースは合格です。だからそれはソートされています。
しかし、私はこれを理解していません。は、含まれている各オブジェクトでを呼び出すList.equalsを使用して2つのassertEqualsリストを比較します。問題は、クラスで オーバーライドしていないことです。 その結果、以下は失敗しますequals
equalsPerson

Person p22 = new Person("George", 22, 12, 180);   
Person p22_2 = new Person("George", 22, 12, 180);    
assertEquals(p22, p22_2);  

わかりません。それでは、なぜ2つのリストがテストケースで同等として合格したのでしょうか。

4

1 に答える 1

7

最初の例では、新しいオブジェクトを作成していません。同じオブジェクトへの参照を比較しています。これが機能するのは、のデフォルトの実装がequals参照の同等性を比較するためです。

あなたはこれと同等のことをしています:

Person p22 = new Person("George", 22, 12, 180);   
Person p22_2 = p22;
assertEquals(p22, p22_2);   // works, because both refer to the same object
于 2012-05-06T08:01:36.853 に答える