Red de conocimiento informático - Conocimiento informático - Análisis de casos clásicos de programación de Android

Análisis de casos clásicos de programación de Android

En primer lugar, también estudio programación.

1. En primer lugar, los métodos equals() y hashcode() se heredan de la clase de objeto. ?

El método equals() se define en la clase de objeto de la siguiente manera:?

público booleano es igual a(Objeto obj){?

return(this == obj);?

}?

Obviamente compara los valores de dirección de los dos objetos (es decir, si las referencias son las mismas). Pero debemos tener claro que cuando String, Math y Integer, Double. . . . Cuando estas clases encapsuladas usan el método igual (), han anulado el método igual () de la clase de objeto. Por ejemplo, en la categoría de cadena:?

público booleano es igual a(Objeto un objeto){?

si(esto == un objeto){?

¿Devuelve verdadero?

}?

if (una instancia de objeto de cadena) {?

Cadena otra Cadena =(Cadena)un objeto;?

int n = contar?

if (n == otraCadena.count) {?

char v 1[]= valor;?

char v2[]= otro valor de cadena;?

int i = desplazamiento?

int j = otraCadena.offset?

¿Y (n -!= 0) {?

si (v1[i]!= v2[j])?

¿Devuelve falso?

}?

¿Devolver verdadero?

}?

}?

¿Devuelve falso?

}?

Obviamente, esta es una comparación de contenido, no una comparación de direcciones. Espere a Doble, Entero, Matemáticas. . . . Por analogía, estas clases han anulado el método equals() para comparar contenidos. Por supuesto, el tipo básico es comparar valores y no hay mucho que decir al respecto. ?

También debemos tener en cuenta que el lenguaje Java tiene los siguientes requisitos para iguales (), que deben seguirse:?

Simetría: si x.equals(y) devuelve "verdadero", entonces y.equals(x) también debería devolver "verdadero". ?

Reflectividad: x.equals(x) debe devolver "verdadero". ?

Analogía: si x.equals(y) devuelve verdadero y y.equals(z) devuelve verdadero, entonces z.equals(x) también debería devolver verdadero. ?

Consistencia: si x.equals(y) devuelve "verdadero", siempre que el contenido de X e Y permanezca sin cambios, no importa cuántas veces repita x.equals(y), devolverá "verdadero" ". ?

En cualquier caso, x.equals(null) siempre devuelve "falso"; X.equals (un objeto de tipo diferente a X) siempre devuelve "falso". ?

Los cinco puntos anteriores son las pautas que se deben seguir al anular el método equals(). Si se viola, pueden ocurrir resultados inesperados. Por favor cumpla.

2. En segundo lugar, el método hashcode() se define en la clase de objeto de la siguiente manera:?

público nativo int hashCode();?

La descripción es un método local y su implementación es relativa a la máquina local. Por supuesto, podemos anular el método hashcode() en nuestras propias clases, como String, Integer y Double. . . . Espera, todas estas clases cubren el método hashcode(). Por ejemplo, el método hashcode() definido en la clase String es el siguiente:?

público int hashCode() {?

int h = hash?

si (h == 0) {?

int off = desplazamiento?

char val[]= valor;?

int len=contar?

for(int I = 0; i ltlen i) {?

h = 31*h? valor[apagado];?

}?

hash = h;?

}?

Devolver h;?

}?

Explica este programa (escrito usando String API):?

s[0]*31^(n-1)? s[1]*31^(n-2)? ...? s[n-1]?

Utilice el algoritmo int, donde s[i] es el carácter I-ésimo de la cadena, n es la longitud de la cadena y 0 significa exponenciación. (El código hash de una cadena vacía es 0).

Aquí primero debemos entender una pregunta:?

Para dos objetos cuyos iguales() son iguales, Hashcode() debe ser igual;?

