Explicación detallada y diferencia entre Java comparable y comparador
Java nos proporciona dos mecanismos de comparación: comparables y comparadores. ¿Cuál es la diferencia entre ellos? Aprecemos hoy.
Clasificación natural comparable
Comparable es una interfaz en el paquete Java.lang, y solo hay un método que compare () dentro:
interfaz pública comparable <t> {public int Compareto (t o);}Comparable permite comparar objetos de la clase que implementan. Las reglas de comparación específicas se realizan de acuerdo con las reglas en el método Compareto. Este orden se llama orden natural.
Hay tres casos en los que el valor de retorno del método Compareto es:
Aviso:
1. Dado que NULL no es una clase o un objeto, debe prestar atención al caso de ECOMPARETO (NULL) al reescribir el método Compareto. Incluso si E.Equals (NULL) devuelve False, el método Compareto debería lanzar activamente una excepción de puntero nulo NullPointerException.
2. Al implementar la clase comparable para reescribir el método Compareto, el resultado de E1.compareto (E2) == 0 generalmente se requiere que sea consistente con E1.Equals (E2). De esta manera, en el futuro, cuando se usa SortedSet y otros contenedores de recolección clasificados de acuerdo con el tipo de clases naturales, se puede garantizar el orden de los datos guardados para ser consistente con la imaginación.
Algunas personas pueden tener curiosidad por lo que sucederá si se viola el segundo punto anterior.
Por ejemplo, si agrega dos objetos A y B a un conjunto de clasificación, AB satisface (! A.Equals (b) && A.compareto (b) == 0), y no se especifica otro comparador, cuando agrega A y luego B, agregará falso, y el tamaño del conjunto de clases no aumentará, porque en el conjunto de clases son los mismos, y la duplicación no está permitida en el sortset.
De hecho, los resultados de todas las clases básicas de Java que implementan la interfaz comparable son consistentes con el método igualas.
Listas o matrices que implementan la interfaz comparable se pueden clasificar utilizando los métodos colección.sort () o matricess.sort ().
Solo los objetos que implementan la interfaz comparable se pueden usar directamente como claves de SortedMap (SortedSet), de lo contrario, las reglas de clasificación del comparador deben especificarse fuera.
Por lo tanto, si desea utilizar clases de recolección ordenadas para la clase que defina, debe implementar la interfaz comparable, como:
** * Descripción: El libro de clases de entidad utilizado para probar, implementa la interfaz comparable, clasificación natural * <br/> * Autor: Shixinzhang * <br/> * Datos: 10/5/2016 */Public Class BookBean Implements Serializable, comparable {nombre de cadena privada; privado int count; Public BookBean (nombre de cadena, int count) {this.name = name; this.count = Count; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public int getCount () {return Count; } public void setCount (int count) {this.count = count; } / ** * Reescribe iguales * @param o * @return * / @Override public boolean iguales (objeto o) {if (this == o) return true; if (! (o instancia de bookbean)) devuelve falso; BookBean Bean = (BookBean) o; if (getCount ()! = bean.getCount ()) return false; return getName (). Equals (bean.getName ()); } /*** Reescribe el método de cálculo del cálculo de hashcode* basado en todos los atributos para evitar la duplicación* El factor de cálculo 31 se observa al calcular el húsico. Es un número primo y no se puede dividir nuevamente * @return */ @Override public int hashcode () {// call string's hashcode (), que solo representa el contenido de una cadena int resultado = getName (). HashCode (); // multiplicar por 31, más de cuenta de recuento = 31 * resultado + getCount (); resultado de retorno; } @Override public string toString () {return "bookbean {" + "name = '" + name +'/'' + ", count =" + count + '}'; } / ** * Al agregar BookBean a TreeSet, se solicitará a este método para clasificar * @param otro * @return * / @Override public int Compareto (objeto otro) {if (otra instancia de bookbean) {bookbean otrobook = (bookbean) otro; int resultado; // Por ejemplo, clasificación por precio del libro aquí resultado = getCount () - otrobook.getCount (); // o siga la cadena el orden de comparación // resultado = getName (). CompareTo (otrobook.getName ()); if (resultado == 0) {// Cuando el precio del libro es el mismo, compare el título. Asegúrese de que todos los atributos se comparen result = getName (). CompareTo (otrobook.getName ()); } resultado de retorno; } // return 0 return 0; }El código anterior también reescribió los métodos igualas () y hashcode (). Las clases personalizadas deben reescribir estos métodos cuando quieran compararlos.
Al reescribir comparación más tarde, debe juzgar si un cierto atributo es el mismo y comparar todos los atributos una vez.
La interfaz comparable es parte del marco de colecciones Java.
Clasificación personalizada de comparación
El comparador también es una interfaz bajo el paquete java.util. Antes de JDK 1.8, solo había dos métodos:
Comparador de interfaz pública <T> {public int Compare (t lhs, t rhs); público booleano es igual (objeto objeto);}Se han agregado muchos métodos nuevos a JDK 1.8:
Básicamente, todos están relacionados con la función, y las nuevas adiciones a 1.8 no se introducirán aquí.
De lo anterior, podemos ver que el uso de la clasificación natural requiere clases para implementar comparables, y el método comparado se reescribe internamente.
El comparador establece las reglas de clasificación externamente y las pasa a ciertas clases como parámetros de política de clasificación, como colección.sort (), matrizs.sort (), o algunas colecciones ordenadas internamente (como sortedset, sortedmap, etc.).
Cómo usarlo se divide principalmente en tres pasos:
1. Cree una clase de implementación de interfaz de comparación y asigne un valor a un objeto
Escriba reglas de clasificación para clases personalizadas en el método de comparación
2. Pase el objeto de comparación como parámetro a un método de la clase de clasificación
3. Agregue una clase personalizada utilizada en el método Compare a la clase de clasificación
Por ejemplo:
// 1. Cree un objeto que implementa la interfaz de comparación comparator = new Comparator () {@Override public int Compare (Object Object1, Object Object2) {if (Object1 InstanceOf NewBookBean && Object2 InstanceOf NewBookBean) {NewBookBean NewBookBean = (NewBookBean) Object1; NewBookBean NewBookBean1 = (NewBookBean) Object2; // Consulte el Comparisonto en clasificación natural para el método de método de comparación específico, aquí hay un Chestnut Return NewBookBean.getCount () - NewBookBean1.getCount (); } return 0; }}; // 2. Pase este objeto como un parámetro formal al constructor de TreeSet Treeset = New Treeset (Comparador); // 3. Agregue el objeto de la clase diseñado en el método Compare en el Paso 1 al TreeSet al 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 hecho, podemos ver que el uso del comparador es un modelo de estrategia. Los estudiantes que no están familiarizados con el modelo de estrategia pueden hacer clic aquí para ver: Modo de estrategia: Aprenda sobre la rutina fija de las novelas en línea.
Una referencia a la interfaz de comparación se mantiene en la clase de clasificación:
Comparador <? Super K> Comparador;
Podemos aprobar varias clases de implementación del comparador de reglas de clasificación personalizadas y formular diferentes estrategias de clasificación para la misma clase.
Resumir
Dos métodos de clasificación en Java:
Clasificación natural comparable. (Implementación de la clase de entidad)
El comparador es un tipo personalizado. (Si la clase de entidad no se puede modificar, se crea directamente en la persona que llama)
Cuando existe al mismo tiempo, utiliza las reglas de comparación (clasificación personalizada) para la comparación.
Para algunos tipos de datos ordinarios (como String, Integer, Double ...), implementan la interfaz comparable de forma predeterminada e implementan el método Compareto, que podemos usar directamente.
Para algunas clases personalizadas, pueden necesitar implementar diferentes estrategias de comparación en diferentes situaciones. Podemos crear una nueva interfaz de comparación y luego compararla utilizando una implementación de comparación específica.
Esta es la diferencia entre comparable y comparador.
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!