En la programación de Java, algunos conocimientos no se pueden aprender solo a través de especificaciones de lenguaje o documentos de API estándar. Este artículo lo enumera para usted.
1. Realización
1. Ahora igual ()
Persona de clase {nombre de cadena; int birthdayyear; byte [] crudo; public boolean iguales (objeto obj) {if (! obj instancia de persona) return false; Persona otra = (persona) obj; return name.equals (other.name) && birthrucyYear == OTRO.BIRTHYEAR && Arrays.equals (raw, other.raw); } public int hashcode () {...}} 2. Hashcode ()
persona de clase {cadena a; Objeto B; byte c; int [] d; public int hashcode () {return a.hashcode () + b.hashcode () + c + arrays.hashcode (d); } public boolean igual (objeto o) {...}}3. Implementar comparación ()
La persona de clase implementa comparable <Oll> {String FirstName; Cadena lastname; int cumpleaños; // Compare por FirstName, Break lazos de LastName, finalmente rompa los lazos por Birthdate public int Compareto (Person Other) {if (FirstName.Compareto (OTRO.FIRSTNAME)! = 0) return FirstName.compareto (OTRO.FIRSTNAME); else if (lastname.compareto (otro.lastname)! = 0) return lastname.compareto (other.lastName); else if (birthdate <otros.birthdate) return -1; else if (birthdate> other.birthdate) regreso 1; else regrese 0; }} Siempre implementa la versión genérica comparable en lugar de tipo primitivo comparable. Porque esto puede guardar el volumen del código y reducir la molestia innecesaria.
Solo se preocupan por los signos (negativos/cero/positivo) que devuelven el resultado, su tamaño no importa.
La implementación de comparador.compare () es similar a esta.
4. Implementar clone ()
Los valores de clase implementan clonables {String ABC; doble foo; int [] barras; Fecha contratada; Public Values clone () {try {valores resultado = (valores) super.clone (); result.bars = result.bars.clone (); result.hired = result.hired.clone (); resultado de retorno; } catch (clonenotsupportedException e) {// imposible tirar nueva afirmación (e); }}}2. Pruebas preventivas
1. Valor de verificación defensiva
int factorial (int n) {if (n <0) tirar nueva ilegalargumentException ("indefinida"); else if (n> = 13) tirar nueva arithmeticException ("desbordamiento de resultados"); más si (n == 0) return 1; else return n * factorial (n - 1);} 2. Objetos de prueba preventiva
int FindIndex (List <String> List, String Target) {if (list == NULL || Target == NULL) Lanzar nueva nullPointerException (); ...}3. Índice de matriz de detección preventiva
void froB (byte [] b, int index) {if (b == null) tirar nueva nullpointerException (); if (index <0 || índice> = B.Length) tire nuevo indexOUTOFBoundSexception (); ...}No piense que el índice de matriz dado no cruzará los límites. Para detectarlo explícitamente.
4. Intervalo de matriz de detección preventiva
void frob (byte [] b, int off, int len) {if (b == null) tirar nueva nullpointerException (); if (off <0 || off> b.length || len <0 || b.length - off <len) tirar nuevo índiceuToFboundsexception (); ...}No piense que el intervalo de matriz dado (por ejemplo, a partir de apagado, leyendo elementos LEN) no irá más allá de los límites. Para detectarlo explícitamente.
3. Array
1. Llenar elementos de matriz
Uso de bucles:
// llenar cada elemento de la matriz 'a' con 123 byte [] a = (...); para (int i = 0; i <a.length; i ++) a [i] = 123; (Preferencial) Métodos para usar la biblioteca estándar: arrays.fill (a, (byte) 123);
2. Copie un elemento de matriz en un rango
Uso de bucles:
// Copiar 8 elementos de la matriz 'a' que comienza en el desplazamiento 3 // a la matriz 'b' que comienza en el desplazamiento 6, // suponiendo que 'a' y 'b' son matrices distintos [] a = (...); byte [] b = (...); para (int i = 0; i <8; i ++) b [6 + i] = a [3 + i]; (Preferencial) Métodos para usar la biblioteca estándar: System.ArrayCopy (A, 3, B, 6, 8);
3. Ajuste el tamaño de la matriz
Use bucles (escalar):
// hacer una matriz 'a' más grande a newlenbyte [] a = (...); byte [] b = new byte [newlen]; para (int i = 0; i <a.length; i ++) // sube a la longitud de a b [i] = a [i]; a = b;
Use bucles (reduzca el tamaño):
// hacer una matriz 'a' más pequeña a newlenbyte [] a = (...); byte [] b = new byte [newlen]; para (int i = 0; i <b.length; i ++) // sube a la longitud de b b [i] = a [i]; a = b;
Métodos (preferenciales) para usar la biblioteca estándar:
1a = arrays.copyOf (a, newlen);
4. Empacar 4 bytes en un int
int PackBigendian (byte [] b) {return (b [0] & 0xff) << 24 | (B [1] y 0xff) << 16 | (B [2] y 0xff) << 8 | (b [3] y 0xff) << 0;} int Packlittleendian (byte [] b) {return (b [0] & 0xff) << 0 | (B [1] y 0xff) << 8 | (B [2] y 0xff) << 16 | (b [3] y 0xff) << 24;}5. Descompuesto int en 4 bytes
byte [] impackbigendian (int x) {return new byte [] {(byte) (x >>> 24), (byte) (x >>> 16), (byte) (x >>> 8), (byte) (x >>> 0)};} byte [] impacklittleendian (int x) {return byte >>> 8), (byte) (x >>> 16), (byte) (x >>> 24)};}Siempre use el operador de desplazamiento derecho sin firmar (>>>) para envolver los bits, no use el operador de cambio de derecha aritmético (>>).
Lo anterior se trata de este artículo, espero que sea útil para el aprendizaje de todos.