Dos objetos cuyos iguales() no son iguales no pueden probar que su código hash() no es igual. En otras palabras, dos objetos cuyos métodos iguales () no son iguales pueden tener código hash () igual. Tengo entendido que se debe a colisiones al generar códigos hash. ?

Por el contrario: hashcode() no es igual, igual() no es igual; Hashcode() es igual, igual() puede ser igual o no igual; Explique el ámbito de uso del punto 3. Tengo entendido que se puede utilizar en objetos, cadenas y otras clases. En la clase de objeto, el método hashcode() es un método local que devuelve el valor de dirección del objeto, mientras que el método equals() en la clase de objeto compara los valores de dirección de dos objetos. Si es igual () es igual, significa que los valores de dirección de los dos objetos son iguales y, por supuesto, hashcode () también es igual. En la clase String, equals() devuelve una comparación del contenido de dos objetos. Cuando el contenido de dos objetos es igual.

El método Hashcode() también puede saber que los resultados devueltos por Hashcode() serán iguales según el análisis del código reescrito por la clase String (esto se ha analizado en el punto 2). Por analogía, podemos saber que los métodos iguales () y hashcode () reescritos en clases de paquete como Integer y Double también son adecuados para este principio. Por supuesto, después de heredar los métodos iguales () y hashcode () de la clase de objeto, cualquier clase anulada no seguirá este principio. ?

4. Hablando de hashcode() y equals(), debemos hablar de su uso en hashset, hashmap y hashtable. ¿Cuál es la situación específica? Consulte el siguiente análisis:?

HashSet hereda la interfaz Set, y la interfaz Set implementa la interfaz Collection, que es una relación jerárquica.

Entonces, ¿qué principio utiliza hashset para acceder a objetos? ?

No se permiten objetos duplicados en hashset y la posición de los elementos también es incierta. ¿Cómo determinar si los elementos de un hashset están repetidos? Éste es el quid de la cuestión. Después de una tarde de preguntas y verificación, finalmente tuve algunas revelaciones. Déjame compartirlo contigo. En las colecciones de Java, la regla para juzgar si dos objetos son iguales es:

1), para determinar si el código hash de dos objetos es igual.

Si no son iguales, los dos objetos no son iguales, ¿terminado?

Si es igual, por favor realice 2)?

(Esto es solo para mejorar la eficiencia del almacenamiento. De hecho, es posible sin él en teoría, pero si no, la eficiencia se reducirá considerablemente en el uso real, por lo que lo tratamos como una necesidad aquí. Nos centraremos en ello más adelante. ¿Esta pregunta?

2) ¿Utiliza la operación igual para determinar si dos objetos son iguales?

Si no son iguales, ¿crees que los dos objetos no son iguales?

Si son iguales, los dos objetos se consideran iguales (equals() es la clave para juzgar si dos objetos son iguales).

¿Por qué existen dos estándares? ¿No puedes usar el primero? No, porque dije antes que cuando hashcode () es igual, el método igual () puede no ser igual, por lo que debe estar restringido por el segundo criterio para garantizar que los elementos agregados no se repitan. ?

Por ejemplo, el siguiente código:

public static void main(String args[]){?

Cadena s 1 = nueva cadena ("Zhao Xudong");?

Cadena s2 = nueva cadena ("Zhao Xudong");?

sistema . println(s 1 = = S2); // ¿Falso?

sistema . fuera . println(s 1 . igual(S2)); //¿Verdadero?

system . out . println(s 1 . hashcode()); //¿Es s1.hashcode() igual a s2.hashcode()?

sistema . println(S2 . hashcode());?

set HashSet = nuevo HashSet();?

hashset .agregar(s 1);?

hashset.añadir(S2);?

/*Esencialmente, al sumar s1 y s2, usando los dos criterios mencionados anteriormente, podemos saber que hashset considera que s1 y s2 son iguales y está agregando elementos repetidos, por lo que S2 cubre s 1;* /?

Iterador it=hashset.