Contenido básico de Java (2)

1. ¿Cuál es la diferencia entre int e Integer y qué resultado se obtendrá al realizar la operación == entre los dos?

Int es el tipo de datos básico y Integer es la clase contenedora de int. Al realizar la operación == entre los dos, Integer se descomprimirá automáticamente en tipo int y luego se comparará. En ese momento, si los dos valores int son iguales, devuelve verdadero; de lo contrario, devuelve falso.

2. Reescritura y sobrecarga de métodos.

La sobrecarga ocurre en la misma clase. Si varios métodos tienen el mismo nombre de método y diferentes listas de parámetros, forman una relación de sobrecarga. La sobrecarga no tiene nada que ver con el valor de retorno y el modificador de acceso del método, es decir, el método sobrecargado no se puede distinguir según el tipo de retorno.

La reescritura ocurre en una subclase de una clase principal. Si un método de subclase desea formar una relación primordial con un método de clase principal, su nombre de método y lista de parámetros deben ser los mismos que los del método de clase principal. Además, el valor de retorno debe ser menor o igual que el método de la clase principal, la excepción lanzada debe ser menor o igual que el método de la clase principal y el modificador de acceso debe ser mayor o igual que el método de la clase principal. Además, si el modificador de acceso del método de la clase principal es privado, la subclase no puede anularlo.

3. ¿Se puede reescribir el constructor?

Los constructores no se pueden anular. Porque el método constructor debe mantener el mismo nombre que la clase, y el requisito para reescribir es que el método de la subclase debe mantener el mismo nombre que el método de la clase principal. Si se permite anular el constructor, habrá un constructor con un nombre de clase diferente en la subclase, lo que no cumple con los requisitos del constructor.

4. Introduzca los métodos en la clase Objeto.

La clase Object proporciona los siguientes métodos comunes:

  • Class<?> getClass(): Devuelve la clase de tiempo de ejecución del objeto.

  • booleano igual (Objeto obj): determina si el objeto especificado es igual al objeto.

  • int hashCode(): Devuelve el valor hashCode del objeto. De forma predeterminada, el método hashCode() de la clase Object se calcula en función de la dirección del objeto. Sin embargo, muchas clases han reescrito el método hashCode() de la clase Object y ya no calculan el valor del método hashCode() en función de la dirección.

  • String toString(): Devuelve la representación de cadena del objeto. Cuando el programa usa el método System.out.println() para generar un objeto, o conecta un objeto a una cadena, el sistema llamará automáticamente al toString() del objeto). El método devuelve la representación de cadena del objeto. El método toString() de la clase Object devuelve una cadena en el formato de valor nombre de clase de tiempo de ejecución@código hash hexadecimal, pero muchas clases anulan el método toString() de la clase Object para devolver una cadena que puede expresar la información del objeto.

Además, la clase Object también proporciona varios métodos, como esperar (), notificar () y notificar a todos (), a través de los cuales se puede controlar la suspensión y ejecución de subprocesos. La clase Object también proporciona un método clone (), que se utiliza para ayudar a otros objetos a lograr la "autoclonación", la llamada "autoclonación" es para obtener una copia del objeto actual, y los dos están completamente aislados. . Dado que este método está protegido, solo las subclases pueden anularlo o llamarlo.

5. Hable sobre la relación entre hashcode () y equals ()

hashCode() se usa para obtener el código hash (código hash), y eauqls() se usa para comparar si dos objetos son iguales, deben cumplir con las siguientes regulaciones:

  • Si dos objetos son iguales, deben tener el mismo código hash.

  • Si dos objetos tienen el mismo código hash, no son necesariamente iguales.

Otras lecturas

En Java, la interfaz Set representa una colección desordenada con elementos no repetibles, y HashSet es una implementación típica de la interfaz Set.

Al agregar un elemento a un HashSet, es necesario determinar si el elemento ya está incluido en el conjunto para evitar el almacenamiento repetido. Dado que este juicio es muy frecuente, debemos prestar atención a la eficiencia y no utilizar el método de recorrer la colección para comparar elementos uno por uno. De hecho, HashSet resuelve este problema de juicio obteniendo el código hash del objeto y llamando al método igual () del objeto.

