diferença entre equals () e hashCode ()

Eu quero uma breve definição sobre o equals (), "==" e hashCode (). Se eu executar o código a seguir, a saída será "true false 2420395 2420395". Mas eu entendi que o método equals () compara a string e "==" compara a referência. Mas, na saída, o método hashCcode () imprime o número de referência para ambas as seqüências da mesma forma, porque o "==" retorna "false".

            String str = "Name";
    String str1 = new String("Name");

    if(str.equals(str1))
        System.out.println("true");
    else
        System.out.println("false");
    if(str==str1)
        System.out.println("true");
    else
        System.out.println("false");

    System.out.println(str.hashCode());
    System.out.println(str1.hashCode());
}

questionAnswers(7)

yourAnswerToTheQuestion