Explicação detalhada e diferença entre Java comparável e comparador
O Java nos fornece dois mecanismos de comparação: comparável e comparador. Qual é a diferença entre eles? Vamos descobrir hoje.
Tipo natural comparável
Comparável é uma interface no pacote java.lang, e existe apenas um método que Compareto () dentro:
interface pública comparável <t> {public int compareto (t o);}Comparável permite que objetos da classe que a implementam seja comparada. As regras de comparação específicas são realizadas de acordo com as regras no método compareto. Esta ordem é chamada de ordem natural.
Existem três casos em que o valor de retorno do método compareto é:
Perceber:
1. Como o NULL não é uma classe ou um objeto, você deve prestar atenção ao caso de e.compareto (nulo) ao reescrever o método compareto. Mesmo que o E.Equals (NULL) retorne falso, o método compareto deve lançar ativamente uma exceção de ponteiro nulo NullPointerException.
2. Ao implementar a classe comparável para reescrever o método compareto, o resultado do e1.compareto (e2) == 0 geralmente é necessário para ser consistente com o e1.equals (e2). Dessa forma, no futuro, ao usar o StoredSet e outros contêineres de coleção classificados de acordo com o tipo de classes naturais, a ordem dos dados salvos pode ser garantida para ser consistente com a imaginação.
Algumas pessoas podem estar curiosas sobre o que acontecerá se o segundo ponto acima for violado?
Por exemplo, se você adicionar dois objetos A e B a um conjunto de classificação, AB satisfaz (! A.Equals (b) && a.compareto (b) == 0), e não há outro comparador especificado, então quando você adicionará a e depois B, ele adicionará falso, e o tamanho do conjunto de classificação não será aumentado, porque o conjunto de classificação é o mesmo, e duplicação.
De fato, os resultados de todas as classes principais Java que implementam a interface comparável são consistentes com o método igualas.
Lista ou matrizes que implementam a interface comparável podem ser classificadas usando os métodos Coleções.sort () ou Arrays.sort ().
Somente objetos que implementam a interface comparável podem ser usados diretamente como teclas do SortEdMap (SortEdSet); caso contrário, as regras de classificação do comparador devem ser especificadas fora.
Portanto, se a classe que você se definir deseja usar classes de coleta ordenadas, você precisa implementar a interface comparável, como:
** * Descrição: O livro da classe de entidade usado para testar, implementa a interface comparável, classificação natural * <br/> * autor: shixinzhang * <br/> * Dados: 10/5/2016 */classe pública implementos de livros de livros serializáveis e comparáveis {private string name; Parte INT privada; public bookbean (nome da string, int conting) {this.name = name; this.count = count; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public int getCount () {Return Count; } public void setCount (int conting) {this.count = count; } / ** * reescrita igual * @param o * @return * / @Override public boolean equals (objeto o) {if (this == O) return true; if (! (o Instância do livro)) retorne false; Bookbean bean = (bookbean) o; if (getCount ()! = bean.getCount ()) retorna false; return getName (). igual a (bean.getName ()); } /*** Reescreva o método de cálculo do código de hashCode* Iterativo com base em todos os atributos para evitar duplicação* O fator de cálculo 31 é visto ao calcular o código de hash. É um número primo e não pode ser dividido novamente * @return */ @Override public int hashCode () {// Call's String's hashCode (), que representa apenas o conteúdo de um string int resultado = getName (). HashCode (); // multiplicar por 31, além de resultado da contagem = 31 * resultado + getCount (); resultado de retorno; } @Override public string tostring () {return } / ** * Ao adicionar o BookBean ao TreeSet, esse método será chamado para classificar * @param outro * @return * / @Override public int compareto (objeto outro) {if (outra instância de bookbean) {bookbean outro livro = (bookbean) outro; Int resultado; // Por exemplo, classificação por preço do livro aqui resultado = getCount () - outro livro.getCount (); // ou siga string a ordem da comparação // resultado = getName (). Compareto (outro livro.getName ()); if (resultado == 0) {// Quando o preço do livro for o mesmo, compare o título. Verifique se todos os atributos são comparados resultado = getName (). Compareto (outro livro.getName ()); } resultado de retorno; } // retorna 0 retornar 0; }O código acima também reescreveu os métodos iguais () e hashcode (). As aulas personalizadas precisam reescrever esses métodos quando desejam compará -los.
Ao reescrever o Compareto mais tarde, você precisa julgar se um determinado atributo é o mesmo e comparar todos os atributos uma vez.
A interface comparável faz parte da estrutura de coleções Java.
Classificação personalizada do comparador
O comparador também é uma interface no pacote java.util. Antes do JDK 1.8, havia apenas dois métodos:
Comparador de interface pública <t> {public int compare (t lhs, ths); Public boolean é igual (objeto);}Muitos novos métodos foram adicionados ao JDK 1.8:
Basicamente, todos estão relacionados à função e as novas adições a 1,8 não serão introduzidas aqui.
Pelo acima, podemos ver que o uso de classificação natural requer classes para implementar comparável, e o método Comparato é reescrito internamente.
O comparador define as regras de classificação externamente e as passa para determinadas classes como parâmetros de política de classificação, como coleções.sort (), Arrays.sort () ou algumas coleções ordenadas internamente (como classificação STORTED, STORNEDMAP, etc.).
Como usá -lo é dividido principalmente em três etapas:
1. Crie uma classe de implementação da interface do comparador e atribua um valor a um objeto
Escreva regras de classificação para classes personalizadas no método de comparação
2. Passe o objeto comparador como um parâmetro para um método da classe de classificação
3. Adicione uma classe personalizada usada no método de comparação à classe de classificação
Por exemplo:
// 1. Crie um objeto que implemente o comparador comparador comparador = new Comparator () {@Override public Int Compare (object Object1, object Object2) {if (object1 Instância de newBookBean && Object2 canstingOf NewBookBean) {newBookBeanBeanBean = (newBookBean) object1; NewBookBean newbookBean1 = (newBookBean) objeto2; // Consulte o Comparisonto na classificação natural para o método de comparação específico, aqui está um Chestnut Return NewBookBean.getCount () - newBookBean1.getCount (); } retornar 0; }}; // 2. Passe esse objeto como um parâmetro formal para o construtor de árvores de treeset = novo árido (comparador); // 3. Adicione o objeto da classe projetado no método de comparação na Etapa 1 ao TreeSet ao Treeset TreeSet.Add (New NewBookBean ("A", 34)); TreeSet.Add (New NewBookBean ("S", 1)); TreeSet.add (New NewBookBean ("V", 46)); TreeSet.Add (New NewBookBean ("Q", 26));De fato, podemos ver que o uso do comparador é um modelo de estratégia. Os alunos que não estão familiarizados com o modelo de estratégia podem clicar aqui para visualizar: Modo de estratégia: Aprenda sobre a rotina fixa dos romances on -line.
Uma referência à interface do comparador é mantida na classe de classificação:
Comparador <? super k> comparador;
Podemos passar em várias classes de implementação do comparador de regras de classificação personalizadas e formular diferentes estratégias de classificação para a mesma classe.
Resumir
Dois métodos de classificação em Java:
Classificação natural comparável. (Implementação da classe de entidade)
O comparador é uma classificação personalizada. (Se a classe de entidade não puder ser modificada, ela será criada diretamente no chamador)
Quando existe ao mesmo tempo, usa as regras do comparador (classificação personalizada) para comparação.
Para alguns tipos de dados comuns (como string, número inteiro, duplo ...), eles implementam a interface comparável por padrão e implementam o método compareto, que podemos usar diretamente.
Para algumas classes personalizadas, eles podem precisar implementar diferentes estratégias de comparação em diferentes situações. Podemos criar uma nova interface do comparador e compará -la usando uma implementação de comparador específica.
Essa é a diferença entre comparável e comparador.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!