Quando uma classe em Java não substitui hashCode () , imprimir uma instância dessa classe fornece um número único e agradável.
O Javadoc de Object diz sobre hashCode () :
Tanto quanto for razoavelmente prático, o método hashCode definido pela classe Object retorna números inteiros distintos para objetos distintos.
Mas quando a classe substitui hashCode () , como posso obter seu número exclusivo?
Respostas:
System.identityHashCode (yourObject) fornecerá o código hash 'original' do yourObject como um número inteiro. Exclusividade não é necessariamente garantida. A implementação da Sun JVM fornecerá um valor relacionado ao endereço de memória original desse objeto, mas esse é um detalhe da implementação e você não deve confiar nele.
EDIT: Resposta modificada após o comentário de Tom abaixo re. endereços de memória e objetos em movimento.
fonte
System.identityHashCode()
?O javadoc para Object especifica que
Se uma classe substitui o hashCode, significa que deseja gerar um ID específico, o que (pode-se esperar) terá o comportamento correto.
Você pode usar System.identityHashCode para obter esse ID para qualquer classe.
fonte
hashCode()
O método não é para fornecer um identificador exclusivo para um objeto. Ele digere o estado do objeto (ou seja, valores dos campos membros) em um único número inteiro. Esse valor é usado principalmente por algumas estruturas de dados baseadas em hash, como mapas e conjuntos, para armazenar e recuperar objetos com eficiência.Se você precisar de um identificador para seus objetos, recomendo que você adicione seu próprio método em vez de substituir
hashCode
. Para esse fim, você pode criar uma interface base (ou uma classe abstrata) como abaixo.Exemplo de uso:
fonte
Talvez esta solução rápida e suja funcione?
Isso também fornece o número de instâncias de uma classe sendo inicializada.
fonte
System.identityHashCode
é uma solução melhorAtomicLong
como nesta resposta .Se é uma classe que você pode modificar, você pode declarar uma variável de classe
static java.util.concurrent.atomic.AtomicInteger nextInstanceId
. (Você precisará atribuir um valor inicial da maneira óbvia.) Em seguida, declare uma variável de instânciaint instanceId = nextInstanceId.getAndIncrement()
.fonte
Eu vim com esta solução que funciona no meu caso, onde tenho objetos criados em vários threads e são serializáveis:
fonte
Se você estiver pesquisando os
hashcode
tipos Java ao executar um.toString()
em um objeto, o código subjacente é este:fonte
Apenas para aumentar as outras respostas de um ângulo diferente.
Se você deseja reutilizar hashcode (s) de 'above' e obter novos usando o estado imutável da sua classe, uma chamada para super funcionará. Embora isso possa / não ocorra em cascata até o Object (ou seja, alguns ancestrais podem não chamar de super), ele permitirá que você obtenha códigos de hash por reutilização.
fonte
Há uma diferença entre os retornos hashCode () e identityHashCode (). É possível que, para dois objetos desiguais (testados com ==) o1, o2 hashCode () possa ser o mesmo. Veja o exemplo abaixo como isso é verdade.
fonte
Eu tive o mesmo problema e não estava satisfeito com nenhuma das respostas até agora, pois nenhuma delas garantiu IDs únicos.
Eu também queria imprimir IDs de objeto para depuração proposta. Eu sabia que devia haver alguma maneira de fazer isso, porque no depurador Eclipse, ele especifica IDs exclusivos para cada objeto.
Eu vim com uma solução baseada no fato de que o operador "==" para objetos só retorna true se os dois objetos são realmente a mesma instância.
Acredito que isso deve garantir IDs únicos durante toda a vida útil do programa. Observe, no entanto, que você provavelmente não deseja usá-lo em um aplicativo de produção, pois ele mantém referências a todos os objetos para os quais você gera IDs. Isso significa que quaisquer objetos para os quais você cria um ID nunca serão coletados como lixo.
Como estou usando isso para fins de depuração, não estou muito preocupado com a memória sendo liberada.
Você pode modificar isso para permitir a limpeza de objetos ou a remoção de objetos individuais se a liberação de memória for uma preocupação.
fonte