Jestem nadal prawie kompletnie zielony, tzn. rozpocząłem naukę Javy dosłownie kilka tygodni temu.
Mam problem odnośnie nadpisania metody hashCode()
.
Dla porównania szybkości przetwarzania różnych kolekcji chcę stworzyć kilka milionów obiektów klasy Book
, które będą miały tylko dwa pola: String author
i String title
.
Pola te będą wyglądały następująco:
Author-0, Title-0
Author-1, Title-1
Author-2, Title-2
Author-3, Title-3
itd.
Pełny kod:
import java.util.*;
import java.lang.*;
import java.io.*;
class Book {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return this.title;
}
public String getAuthor() {
return this.author;
}
@Override
public boolean equals(Object o){
final Book b = (Book) o;
return (title.equals(b.getTitle())) && (author.equals(b.getAuthor()));
}
/* TO JEST ŹLE
@Override
public int hashCode(){
Random randomGenerator = new Random();
return randomGenerator.nextInt(50);
}
*/
@Override
public String toString(){
return title + ", " + author;
}
}
class Application {
public static void main (String[] args) throws java.lang.Exception {
LinkedList<Book> bookList = new LinkedList<Book>();
HashMap<String, Book> bookMap = new HashMap<String, Book>();
String author = null;
String title = null;
String key = null;
for(int i = 0; i<1000000; i++) {
author = "Author-" + Integer.toString(i);
title = "Title-" + Integer.toString(i);
key = "Key-" + Integer.toString(i);
bookList.add(new Book(author, title));
bookMap.put(key, new Book(author, title));
}
System.out.println("Liczba elementów w kolekcji LinkedList: " + bookList.size());
System.out.println();
long beginLL = System.nanoTime();
bookList.add(new Book("New last author", "New last title"));
long endLL = System.nanoTime();
System.out.println("Dodanie elementu na końcu kolekcji LinkedList zajęło " + (endLL - beginLL) + " nanosekund");
long beginLL1 = System.nanoTime();
bookList.add(0, new Book("New first author", "New first title"));
long endLL1 = System.nanoTime();
System.out.println("Dodanie elementu na początku kolekcji LinkedList zajęło " + (endLL1 - beginLL1) + " nanosekund");
System.out.println();
System.out.println("Aktualny pierwszy element w kolekcji LinkedList to: " + bookList.get(0));
System.out.println("Aktualny ostatni element w kolekcji LinkedList to: " + bookList.get(bookList.size()-1));
System.out.println();
long beginLL2 = System.nanoTime();
bookList.remove(bookList.size()-1);
long endLL2 = System.nanoTime();
System.out.println("Usunięcie elementu z końca kolekcji LinkedList zajęło " + (endLL2 - beginLL2) + " nanosekund");
long beginLL3 = System.nanoTime();
bookList.remove(0);
long endLL3 = System.nanoTime();
System.out.println("Usunięcie elementu z początku kolekcji LinkedList zajęło " + (endLL3 - beginLL3) + " nanosekund");
System.out.println();
System.out.println("Aktualny pierwszy element w kolekcji LinkedList to: " + bookList.get(0));
System.out.println("Aktualny ostatni element w kolekcji LinkedList to: " + bookList.get(bookList.size()-1));
System.out.println();
}
}
I pytanie - jak nadpisać metodę hashCode()
, żeby mi te kilka milionów obiektów podzieliła na w miarę równoliczne podzbiory.
Nie potrafię sobie wyobrazić takiego kodu. Tzn. chodzi mi po głowie, żeby w hashCode()
usunąć z tych Stringów
wszystkie powtarzające się elementy (Author-
i Title-
), pozostałe części zamienić z powrotem na liczby i jakoś to podzielić.
Proszę o podpowiedź.
Przy czym po lekturze wpisu @jarekr000000 hashCode() - explain the magic zastanawiam się, czy w tym moim konkretnym przypadku metoda hashCode()
w ogóle będzie miała sens (bo wszystkie te wpisy są przecież prawie identyczne, praktycznie wyglądają tak, jak jakakolwiek lista kolejnych elementów typu int
). Ale nadpisać tę metodę muszę tak czy siak.