Hangt hier werkelijk niemand rond die genoeg van java weet om mij dit probleem uit te leggen???
Ik weet veel van Java, ik heb al op mijn eentje een full-blown media-managment programma gemaakt (lees: mp3 afspelen, binnen Java videos afspelen met de hulp van VLC-dll files die ik binnenhaalde via JNA, youtube-crawler en videos downloaden van youtube, dynamisch klassen binnenhalen die niet met mijn programma gecompiled zijn om als plugin te gebruiken, ...) Zie:
http://sourceforge.net/projects/lyricscatcher/
Maar, als je je niet aan de regels van het coderen houdt (lees: niet zelf de equals en hashcode implementeert) dan kan uiteraard vanalles misgaan. De regel is:
http://www.ifs.tuwien.ac.at/ifs/lehre/eprog/javadoc/jdk/docs/api/java/lang/Object.html#hashCode%28%29 schreef:# If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
# It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
In jouw implementatie zijn de 2 bovenstaande regels dus niet vervuld. Als je de functies equals() en hashcode() niet geïmplementeerd hebt, is het nogal vanzelfsprekend dat het niet werkt.
Waarom het
precies niet werkt is een veel moeilijkere vraag. Daarvoor moet je iets af kennen van de Java compiler en de JVM, en daar weet ik niets vanaf. Maar dat is dan ook een vrij zinloze vraag...
Edit: ik heb precies een stapje overgeslagen. De hashcode is afhankelijk van de JVM omwille van:
The default hashCode() method uses the 32-bit internal JVM address of the Object as its hashCode. However, if the Object is moved in memory during garbage collection, the hashCode stays constant. This default hashCode is not very useful, since to look up an Object in a HashMap, you need the exact same key Object by which the key/value pair was originally filed. Normally, when you go to look up, you don’t have the original key Object itself, just some data for a key. So, unless your key is a String, nearly always you will need to implement a hashCode and equals method on your key class. Object.hashCode in a native method.
http://mindprod.com/jgloss/hashcode.html