开发者

Hashtable key fetches the wrong Value

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开发者_Go百科("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);

 }
}

Output ::

true : Which means that if two object varaibles are refering the same object the equals() method returns true Pillu


This is working as expected. What you are doing is this:

person2 = person1;

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

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

Since person2 == person1, the last call is equal to

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

As a side note, you need to implement equals() and hashCode() for your HashingTest class, take a look here:

  • http://www.ibm.com/developerworks/java/library/j-jtp05273.html


You are getting correct behavior in this case, but...

You can not expect what you have done to work correctly always because you have not overridden hashcode() and equals().

Since you are making a class whose instances are being used as keys in a hash container (like HashSet, HashMap, and HashTable), you must override hashcode() and equals().

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


By default java's equals method from Object will compare references. Since you set the references to be the same then yes, the call to 'equals' will return true. If you wish to change that behavior then you need to override equals to check field values (and whatever else you need).

Just be careful when you do this - I'd suggest reading up on what Josh Bloch had to say in effective java:

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


Seeing as you've set person1 and person2 variables to be the same object,

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

is equivalent to

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


Understand that in your Hashtable you have used the object reference as the key and the String as the value.

Both person1 and person2 points to the same object in the main method which is the object created by

HashingTest("Durvi, 5, Female")

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

The first put statement above, creates an entry with the object reference of "Durvi" and assigns the value "Durvi" to it.

As keys in Hashtables can't be duplicate, the second line replaces the value "Durvi" created by the previous line with "Pillu"..

So when you execute the get method

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"

I hope I have made it clear.. Get back if you need further clarifications..

Don't fail to notice that you have used the object reference in place of "key". I hope you didn't do it by mistake

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