Because it is a custom type, custom overrides are required for the Equals () function and the hashcode () function in HashMap.
Otherwise the content of the same object corresponding to the hashcode will be different, unable to play the normal function of the algorithm, covering the Equals function, should be equivalent to C + + overloaded = = operator to ensure that the equality can be judged. Except that Java does not have a custom overloaded operator, which requires a function overlay.
The function prototype of equals is the Boolean equals (Object O); The function prototype of hashcode is int hashcode ();
Look at the code first:
ImportJava.util.*;classPair<v,k>{V first; K second; PublicPair () {first =NULL; second =NULL;} PublicPair (V f,k s) { first=F; Second=s; }//Public Boolean equals (Object o) {//if (! ( o instanceof Pair))// {//return false;// }//pair<v,k> pn = (pair<v,k>) o;//return Pn.first.equals (first) && pn.second.equals (second);// }//public int Hashcode () {//return First.hashcode () + Second.hashcode ();// }} Public classMain { Public Static voidMain (string[] args) {Pair<String,String> p =NewPair<> ("A", "B"); Pair<String,String> q =NewPair<> ("A", "B"); System.out.println (P.equals (q)); System.out.println (P.hashcode ()+ " " +Q.hashcode ()); Map<Pair<String,String>,Integer> map =NewHashMap (); Map.put (P,1); System.out.println (Map.containskey (q)); Map.put (q,2); for(pair<string,string>Key:map.keySet ()) {System.out.println (Map.get (key)); } }}
This code the overloaded two functions to comment out, and then determine the value of the same two pair object P and Q are equal, and output their hashcode, and put P into the established HashMap, with Q to determine whether p exists, then put Q into, and traverse the values of the map. The answer is:
False
2018699554 1311053135
False
1
2
And then:
ImportJava.util.*;classPair<v,k>{V first; K second; PublicPair () {first =NULL; second =NULL;} PublicPair (V f,k s) { first=F; Second=s; } Public Booleanequals (Object o) {if(! (OinstanceofPair)) { return false; } Pair<V,K> pn = (pair<v,k>) O; returnPn.first.equals (first) &&Pn.second.equals (second); } Public inthashcode () {returnFirst.hashcode () +Second.hashcode (); }} Public classMain { Public Static voidMain (string[] args) {Pair<String,String> p =NewPair<> ("A", "B"); Pair<String,String> q =NewPair<> ("A", "B"); System.out.println (P.equals (q)); System.out.println (P.hashcode ()+ " " +Q.hashcode ()); Map<Pair<String,String>,Integer> map =NewHashMap (); Map.put (P,1); System.out.println (Map.containskey (q)); Map.put (q,2); for(pair<string,string>Key:map.keySet ()) {System.out.println (Map.get (key)); } }}
Then the result of removing the note is:
True
195 195
True
2
Although there is no reason to say that the hashcode overload here, but at least the same value of two objects their hashcode is the same, so that in HashMap the first level to determine whether Hashcode is the same, and then traverse to determine whether there are values of the same element, You can determine if a key value is included, update the value of the key, and so on.
Also note that the override of equals, the argument list cannot be changed to pair p because it is for pair, so it is only overloaded and does not overwrite.
Java custom type as the key value in HashMap (pair<v,k> for example)