HashSet primero llama al método hashCode() del objeto para obtener su código hash y usa el código hash para determinar dónde se almacena el objeto en el conjunto. Suponiendo que un objeto se haya almacenado anteriormente en esta ubicación, HashSet llamará a equals() para comparar los dos objetos. Si son iguales, significa que los objetos están duplicados y los objetos recién agregados no se guardarán en este momento. Si eso no significa que los objetos no se repitan, pero sus ubicaciones de almacenamiento chocan, HashSet utilizará una estructura de cadena para guardar varios objetos en la misma ubicación, es decir, vincular el objeto recién agregado al objeto original. Después de eso, cuando un objeto recién agregado también se asigna a esta ubicación, debe compararse con iguales () con todos los objetos en esta ubicación. Si no son iguales, se encadenarán después del último objeto.

6. ¿Por qué deberíamos reescribir hashCode() y equals()?

El primer punto: darse cuenta de las necesidades especiales.
El segundo punto: es comparar si dos objetos son iguales de manera más eficiente.

De forma predeterminada, igual compara dos objetos para ver si apuntan a la misma dirección.
Pero a veces queremos que dos objetos consideren que sus cualidades son verdaderas siempre que algunas propiedades sean iguales. Por ejemplo:
Estudiante s1 = nuevo Estudiante(1,"nombre1");
Estudiante s2 = nuevo Estudiante(1,"nombre1");
Si no se reescribe igual, son diferentes, por lo que tenemos que enfatizar los iguales y juzgar siempre que Si sus identificadores y nombres son iguales, igual es verdadero.
 

Las características del método hashcode:
(1) La existencia de HashCode se usa principalmente para facilitar la búsqueda, como Hashtable, HashMap, etc. HashCode se usa a menudo para determinar la dirección de almacenamiento del objeto; (2) Si los
dos los objetos son iguales, el método igual debe devolver verdadero y el HashCode de los dos objetos debe ser el mismo;
(3) El HashCode de los dos objetos es el mismo, lo que no significa necesariamente que los dos objetos sean iguales. es decir, igual () no es necesariamente cierto, solo puede indicar que los dos objetos están en el mismo lugar en una estructura de almacenamiento hash.
(4) Si se reescribe el método igual del objeto, entonces el código Hash del objeto también se reescribe tanto como sea posible para garantizar que cuando el método igual sea igual, el código hash de los dos objetos devuelva el mismo valor.

7.¿Cuál es la diferencia entre == e igual()?

== operador:

  • Cuando actúa sobre tipos de datos básicos, compara si dos valores son iguales;

  • Al actuar sobre tipos de datos de referencia, compara si las direcciones de memoria de dos objetos son las mismas, es decir, determina si son el mismo objeto;

método igual():

  • Cuando no se anula, el Objeto se implementa con == de forma predeterminada, es decir, compara si las direcciones de memoria de dos objetos son las mismas;

  • Después de reescribir, la comparación generalmente se basará en el contenido de los objetos. Si el contenido de los dos objetos es el mismo, los objetos se consideran iguales; de lo contrario, los objetos se consideran desiguales.

8. ¿Qué métodos tiene la clase String?

La clase String es la API más utilizada en Java. Contiene una gran cantidad de métodos para procesar cadenas. Los más utilizados son:

  • char charAt(int index): devuelve el carácter en el índice especificado;

  • Subcadena de cadena (int beginIndex, int endIndex): intercepta una parte de la subcadena de esta cadena;

  • String [] split (String regex): divide esta cadena en una matriz de acuerdo con las reglas especificadas;

  • String trim(): elimina los espacios iniciales y finales de la cadena;

  • int indexOf(String str): devuelve el índice de la primera aparición de la subcadena en esta cadena;

  • int lastIndexOf(String str): devuelve el índice de la última aparición de la subcadena en esta cadena;

  • boolean comienza con (prefijo de cadena): determina si esta cadena comienza con el prefijo especificado;

  • boolean termina con (sufijo de cadena): determina si esta cadena termina con el sufijo especificado;

  • String toUpperCase(): todos los caracteres de esta cadena están en mayúsculas;

  • String toLowerCase(): todos los caracteres de esta cadena están en minúsculas;

  • Reemplazo de cadenaPrimero (expresión regular de cadena, reemplazo de cadena): reemplaza la primera subcadena coincidente con la cadena especificada;

  • String replaceAll (String regex, String replacement): reemplaza todas las subcadenas coincidentes con la cadena especificada.

9. ¿Se puede heredar String?

