[RESOLVIDO] Como sobreescrever e qual a importância do hashCode?

Boa Tarde Amigos.

Li que uma classe Bean deve possuir os atributos, um construtor, os métodos getters e setters para cada atributo, sobreescrever o método toString, o hashCode e o equals. Mas qual a finalidade do hashCode? Pelo que entendi você pega os atributos ou um atributo numérico e multiplica por um número primo para que nunca exista objetos iguais e por ai vai.

Alguém pode me explicar melhor

Oi!

Você leu que DEVE sobrescrever tais métodos ou que simplesmente é uma recomendação?!
Há uma diferença importante entre eles. Eu particularmente, nunca tive de sobrescrever o equals(). O que é dito que quando se sobrescreve o equals é necessário a sobrescrita do hashcode, de modo a validar a igualdade entre os objetos.

Como fazer? http://www.guj.com.br/java/52485-hashcode-duvida.

Abraços!

Eu li que é recomendado, principalmente quando for utilizar alguma collection que necessite do código HASH para otimizar o máximo de desempenho. E se for sobrescrito o equals DEVE-SE sobresscrever o HASHCODE.

E como estou estudando pra OCJA e OCJP estou fazendo um projeto que tinha em mente e pretendo utilizar estas técnicas pra fixar bem o conteúdo.

[quote=PhilipeSC]Eu li que é recomendado, principalmente quando for utilizar alguma collection que necessite do código HASH para otimizar o máximo de desempenho. E se for sobrescrito o equals DEVE-SE sobresscrever o HASHCODE.

E como estou estudando pra OCJA e OCJP estou fazendo um projeto que tinha em mente e pretendo utilizar estas técnicas pra fixar bem o conteúdo.[/quote]

Ai eu concordo contigo.
Se caso sobrescrever o equals, sobrescreve o hashcode. Não que você seja obrigado a sobrescrever sempre ambos, em cada classe que crie. Foi isso que eu quis dizer.

Abraços.

Bom implementei uma classe chamada Manga, nela implementei o EQUALS e o HASH CODE conforme vocês podem ver abaixo:

package beans;

import java.util.ArrayList;


public class Manga {

	private int codigo;
	private String nome;
	private ArrayList<Edicao> edicao;
	private ArrayList<Autor> autor;
	private Editora editora;
	
	
	public Manga(int codigo, String nome, ArrayList<Edicao> edicao, ArrayList<Autor> autor, Editora editora) {
		setCodigo(codigo);
		setNome(nome);
		setEdicao(edicao);
		setAutor(autor);
		setEditora(editora);
	}
	
	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public ArrayList<Edicao> getEdicao() {
		return edicao;
	}

	public void setEdicao(ArrayList<Edicao> edicao) {
		this.edicao = edicao;
	}

	public ArrayList<Autor> getAutor() {
		return autor;
	}

	public void setAutor(ArrayList<Autor> autor) {
		this.autor = autor;
	}

	public Editora getEditora() {
		return editora;
	}

	public void setEditora(Editora editora) {
		this.editora = editora;
	}

	public String toString() {		
		return 	"Código: "+ codigo + 
				"\nNome: " + nome +
				"\nEdição: " + edicao.toString() +
				"\nAutor:" + autor.toString() + 
				"\nEditora: " + editora.toString();
	}
	
	public boolean equals(Object object) {
		if(object == null) {
			return false;
		}
		if( ! (this.getClass().equals(object.getClass())) ) {
			return false;
		}
		Manga manga = (Manga) object;
		boolean codigosIguais = this.getCodigo() == manga.getCodigo();
		boolean nomesIguais;
		boolean edicoesIguais;
		boolean autoresIguais;
		boolean editorasIguais;
		if(this.getNome() != null) {
			nomesIguais = this.getNome().equals(manga.getNome());
		}else{
			nomesIguais = this.getNome() == null;
		}
		if(this.getEdicao() != null) {
			edicoesIguais = this.getEdicao().equals(manga.getEdicao());
		}else{
			edicoesIguais = this.getEdicao() == null;
		}
		if(this.getAutor() != null) {
			autoresIguais = this.getAutor().equals(manga.getAutor());
		}else{
			autoresIguais = this.getAutor() == null;
		}
		if(this.getEditora() != null) {
			editorasIguais = this.getEditora().equals(manga.getEditora());
		}else{
			editorasIguais = this.getEditora() == null;
		}
		return codigosIguais && nomesIguais && edicoesIguais && autoresIguais && editorasIguais;
	}
	
	public int hashCode() {
		int resultado = 17;
		resultado = 37 * resultado + codigo;
		resultado = 37 * resultado + (nome != null ? nome.hashCode() : 0);
		resultado = 37 * resultado + (edicao != null ? edicao.hashCode() : 0);
		resultado = 37 * resultado + (autor != null ? autor.hashCode() : 0);
		resultado = 37 * resultado + (editora != null ? editora.hashCode() :0);
		return resultado;
	}
}

