2010-11-24 2 views
-1
import java.util.*; 

public class HashingTest { 

// instance variables 

String name; 
int age; 
int hashCd; 
String gender; 

public HashingTest(String nm, int age, String gend) 
{ 
    name = nm; 
    this.age = age; 
    gender = gend; 
} 


public static void main(String[] args) { 

    HashingTest person1 = new HashingTest("Durvi",5,"Female"); 
    HashingTest person2 = new HashingTest("Pillu",5,"Female"); 
    HashingTest person3 = new HashingTest("Ninad",5,"Male"); 
    HashingTest person4 = new HashingTest("Varun",5,"Male"); 
    HashingTest person5 = new HashingTest("Sapna",5,"Female"); 
    HashingTest person6 = new HashingTest("Priya",5,"Female"); 

    //person2 and person1 are now referring to the same object 
    person2 = person1; 

    boolean truth = person1.equals(person2); 

    System.out.println(truth + " : Which means that if two object varaibles are refering the same object the equals() method returns true"); 

    Hashtable<HashingTest, String> hs = new Hashtable<HashingTest, String>(); 
    hs.put(person1, "Durvi"); 
    hs.put(person2, "Pillu"); 
    hs.put(person3, "Ninad"); 
    hs.put(person4, "Varun"); 

    String personVal = (String)hs.get(person1); 

    System.out.println(personVal); 

} 
} 

Выход ::Hashtable ключ получает неверное значение

правда: Это означает, что если два объекта varaibles имеете в виду один и тот же объект на равных() метод возвращает истинное Pillu

+1

Сухой запуск этой программы, я думаю, что выход так же, как можно было бы ожидать. каков ваш ожидаемый результат? – 2010-11-24 03:08:01

ответ

2

Это работает, как ожидалось. То, что вы делаете это:

person2 = person1; 

hs.put(person1, "Durvi"); 
hs.put(person2, "Pillu"); // since person1 == person2, 
          // this overwrites the previous key 

String personVal = (String)hs.get(person1); 

С person2 == person1, последний вызов равно

String personVal = (String)hs.get(person2); // person1 == person2 

В качестве примечания, вы должны реализовать equals() и hashCode() для HashingTest класса, посмотрите здесь:

0

Вы получаете правильно поведение в этом случае, но ...

вы не можете ожидать, что вы сделали, чтобы правильно работать всегда, потому что вы не переопределяетесь hashcode() и equals().

Поскольку вы делаете класс, экземпляры которого используются в качестве ключей в хэш-контейнер (например, HashSet, HashMap и HashTable), вы должны переопределить hashcode() и equals().

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

0

По умолчанию метод java equals от Object будет сравнивать ссылки. Поскольку вы устанавливаете ссылки одинаковыми, тогда да, вызов «equals» вернет true. Если вы хотите изменить это поведение, вам нужно переопределить равные значения, чтобы проверить значения полей (и все, что вам нужно).

Только будьте осторожны, когда вы делаете это - я предлагаю читать на то, что Джош Блох должен был сказать в эффективной Java:

Item 8: Obey the general contract when overriding equals 
Item 9: Always override hashCode when you override equals 
0

Видя, как вы установили person1 и PERSON2 переменные быть одинаковыми объект,

hs.put(person1, "Durvi"); 
    hs.put(person2, "Pillu"); 

эквивалентно

hs.put(person1, "Durvi"); 
    hs.put(person1, "Pillu"); 
+0

Спасибо ... Я только что проверил размер моего Hashtable ... его 3, а не 4. Теперь я понял, что его заменили! – NewQueries 2010-11-24 04:04:23

0

Поймите, что в вашем Hashtable вы использовали ссылку на объект как ключ и String в качестве значения.

Оба лицом1 и PERSON2 указывает на тот же объект в основной метод, который является объектом, созданным с помощью

HashingTest("Durvi, 5, Female") 

hs.put(person1, "Durvi"); 
hs.put(person2, "Pillu"); 

Первый оператор пут выше, создает запись с ссылкой на объект из «Durvi» и присваивает значение "Durvi".

Поскольку ключи в Hashtables не могут быть дублированы, вторая строка заменяет значение «Durvi», созданное предыдущей строкой, с «Pillu» ..

Итак, когда вы выполняете метод GET

String personVal = (String)hs.get(person1); 
//returns the value "Pillu" which the key person1 now refers to in the hash table. 
System.out.println(personVal); //prints "Pillu" 

Я надеюсь, что я ясно дал понять .. получить обратно, если вам необходимо получить дополнительные разъяснения ..

Не преминул заметить, что у вас есть вместо ссылки «ключ» используется ссылка на объект. Надеюсь, вы этого не сделали по ошибке

+0

Спасибо Рагаван – NewQueries 2010-11-24 04:07:10

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