2013-12-13 3 views
1

Можно ли использовать http://developer.android.com/reference/android/util/Pair.html это для ключей в HashMap? Это потому, что для меня этот класс обеспечивает допустимую реализацию для equals() и hashCode(). Я прав?android.util.Pair как ключ в HashMap

+4

Я бы сказал, да, и я бы сказал, что вы можете точно знать, тестируя его. – njzk2

ответ

4

Поскольку Pair поддерживает равные и hashcode, вы можете безопасно использовать его в качестве ключа.

Я собрал очень простой тест JUnit, чтобы убедиться, что это правда & он прошел.

public final void testPairAsHashMapKey() { 

    HashMap<Pair<Integer, Integer>, String> map = new HashMap<Pair<Integer, Integer>, String>(); 

    Pair<Integer, Integer> p1 = new Pair<Integer, Integer>(0, 0); 
    Pair<Integer, Integer> p2 = new Pair<Integer, Integer>(0, 0); 
    Pair<Integer, Integer> p3 = new Pair<Integer, Integer>(5, 3); 
    Pair<Integer, Integer> p4 = new Pair<Integer, Integer>(3, 5); 

    map.put(p1, "foo"); 
    assertEquals(1, map.size()); 
    assertEquals("foo", map.get(p1)); 

    map.put(p2, "new_foo"); 
    // p2.equals(p1) so map will not grow but value will update 
    assertEquals(1, map.size()); 
    assertEquals("new_foo", map.get(p2)); 

    map.put(p3, "bar"); 
    assertEquals(2, map.size()); 
    assertEquals("bar", map.get(p3)); 

    map.put(p4, "test"); 
    assertEquals(3, map.size()); 
    assertEquals("test", map.get(p4)); 

} 
0

Метод равенства проверяет два объекта на равенство, делегируя их соответствующим методам equals.

Если вы переопределяете метод equals ваших объектов в соответствии с вашей целью, все будет в порядке. Это же касается hashCode, но не меняет его. По умолчанию hashCode должен быть в порядке.

+1

Вы должны ВСЕГДА переопределять хэш-код, когда вы переопределяете равные, и наоборот. _ «По определению, если два объекта равны, их хэш-код также должен быть равен. Если вы переопределите метод equals(), вы измените способ приравнивания двух объектов и реализацию объекта hashCode() уже недействительным, если вы переопределите метод equals(), вы также должны переопределить метод hashCode(). »_ –

+0

да, это совершенно правильно, но если ваш код не использует hashCode, это не имеет значения. Например, этот код работает отлично, даже если я не переопределяю функцию hashCode. класс Тест { \t частный int i; \t \t общественный тест (int i) { \t \t this.i = i; \t} \t \t @Override \t общественные булевы равно (Объект O) \t { \t \t возвращение this.I == ((тест) о) .i; \t}} общественного класса Основное { \t \t государственной статической силы основных (String []) {арг \t \t \t \t Тест t1 = новый тест (1); \t \t Испытание t2 = новое испытание (2); \t \t Испытание t22 = новое испытание (2); \t \t \t \t System.out.println (t1.equals (t2)); \t \t System.out.println (t2.equals (t22)); \t \t \t \t }} –

+0

Вы ошибаетесь, потому что если вы переопределить равных, вы должны соблюдать договор 'x1.equals (x2) => (x1.hashCode() == x2.hashCode())'. –

Смежные вопросы