Tenho outras classes (nestas ainda não implementei os Hash e o Equals conforme abaixo.

package beans;

public class Edicao {

	private int edicao;
	private int numeroDePaginas;
	private double preco;
	
	public Edicao(int edicao, int numeroDePaginas, double preco) {
		setEdicao(edicao);
		setNumeroDePaginas(numeroDePaginas);
		setPreco(preco);
	}
	
	public int getEdicao() {
		return edicao;
	}

	public void setEdicao(int edicao) {
		this.edicao = edicao;
	}

	public int getNumeroDePaginas() {
		return numeroDePaginas;
	}

	public void setNumeroDePaginas(int numeroDePaginas) {
		this.numeroDePaginas = numeroDePaginas;
	}

	public double getPreco() {
		return preco;
	}

	public void setPreco(double preco) {
		this.preco = preco;
	}

	public String toString() {
		return 	"Edição: " + edicao +
				"\nNúmero de Páginas: " + numeroDePaginas +
				"\n Preço: " + preco;
	}
	
}
package beans;

public class Autor {
	
	private int codigo;
	private String nome;
	private String sobrenome;

	public Autor(int codigo, String nome, String sobrenome) {
		setCodigo(codigo);
		setNome(nome);
		setSobrenome(sobrenome);
	}
	
	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

	public String toString() {
		return	"Nome: " + nome +
				"Sobrenome: " + sobrenome;
	}

}
package beans;

public class Editora {

	private int codigo;
	private String nome;
	private String cnpj;
	
	public Editora(int codigo, String nome, String cnpj) {
		setCodigo(codigo);
		setNome(nome);
		setCnpj(cnpj);
	}
	
	public int getCodigo() {
		return codigo;
	}
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getCnpj() {
		return cnpj;
	}
	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	public String toString() {
		return	"Nome: " + nome +
				"\nCnpj: " + cnpj;
	}
	
}

Bom fui testar com a minha classe Main mas os valores HASH não batem. Meu Equals diz que são iguais, mas se vocês verem eu instanciei Arrays em um Objeto Manga e em outro não pela regra HASH ele ta correto, mas o equals devia retornar FALSE pois

if(this.getEdicao() != null) {
edicoesIguais = this.getEdicao().equals(manga.getEdicao());
}else{
edicoesIguais = this.getEdicao() == null;

if(this.getAutor() != null) {
autoresIguais = this.getAutor().equals(manga.getAutor());
}else{
autoresIguais = this.getAutor() == null;
}

no return deveria ser false pois return codigosIguais && nomesIguais && edicoesIguais && autoresIguais && editorasIguais;

isso tá ocorrendo porque não implementei equals nas outras classes?

package beans;

import java.util.ArrayList;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
		Manga m1 = new Manga(2, "ONE", null, null, null);
		Manga m2 = new Manga(2, "ONE", new ArrayList<Edicao>(), new ArrayList<Autor>(), null);
		if(m1.equals(m2))
			System.out.println("São Iguais");
		else
			System.out.println("Não são iguais");
		
		System.out.println(m1.hashCode());
		System.out.println(m2.hashCode());
	}

}

Valeu ae quem ajudar!!!

EDITADO:

Pessoas se eu coloco ele diz que não sao iguais!!! Que droga :@

if(m2.equals(m1))
System.out.println(“São Iguais”);
else
System.out.println(“Não são iguais”);

	System.out.println(m1.hashCode());
	System.out.println(m2.hashCode());

Povo Resolvi, mudei o método equals, falta de atenção mesmo. Valeu pela ajuda nel!!!

	public boolean equals(Object object) {
		if(object == null) {
			return false;
		}
		if( ! (this.getClass().equals(object.getClass())) ) {
			return false;
		}
		Manga manga = (Manga) object;
		boolean codigosIguais = this.getCodigo() == manga.getCodigo();
		boolean nomesIguais;
		boolean edicoesIguais;
		boolean autoresIguais;
		boolean editorasIguais;
		if(this.getNome() != null) {
			nomesIguais = this.getNome().equals(manga.getNome());
		}else{
			nomesIguais = manga.getNome() == null;
		}
		if(this.getEdicao() != null) {
			edicoesIguais = this.getEdicao().equals(manga.getEdicao());
		}else{
			edicoesIguais = manga.getEdicao() == null;
		}
		if(this.getAutor() != null) {
			autoresIguais = this.getAutor().equals(manga.getAutor());
		}else{
			autoresIguais = manga.getAutor() == null;
		}
		if(this.getEditora() != null) {
			editorasIguais = this.getEditora().equals(manga.getEditora());
		}else{
			editorasIguais = manga.getEditora() == null;
		}
		return codigosIguais && nomesIguais && edicoesIguais && autoresIguais && editorasIguais;
	}

Como coloco RESOLVIDO no nome do tópico?