Clase modificada: la clase no se puede heredar

Método modificado: indica que el método no puede ser anulado por subclases, pero puede sobrecargarse

Variable modificada: significa que una vez que a una variable se le asigna un valor, no puede cambiar otros valores.

La clase String se modifica con final, por lo que no se puede heredar.

La razón por la que la clase String debe diseñarse como una clase inmutable es principalmente por consideraciones de seguridad y rendimiento, que se pueden resumir en los siguientes cuatro puntos.

  • Dado que las cadenas se utilizan ampliamente en cualquier sistema Java y se utilizan para almacenar información confidencial, como cuentas, contraseñas, rutas de red, procesamiento de archivos y otros escenarios, es particularmente importante garantizar la seguridad de la clase String. variable y fácil de manipular, por lo que no podemos garantizar que sea seguro al usar cadenas para las operaciones. Es muy probable que se produzcan inyecciones SQL, acceso a archivos peligrosos y otras operaciones.

  • En subprocesos múltiples, solo los objetos y valores inmutables son seguros para subprocesos y los datos se pueden compartir entre varios subprocesos. Dado que String es naturalmente inmutable, cuando un hilo "modifica" el valor de una cadena, solo generará un nuevo objeto de cadena, que no tendrá ningún efecto secundario en el acceso de otros hilos. Todos accederán a los mismos datos de cadena. No Se requieren operaciones de sincronización.

  • Como estructura de datos básica, las cadenas se utilizan ampliamente en algunos contenedores de colecciones, especialmente en algunas colecciones de hash. En las colecciones de hash, la posición de los elementos debe determinarse de acuerdo con el método hashCode () del objeto. Dado que el atributo de código hash de la cadena no cambiará, se garantiza la unicidad, lo que permite que contenedores como HashMap y HashSet implementen las funciones de almacenamiento en caché correspondientes. Debido a la inmutabilidad de String, se evita el cálculo repetido del código hash y solo se utiliza el código hash almacenado en caché, lo que mejora en gran medida el rendimiento del uso de objetos String en colecciones hash.

  • El grupo constante de cadenas tiene sentido cuando las cadenas son inmutables. La aparición del grupo de constantes de cadenas puede reducir la necesidad de crear cadenas con el mismo literal, lo que permite que diferentes referencias apunten a la misma cadena en el grupo, lo que ahorra mucha memoria dinámica durante el tiempo de ejecución. Si la cadena es variable, el grupo constante de cadenas no tendrá sentido y el método String.intern() basado en el grupo constante tampoco será válido. Cada vez que se crea una nueva cadena, se abrirá un nuevo espacio en el montón y ocupar más memoria.

Debido a que es necesario garantizar la inmutabilidad de la clase String, es fácil entender que esta clase se define como final. Si no hay una modificación final, habrá subclases de String, que pueden anular los métodos de la clase String y cambiar por la fuerza el valor de la cadena, lo que viola la intención original del diseño de la clase String.

10.Diferencias y conexiones entre String, StringBuffer y StringBuilder

  • La clase String es una clase inmutable, es decir, una vez que se crea un objeto String, la secuencia de caracteres contenida en el objeto no se puede cambiar hasta que se destruya el objeto.
  • El objeto StringBuffer representa una cadena con una secuencia de caracteres variable. Después de crear un StringBuffer, la cadena se puede cambiar mediante append(), insert(), reverse(), setCharAt(), setLength() y otros métodos proporcionados por StringBuffer. La secuencia de caracteres del objeto. Una vez que se genera la cadena final deseada a través de StringBuffer, puede llamar a su método toString() para convertirla en un objeto String.
  • Tanto StringBuffer como StringBuilder representan objetos de cadena mutables, tienen una clase principal común, AbstractStringBuilder, y los métodos de construcción y métodos miembro de las dos clases son básicamente los mismos. La diferencia es que StringBuffer es seguro para subprocesos, mientras que StringBuilder no es seguro para subprocesos, por lo que StringBuilder tiene un rendimiento ligeramente mayor. En general, para crear una cadena con contenido variable, se recomienda darle prioridad a la clase StringBuilder. StringBuffer es adecuado para situaciones en las que los datos se manipulan con frecuencia y se debe considerar la seguridad de los subprocesos.

おすすめ

転載: blog.csdn.net/m0_63732435/article/details/132965036