HashSet i hashCode

0

Witam

stworzylem najprostsza jak sie da klase

public class Person {
    public String name;
    public String lastname;

    @Override
    public int hashCode() {
        return name.length() + lastname.length();
    }
}

hashCode celowo taki nedzny, zeby sprawdzic czy nie dodam 2 osob o takiej samej ilosci literek w imieniu i nazwisku.

Do tego kodzik

Set<Person> set2 = new HashSet();
        Person person1 = new Person();
        person1.name = "m";
        person1.lastname = "k";
        
        Person person2 = new Person();
        person2.name = "p";
        person2.lastname = "c";

        set2.add( person2 );
        set2.add( person1 );

        System.out.println( person2.hashCode() );
        System.out.println( person1.hashCode() );

        for( Iterator<Person> iter = set2.iterator(); iter.hasNext();){
            Person per = iter.next();
            System.out.println( per.name + " " + per.lastname  );
        }

co daje wynik
2 (hashcode persony numer 2 ;)
2 (hashcode persony numer 1 ;)
m k
p c

czemu mimo rownego hashCodu pozwala dodac do seta nie nadpisujac tych obiektow?

0

Ponieważ przy dodawaniu poza hashCode sprawdzany jest też warunek równości elementów. Generalnie HashSet zapewnia unikalność obiektów, ale główną jego zaletą jest szybsze wyszukiwanie w porównaniu z innymi metodami. HashSet nie gwarantuje kolejności przy wybieraniu elementów.

Pomysł z hashem polega na tym, by obiekty grupować w "wiaderkach" - mniejszych kolekcjach, które łatwiej jest przeszukiwać. Obiekty o takim samym hashu trafiają do jednego wiaderka. Wyszukiwanie, dodawanie itd. polega na policzeniu hasha i wykorzystaniu do do ograniczenia przeszukiwanego zbioru.

0

Czyli parafrazując Koziołka, brakuje Ci metody equals uwzględniającej name i lastName.

1 użytkowników online, w tym zalogowanych: 0, gości: 1