[Preguntas de la entrevista de Java] OOP

Directorio de artículos

Original: https://www.yuque.com/unityalvin/baguwen/pg7qzg

1. ¿Qué está orientado a procesos?

Orientado a procesos es un modelo de programación de arriba hacia abajo, que divide el problema en pasos, y cada paso se implementa con una función, que se puede llamar a su vez.

2. Qué es la orientación a objetos

Orientado a objetos es un modelo de programación que abstrae mucho las transacciones. También descompone los problemas en pasos. Abstrae cada paso en consecuencia para formar objetos, y los resuelve mediante combinaciones de llamadas entre diferentes objetos. pregunta

3. La diferencia entre orientación a objetos y orientación a procesos

Orientado a procesos: baja ocupación de recursos, velocidad de ejecución relativamente rápida
Orientado a objetos: alta ocupación de recursos, velocidad de ejecución relativamente lenta, pero orientado a objetos puede hacer que el proyecto sea más modular, lograr un menor acoplamiento y una mayor cohesión

4. Tres características básicas de la orientación a objetos

encapsulación, herencia, polimorfismo

5. ¿Cómo entiendes el packaging?

Es encapsular cosas objetivas en clases abstractas, de modo que solo se pueda acceder a las clases u objetos confiables y se puedan ocultar los que no son confiables.

6. Hablemos de la herencia

La herencia significa que una clase puede heredar todas las funciones de otra clase y extenderla sin reescribir la clase original. Este tipo de derivación refleja la transitividad. Además de la herencia, hay otra forma de reflejar la transitividad llamada lograr.

La diferencia entre los dos:
● Herencia: use todas las propiedades y métodos de la clase principal sin codificación adicional
● Implementación: solo se pueden usar los nombres de variables globales y métodos definidos por la interfaz, y la clase de implementación debe proporcionar la implementación de el método

7. ¿Qué es el polimorfismo?

El llamado polimorfismo significa que el mismo método de una instancia de clase tiene diferentes manifestaciones en diferentes situaciones, por lo que objetos con diferentes estructuras internas pueden compartir la misma interfaz externa.

8. Cómo implementar el polimorfismo

● Hay herencia de clase o implementación de interfaz
● La subclase debe anular el método de la clase principal
● La referencia de la clase principal apunta al objeto de la subclase

Compile para ver la izquierda, ejecute para ver la derecha

9. ¿Qué es la arquitectura B/S? ¿Qué es la Arquitectura C/S?

  1. B/S (navegador/servidor), programa navegador/servidor
  2. C/S (Cliente/Servidor), cliente/servidor, aplicación de escritorio

10. ¿Cuál es la diferencia entre JDK, JRE y JVM?

inserte la descripción de la imagen aquí

JDK: "Kit de desarrollo de Java"
● Juego de herramientas de desarrollo de Java, que proporciona un entorno de desarrollo y un entorno operativo de Java, incluido el compilador Javac para compilar archivos fuente de Java, así como herramientas de depuración y análisis.

JRE: "Entorno de tiempo de ejecución de Java"
● Entorno de tiempo de ejecución de Java, incluida la máquina virtual de Java y algunas bibliotecas de clases básicas

JVM: "Máquina virtual de Java"
● Máquina virtual de Java, que brinda la capacidad de ejecutar archivos de código de bytes

11. ¿Cuáles son los tipos de datos básicos y las clases contenedoras de Java?

Numérico
● Entero: byte, corto, int, largo
● Coma flotante: flotante, doble
Carácter
● char
Booleano
● booleano

Clases de empaquetado
● Byte, Short, Integer, Long, Float, Double, Character, Boolean

12. ¿Cuáles son las estructuras de datos comunes en Java?

  1. Matriz "Matriz"
  2. Pila "Pila"
  3. Lista enlazada "Lista enlazada"
  4. Figura "Gráfico"
  5. Tabla hash "Hash"
  6. Cola "Cola"
  7. Árbol "Árbol"
  8. Montón "Montón"

13. La diferencia entre == y es igual

==
● Al comparar tipos de datos básicos, se compara el valor
● Al comparar tipos de referencia, lo que se compara es la dirección de la referencia en la memoria

equals
● Es un método de java.lang.Object, este método devuelve el juicio de ==, pero algunas clases reescriben este método, por lo que comparan si el contenido es igual, por ejemplo: String

Método equeals del objeto:
inserte la descripción de la imagen aquí
Método equeals de la cadena:
inserte la descripción de la imagen aquí

14. ¿Cuál es la relación entre clases y objetos?

Una clase es una abstracción de un objeto y un objeto es una instancia concreta de una clase Una clase
es una plantilla para un objeto y un objeto es una instancia de una clase

15. La palabra clave instanceof

Se utiliza para probar si un objeto es una instancia de una clase, esta instancia puede ser un objeto o una interfaz

El compilador verificará si el objeto se puede convertir en una instancia de la clase en tiempo real
● Si se puede determinar el tipo de instancia, si no se puede convertir, la compilación no pasará directamente
● Si no se puede determinar el tipo de instancia, se depende del tiempo de ejecución

Nota: si juzga si el tipo de datos básico pertenece a la clase de empaquetado correspondiente, como: 1 instancia de Integer, el resultado debe ser que la compilación falla

16. Qué es conversión implícita y conversión explícita

● La conversión implícita es una conversión de tipo automática, que consiste en asignar un tipo de datos pequeño a un tipo de datos grande y colocarlo en un cuadro ● La conversión explícita es
una conversión de tipo forzada, que consiste en asignar un tipo de datos grande a un cuadro de tipo pequeño ;

17. ¿Se puede convertir el tipo char en tipo int? ¿Se puede convertir en tipo String, se puede convertir en tipo doble?

● char también es un tipo especial en java. Su valor int comienza en 0 y hay 16 veces (65536) cuadrados de datos en total; ● char<
int<long<float<double
● char se puede convertir implícitamente a Int y tipos dobles, pero no se pueden convertir implícitamente a Cadena
● Al convertir el tipo char a byte o tipo corto, se debe convertir a la fuerza.

18. ¿Qué es el boxeo y el desempaquetado?

  1. Boxing consiste en convertir el tipo de datos básico en un tipo de paquete (int–>Integer)
    a. Llamada: método Integer.valueOf(int)
    b. Antes de jdk 1.5, Integer integer = new Integer(5);
    c. Después de jdk 1.5, Se realiza el encajonamiento automático, así, Integer integer = 5;
  2. Unboxing consiste en convertir el tipo de empaquetado al tipo de datos básico (Integer–> int)
    a.Llamada: método Integer.intValue()
    b.Después de jdk 1.5, se realiza unboxing automático, int i = integer;

19. ¿Qué lugares desempacarán automáticamente la caja?

  1. Poner tipos de datos primitivos en clases de colección

  2. El tipo de contenedor compara el tamaño con el tipo base

  3. Operaciones en tipos envueltos

  4. Uso del operador ternario
    inserte la descripción de la imagen aquí

  5. Parámetros de funciones y valores devueltos

20. ¿Cuáles son las funciones y usos de final en java?

  1. Las clases modificadas por final no se pueden heredar
  2. El método modificado por final no se puede reescribir y la JVM intentará alinearlo para mejorar la eficiencia operativa.
  3. Las variables modificadas por final no se pueden cambiar, y la JVM las almacenará en el grupo de constantes durante la fase de compilación.Si se modifica la referencia, significa que la referencia es inmutable, pero el contenido al que apunta la referencia es variable

21. ¿Qué se incluye en una clase java?

Propiedades, métodos, clases internas, constructores, bloques de código

22. ¿Por qué no se puede expresar la cantidad en punto flotante?

Dado que los decimales almacenados en la computadora son en realidad valores aproximados de decimales, no valores exactos, es mejor usar BigDecimal o Long (la unidad es un centavo) para representar la cantidad.

23. Que son los modificadores de acceso en Java y sus diferencias

inserte la descripción de la imagen aquí

● público: indica que la variable miembro o el método es visible para todas las clases y objetos, y se puede acceder directamente a todas las clases u objetos
● privado: indica que la variable miembro o el método es privado, y solo la propia clase tiene acceso a él. Además, otras clases u objetos no tienen derechos de acceso, incluidas las subclases.Protegido
: indica que la variable miembro o el método es visible para la clase misma, otras clases en un paquete y subclases, y las clases de otros paquetes no pueden acceder a ella
. predeterminado: cuando un miembro de una clase no escribe un modificador de acceso, se establece de forma predeterminada en predeterminado, lo que indica que la variable miembro o el método solo es visible para la clase misma y otras clases en un paquete, y las subclases y clases en otros paquetes no son visibles. accesible

24. ¿Flotador f=3.4 es correcto?

inserte la descripción de la imagen aquí

Incorrecto, 3.4 es un número de precisión doble.Asignar un tipo de precisión doble (doble) a un tipo de punto flotante (float) es un downcast que causará pérdida de precisión, por lo que es necesario lanzar float f = (float) 3.4 ; o escríbalo como float f = 3.4F;.

25. ¿Qué es precisión simple y precisión doble?

● Los números de punto flotante de precisión simple ocupan 4 bytes (32 bits) en la memoria de la computadora. Usando el método de "punto flotante (punto decimal flotante)", se puede representar una amplia gama de valores.
● El número de punto flotante de doble precisión (doble) utiliza 8 bytes (64 bits) para almacenar un número de punto flotante.

26. La diferencia entre String, StringBuffer y StringBuilder

Cadena
● Cadena es una cadena de solo lectura, no es un tipo de datos básico, sino un objeto. Desde la perspectiva del código fuente subyacente, es una matriz de caracteres final. La cadena a la que se hace referencia no se puede cambiar. Una vez definida, no se puede agregar, eliminar ni modificar.
● Cada operación en String generará un nuevo objeto String
● Cada operación + creará implícitamente un nuevo objeto StringBuilder en el montón que es igual a la cadena original y luego llamará al método append para concatenar los caracteres después de +.

StringBuffer, StringBuilder
● Tanto StringBuffer como StringBuilder heredan la clase AbstractStringBulder, y AbstractStringBuilder implementa la interfaz CharSequence.Ambas clases se utilizan para operaciones con cadenas.
● Es más eficiente que String al concatenar, modificar, eliminar y reemplazar cadenas.
● StringBuffer es seguro para subprocesos, Stringbuilder no es seguro para subprocesos.
● Stringbuilder es más eficiente que Stringbuffer porque la mayoría de los métodos de StringBuffer han agregado la palabra clave sincronizada.

27. La diferencia entre i++ y ++i

● i++: primero asigna, luego calcula
● ​​++i: primero calcula, luego asigna

28. Hay varios métodos de creación de instancias para arreglos

● Creación de instancias estáticas: especifique los elementos de la matriz mientras crea la matriz
● Creación de instancias dinámicas: al crear instancias de la matriz, solo especifique la longitud de la matriz, y todos los elementos de la matriz son los valores predeterminados del tipo de matriz

29. Después de instanciar la matriz, ¿se puede cambiar la longitud de la matriz?

No, una vez que se crea una instancia de una matriz, su longitud es fija

30. Suponiendo que hay 5 elementos en la matriz, ¿qué se debe hacer si se invierte la matriz?

Cree una nueva matriz, recorra cada elemento de atrás hacia adelante y coloque los elementos tomados en la nueva matriz en orden
O use una variable temporal e intercambie el primero y el último de dos en dos

31. Valores predeterminados de varios datos en Java

● El valor predeterminado de byte, short, int, long es 0
● El valor predeterminado de boolean es false
● El valor predeterminado de char es \u0000
● El valor predeterminado de float y double es 0.0
● El valor predeterminado de object type es nulo

32. ¿Cuáles son los paquetes de Java más utilizados?

● Java.lang
● Java.io
● Java.sql
● Java.util
● Java.awt
● Java.net
● Java.math
juc

33. ¿Cuáles son los métodos comúnmente utilizados de la clase Object?

● es igual a (Objeto obj)
● hashCode()
● toString()
● esperar()
● notificar()
● clonar()
● getClass()

34. ¿Hay punteros en Java?

Sí, pero está oculto. Los desarrolladores no pueden manipular directamente los punteros, y jvm manipula los punteros.

35. ¿Java se pasa por valor o por referencia?

En Java, el paso de parámetros en realidad se logra a través del "paso de valor", pero para el paso de objetos Java, el contenido pasado es una referencia al objeto.

Para que todos entiendan lo que dijo, dijo que solo hay transferencia de valor en Java, pero el contenido pasado es una referencia a un objeto. Esto también está bien. Sin embargo, nunca se debe considerar el paso por referencia en Java.

36. ¿Por qué pasa el valor?

En el lenguaje de programación, los parámetros deben pasarse entre métodos.La estrategia de esta transferencia se denomina estrategia de evaluación.

En programación existen muchas estrategias de evaluación, las más comunes son "pasar por valor" y "pasar por referencia". Otro caso especial de transferencia de valor es la "transferencia de objeto compartido".

La mayor diferencia entre "pasar por valor" y "pasar por referencia" es si se copia una copia durante el proceso de transferencia. Si se pasa una copia, se pasa por valor, de lo contrario, se pasa por referencia.

37. Participación formal y parámetros reales

Parámetro formal: es el parámetro utilizado al definir el nombre de la función y el cuerpo de la función, y su propósito es recibir los parámetros que se pasan al llamar a la función.
Parámetros reales: cuando se llama a una función con parámetros, existe una relación de transferencia de datos entre la función que llama y la función llamada. Al llamar a una función en la función de llamada, los parámetros entre paréntesis después del nombre de la función se denominan "parámetros reales"

37. ¿Se puede llamar explícitamente al constructor?

El método de construcción no se puede llamar como un método normal, solo lo llamará el sistema al crear un objeto

38. ¿Qué es la sobrecarga?

La sobrecarga se refiere a la situación en la que las funciones o métodos tienen el mismo nombre pero diferentes listas de parámetros. Tales funciones o métodos con el mismo nombre pero diferentes parámetros se denominan funciones o métodos sobrecargados.

39. ¿Qué es reescribir?

La anulación se refiere a la situación en la que hay dos métodos con el mismo nombre y lista de parámetros en la subclase y la clase principal de Java. Dado que tienen la misma firma de método, el nuevo método en la subclase anulará el método original en la clase principal, lo que se denomina reescritura.

40. Condiciones para la reescritura

● La lista de parámetros y el tipo de retorno deben ser los mismos que los del método anulado
● Restricciones de nivel de acceso: no pueden ser más fuertes que las del método anulado, pero pueden ser más débiles que las del método anulado;
inserte la descripción de la imagen aquí

● Los métodos anulados no pueden generar nuevas excepciones comprobadas, ni pueden generar excepciones comprobadas que sean más extensas que el método anulado, pero pueden generar menos excepciones o más limitadas
● No pueden anular los métodos marcados como finales
● Si no puede heredar un método (como modificación privada), no puede anular este método.

41. Condiciones de sobrecarga

● El método sobrecargado debe cambiar la lista de parámetros;
● El método sobrecargado puede cambiar el tipo de devolución, el modificador de acceso y puede declarar excepciones verificadas nuevas o más amplias; ●
El método puede estar en la misma clase o en una subclase sobrecargada.

42. La diferencia entre sobrecargar y reescribir

  1. La sobrecarga es un concepto de tiempo de compilación y la reescritura es un concepto de tiempo de ejecución.
  2. La sobrecarga sigue el llamado "enlace en tiempo de compilación", es decir, qué método debe llamarse según el tipo de la variable del parámetro en el momento de la compilación.
  3. La reescritura sigue el llamado "enlace en tiempo de ejecución", es decir, en tiempo de ejecución, el método se llama de acuerdo con el tipo del objeto real al que apunta la variable de referencia.
  4. Debido a que el método a llamar se determina en el momento de la compilación, la sobrecarga no es polimórfica. Mientras que anular es polimorfismo. La sobrecarga es solo una característica del lenguaje, una regla gramatical y no tiene nada que ver con el polimorfismo o la orientación a objetos. (Nota: estrictamente hablando, la sobrecarga es polimorfismo en tiempo de compilación, es decir, polimorfismo estático. Sin embargo, el polimorfismo mencionado en Java se refiere al polimorfismo dinámico a menos que se especifique lo contrario)

43. ¿Se puede reescribir el método de construcción? ¿Se puede sobrecargar?

no se puede anular, pero se puede sobrecargar

44. ¿Cuál es la diferencia entre una clase interna estática y una clase interna (miembro)?

  • Clases internas estáticas
    ● Las clases internas estáticas existen independientemente de las clases externas.
    ● Las clases internas estáticas pueden acceder a todas las variables y métodos estáticos de las clases externas, incluso las privadas.
    ● Las clases internas estáticas no pueden acceder directamente a las variables de instancia de las clases externas. desea acceder, debe crear un objeto nuevo de una clase externa y usar el nuevo objeto para acceder.
    ● La clase interna estática es consistente con la clase general y puede definir variables estáticas, métodos, métodos de construcción, etc.
    ● Para que otras clases accedan a las propiedades de la clase interna estática o llamen a los métodos de la clase interna estática, necesitan usar el método de "clase externa. clase interna estática". ● Hay una entrada de clase interna estática dentro de
    Java clase de colección HashMap. Entry es la abstracción de los elementos de almacenamiento de HashMap. HashMap mantiene internamente una matriz Entry para almacenar elementos, pero Entry es transparente para los usuarios. Las clases internas estáticas se pueden usar para aquellas que están estrechamente relacionadas con las clases externas y no dependen de instancias de clases externas.

  • Clase interna ordinaria
    ● Una clase interna ordinaria existe como miembro de una clase externa En una clase interna ordinaria, puede acceder directamente a las propiedades de la clase externa y llamar a los métodos de la clase externa.
    ● Si la clase externa quiere acceder a las propiedades de la clase interna o llamar al método de la clase interna, debe crear un objeto de la clase interna y usar este objeto para acceder a las propiedades o llamar al método.
    ● Si otras clases quieren acceder a las propiedades de las clases internas ordinarias o llamar a los métodos de las clases internas ordinarias, deben crear un objeto de las clases internas ordinarias en la clase externa como un atributo, y luego pueden usar este atributo para llamar a los métodos de Clases internas ordinarias o acceso Atributos de clases internas ordinarias
    inserte la descripción de la imagen aquí
    ● Los métodos estáticos y las variables no se pueden definir (excepto aquellos modificados por final)

45. ¿Qué hace la palabra clave estática?

static puede modificar clases internas, métodos, variables y bloques de código
● La clase modificada por static es una "clase interna estática" El
método modificado por static es un "método estático", lo que significa que el método pertenece a la clase actual, no un objeto Los métodos estáticos 不能被重写, se pueden llamar directamente usando el nombre de la clase. Las palabras clave this o super no se pueden usar en métodos estáticos.
● Las variables modificadas por estáticas son "variables estáticas" o "variables de clase". Las variables estáticas son compartidas por todas las instancias y no dependen de los objetos. Solo hay una copia de las variables estáticas en la memoria, y la memoria solo se asigna una vez para las variables estáticas cuando la JVM carga una clase.
● Los bloques de código estáticos modificados se denominan "bloques de código estáticos", que normalmente se utilizan para la optimización de programas. El código en el bloque de código estático solo se ejecutará una vez cuando se cargue toda la clase. Puede haber varios bloques de código estático y, si hay varios bloques, se ejecutarán secuencialmente.
● static también puede importar paquetes estáticamente, lo cual es una característica nueva después de jdk 1.5, por ejemplo: import static java.lang.Math.*; si desea usar el método sin() en la clase Math, no necesita usar Math en este momento. Puede llamar a sin() directamente;

46. ​​¿Cuáles son los métodos comunes de la clase Math?

● pow(): operación de energía (finalmente llamar al método nativo)
inserte la descripción de la imagen aquí

● sqrt(): raíz cuadrada
inserte la descripción de la imagen aquí

● redondear(): redondear hacia arriba
inserte la descripción de la imagen aquí

● abs(): encontrar el valor absoluto
inserte la descripción de la imagen aquí

● random(): genera un número aleatorio de 0 a 1, incluyendo 0 y excluyendo 1
inserte la descripción de la imagen aquí

min()
inserte la descripción de la imagen aquí

máx()
inserte la descripción de la imagen aquí

47. ¿Cuáles son los métodos comunes de la clase String?

● charAt(): Devuelve el carácter en el índice especificado
● indexOf(): Devuelve el índice del carácter especificado
● replace(): Reemplaza la cadena
● trim(): Elimina los espacios en blanco en ambos extremos de la cadena
● split(): Divide la cadena y devuelve una matriz de cadena dividida
● getBytes(): Devuelve la matriz de tipo de byte de la cadena
● length(): Devuelve la longitud de la cadena
● toLowerCase(): Convierte la cadena en letras minúsculas
● toUpperCase(): Convierte la cadena a caracteres en mayúsculas
● substring(): cadena de intercepción
● format(): cadena de formato
● equals(): comparación de cadenas
toCharArray(): convertir a matriz de caracteres
intern(): regresar directamente si el conjunto de constantes de caracteres tiene la cadena, de lo contrario poner en la piscina constante y devolver

48. ¿Java es herencia simple o herencia múltiple?

Solo se puede heredar una clase, pero se pueden implementar múltiples interfaces

49. ¿Qué significa super y esto?

● super significa el objeto de la clase principal de la clase actual
● esto significa el objeto de la clase actual

50. ¿Cuál es la diferencia entre clases ordinarias y clases abstractas?

● Las clases ordinarias no pueden contener métodos abstractos, pero las clases abstractas pueden contener métodos abstractos
● Las clases abstractas no se pueden instanciar directamente, pero las clases ordinarias se pueden instanciar directamente

51. ¿Qué es una interfaz? ¿Por qué necesitas una interfaz?

Una interfaz es una declaración de algunas funciones proporcionadas por algo externamente. Es una clase especial de Java. La interfaz compensa las deficiencias de la herencia única de Java.

52. ¿Cuáles son las características de la interfaz?

● Las variables en las interfaces solo pueden ser constantes modificadas finales estáticas públicas
● Todos los métodos en las interfaces son métodos abstractos
● Las interfaces no tienen métodos de construcción
● Las interfaces no se pueden instanciar directamente
● Una clase puede implementar múltiples interfaces

53. ¿Cuál es la diferencia entre una clase abstracta y una interfaz?

clase abstracta

  1. Método abstracto, solo el concepto de comportamiento, no hay un comportamiento específico para lograr.
  2. Decorado con la palabra clave abstract, no hay cuerpo de método. Las subclases deben anular estos métodos abstractos.
  3. Las clases abstractas solo se pueden heredar y una clase solo puede heredar una clase abstracta.
  4. Los miembros de clases abstractas admiten todos los modificadores de permisos
  5. Las clases abstractas pueden definir constructores, métodos abstractos, métodos no abstractos

interfaz

  1. Todos los métodos son métodos abstractos y las propiedades son constantes.
  2. no se puede instanciar
  3. Las variables de interfaz pueden referirse a instancias de clases de implementación concretas
  4. Las interfaces solo se pueden implementar, y una clase concreta que implemente una interfaz debe implementar todos los métodos abstractos
  5. Se pueden implementar múltiples interfaces
  6. Una clase concreta puede implementar múltiples interfaces para lograr herencia múltiple
  7. Los miembros definidos en una interfaz solo se pueden definir como públicos
  8. Después de jdk 1.8, se pueden implementar métodos en la interfaz, y se debe agregar predeterminado o estático a la declaración del método.

54. ¿Por qué hay un hashCode?

Hay dos tipos de colecciones en Java, List y Set. List es ordenada y repetible, y Set no está ordenada y no puede repetirse. Cuando queremos insertar datos en Set, ¿cómo juzga si los datos que se insertarán se repiten? Puede usar el método equals(), pero si hay demasiados elementos, la eficiencia de ejecución será más lenta.

Así que alguien inventó el algoritmo hash para mejorar la eficiencia de encontrar elementos en la colección. Este método dividirá la colección en varias áreas de almacenamiento, y cada objeto puede calcular un código hash, que se puede agrupar, y cada grupo corresponde a un área de almacenamiento, y se puede determinar el código hash de un objeto. debe ser almacenado.

El método hashCode() se puede entender de esta manera: lo que devuelve es un valor convertido según la dirección de memoria del objeto.

De esta manera, cuando se va a agregar un nuevo elemento a la colección, primero se llama al método hashCode() de este elemento, y se puede ubicar de inmediato la ubicación física donde debe almacenarse. Si no hay ningún elemento en esta posición, se puede almacenar directamente en esta posición sin ninguna comparación;

Si ya hay un elemento en esta posición, llame a su método equals() para compararlo con el nuevo elemento, si es el mismo, no se guardará, si no, se codificará en otra dirección. De esta manera, la cantidad de llamadas reales al método equals() se reduce considerablemente, casi solo una o dos veces.

, ¿Es posible que dos objetos desiguales tengan el mismo código hash?Es
posible que cuando ocurra un conflicto hash, dos objetos desiguales tengan el mismo valor de código hash

En general, hay varias formas de tratarlo:

  1. Método de cremallera (método de dirección de cadena)
    ● Cada unidad de la tabla hash se utiliza como nodo principal de la lista enlazada, y todos los elementos cuya dirección hash es i forman una lista enlazada de sinónimos. Es decir, cuando ocurre un conflicto, la palabra clave se vincula al final de la lista vinculada con la unidad como nodo principal.
  2. Método de direccionamiento abierto
    ● Una vez que ocurre un conflicto, busque la siguiente dirección hash vacía. Siempre que la tabla hash sea lo suficientemente grande, siempre puede encontrar una dirección hash vacía y almacenar el registro en
  3. Método de re-hash
    ● Cuando la dirección hash entra en conflicto, use otras funciones para calcular otra dirección de función hash hasta que no ocurran más conflictos.

55. Las cuatro referencias de Java, fuerte y débil

Referencia fuerte
● Es la referencia más utilizada en tiempos normales. Las referencias fuertes no se reciclarán cuando la memoria del programa sea insuficiente "OOM"

Referencias blandas
● Las referencias blandas se reciclarán cuando la memoria del programa sea insuficiente
● Escenarios disponibles: cuando se crea la memoria caché, los objetos creados se colocan en la memoria caché Cuando la memoria es insuficiente, la JVM reciclará los objetos creados anteriormente .

Referencia débil
● Referencia débil significa que siempre que el recolector de elementos no utilizados de JVM lo encuentre, se reciclará. ●
Escenarios disponibles: la clave en java.util.WeakHashMap en el código fuente de Java usa referencias débiles.
● Según tengo entendido: una vez que lo haga No necesito una referencia, JVM lo manejará automáticamente por mí, por lo que no necesito hacer otras operaciones.

Referencias fantasma
● El mecanismo de reciclaje de las referencias fantasma es similar al de las referencias débiles, pero antes de que se reciclen, se colocarán en ReferenceQueue. Otras referencias se pasan a ReferenceQueue después de que la JVM las recicle. Debido a este mecanismo, las referencias fantasma se utilizan principalmente para el procesamiento antes de que se destruya la referencia.
● Cuando se crean referencias virtuales, deben tener un ReferenceQueue
● Escenarios disponibles: algunas operaciones antes de la destrucción de objetos, como la liberación de recursos (aunque Object.finalize() también puede realizar este tipo de acción, pero este método no es seguro e ineficiente)

Los tipos de referencias mencionados anteriormente se refieren a las referencias del objeto en sí, no a las referencias de las cuatro subclases de Referencia

56. ¿Cuántas formas hay de crear objetos en Java? (4)

  1. new crea un nuevo objeto
  2. a través del mecanismo de reflexión
  3. Usando el mecanismo de clonación
  4. a través del mecanismo de serialización

57. ¿Cuál es la diferencia entre copia superficial y copia profunda?

Copia superficial
Pasar por valor para tipos de datos básicos, copiar por referencia para tipos de datos de referencia

Transferencias de copia profunda
por valor para tipos de datos básicos, crea un nuevo objeto para tipos de datos de referencia y copia su contenido

58. ¿Hay alguna diferencia entre a = a + b y a += b?

El operador += realiza una conversión de tipo automática implícita, donde a += b convierte implícitamente el tipo de resultado de la operación de suma al tipo que contiene el resultado, mientras que a = a + b no realiza automáticamente la conversión de tipo

59. Corto s1 = 1, s1 = s1 + 1, ¿pasa algo?

Hay un error, el tipo corto será automáticamente promovido al tipo int al realizar operaciones, es decir, el resultado de la operación de s1 + 1 es tipo int, y s1 es corto, y el compilador reportará un error en este tiempo

Solución: Cambiar s1 = s1 + 1 a s1 += 1;

Por ejemplo, en Idea:
inserte la descripción de la imagen aquí

60. ¿Cuál es la diferencia entre final, finalmente y finalizar?

diferente en la naturaleza

  1. final es una palabra clave;
  2. finalmente es un indicador de bloque, utilizado en la declaración de prueba;
  3. finalizar() es un método;

efecto

  1. final es una palabra clave utilizada para identificar constantes, y las palabras clave identificadas por final se almacenan en el grupo de constantes
  2. finalmente{} se usa para identificar un bloque de código y coopera con try{}. Independientemente de si el código en try se ejecuta o no (aquí, hay una excepción), el código en finalmente{} definitivamente se ejecutará
  3. El método finalize() se define en Object y la JVM lo llama cuando el objeto "desaparece" para la recolección de basura del objeto, similar al "destructor" en C++; cuando lo define el usuario, se usa para liberar Los recursos ocupados por el objeto (como realizar operaciones de E/S);

61. Pasos de la operación JDBC (5)

  1. Cargue la clase de controlador de base de datos
  2. conexión de base de datos abierta
  3. Ejecutar sentencia SQL
  4. Manejar el resultado devuelto
  5. cerrar recurso

62. Cómo prevenir la inyección SQL cuando se usa JDBC.

Use la clase PreparedStatement en lugar de la clase Statement

63. Cómo llamar a un procedimiento almacenado en JDBC

Usar declaración de llamada

64. ¿Conoce los pools de conexiones?¿Cuáles son los beneficios de usar pools de conexiones?

La conexión a la base de datos consume muchos recursos y afecta los indicadores de rendimiento del programa.

El grupo de conexiones se usa para asignar, administrar y liberar conexiones de base de datos, de modo que la aplicación pueda reutilizar la misma conexión de base de datos en lugar de crear una nueva conexión de base de datos cada vez. Al liberar la conexión de la base de datos con un tiempo de inactividad prolongado, se evita el problema de la omisión de la conexión causada por la creación de demasiadas conexiones en la base de datos y se mejora el rendimiento del programa.

65. ¿Qué tecnologías de fuentes de datos conoce? ¿Cuáles son los beneficios de usar fuentes de datos?

Druid, Dbcp, c3p0, etc. se utilizan principalmente porque Druid es más estable y seguro; la información de la base de datos se mantiene en forma de archivos de configuración en lugar de codificarla. Cuando cambia la información de la base de datos conectada, la información de la base de datos se puede actualizar sin cambiar el código del programa.

66. La diferencia entre & y &&

● & es un operador bit a bit.
● && es un operador lógico booleano, utilizado en el juicio lógico

● Si el frente de & es falso, el siguiente contenido aún debe procesarse
● Si el frente de && es falso, el contenido posterior no se procesará.

67. ¿Tiene una matriz un método length()?¿String tiene un método length()?

● Los arreglos no tienen un método de longitud(), pero tienen un atributo de longitud.
● String tiene un método length()

68. Usa el método más eficiente para calcular cuántas veces 2 por 8 es igual a

2 << 3

69. ¿Cuáles son los métodos de clasificación? Por favor enumere

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

70. ¿Se puede almacenar un carácter chino en una variable char, por qué?

El tipo char puede almacenar un carácter chino, porque la codificación que se usa en Java es Unicode (no elija ninguna codificación específica, use directamente la cantidad de caracteres del conjunto de caracteres, que es la única forma de unificar), un tipo char ocupa 2 bytes (16 bits), por lo que no hay problema en poner un chino.

71. ¿Habrá pérdidas de memoria en Java? Describa brevemente

En el desarrollo real, es posible que haya algunos objetos que ya no se usan, pero que todavía se hace referencia a ellos en algunos lugares. Estos objetos no serán reclamados por GC, por lo que se producirán pérdidas de memoria.

72. ¿Puede un método abstracto ser estático al mismo tiempo, puede ser nativo al mismo tiempo y puede ser modificado por sincronizado al mismo tiempo? (ambos no lo son)

ambos no lo son. Los métodos abstractos necesitan ser reescritos por subclases, mientras que los métodos estáticos no pueden ser reescritos, por lo que los dos son contradictorios. Los métodos nativos son métodos implementados por código nativo (como el código C), mientras que los métodos abstractos no se implementan, lo que también es una contradicción. Sincronizado está relacionado con los detalles de implementación del método, y el método abstracto no involucra los detalles de implementación, por lo que también es contradictorio.

73. ¿Es posible llamar a un método no estático desde dentro de un método estático?

No, los métodos estáticos solo pueden acceder a miembros estáticos, porque las llamadas a métodos no estáticos primero deben crear objetos, y es posible que los objetos no se inicialicen al llamar a métodos estáticos.

74. ¿Cómo implementar la clonación de objetos?

Solía ​​usar BeanUtils.copyProperties();, pero luego aprendí que usa la reflexión para obtener objetos y asignar valores, lo cual es menos eficiente, y luego lo reemplacé con Mapstruct, que compilará el proyecto de acuerdo con la interfaz definida. , crea automáticamente una clase de implementación de interfaz, que generará los métodos de implementación correspondientes de acuerdo con los parámetros formales y los valores de retorno de los métodos en la interfaz

75. ¿Puede una interfaz heredar una interfaz? ¿Puede una clase abstracta implementar una interfaz? ¿Puede una clase abstracta heredar de una clase concreta? (Todo saldrá bien)

Las interfaces pueden heredar interfaces y se admite la herencia múltiple.
Las clases abstractas pueden implementar interfaces, las clases abstractas pueden heredar clases concretas y las clases abstractas también pueden heredar

76. ¿Las clases internas anónimas pueden heredar otras clases? ¿Es posible implementar la interfaz? (Todo saldrá bien)

Puede heredar de otras clases o implementar otras interfaces

77. Mecanismo de caché de enteros

¿Cuál es el resultado de ejecutar el siguiente código?

		Integer i1 = new Integer(1);
        Integer i2 = new Integer(1);
        int i3 = 1;

        System.out.println("=====");
        System.out.println(i1 == i2);
        System.out.println(i1 == i3);

        Integer i4 = 2;
        Integer i5 = 2;
        int i6 = 2;
        System.out.println("=====");
        System.out.println(i4 == i5);
        System.out.println(i4 == i6);

        Integer i7 = 128;
        Integer i8 = 128;
        int i9 = 128;
        System.out.println("=====");
        System.out.println(i7 == i8);
        System.out.println(i7 == i9);

resultado:
inserte la descripción de la imagen aquí

Resumen:
1. Use ==la comparación entre objetos Integer, la comparación es la dirección
2, el tamaño de la clase contenedora y el tipo básico, la clase contenedora se convierte implícitamente al tipo básico
3, asigne el tipo básico a Integer, llame al valueOf método:
inserte la descripción de la imagen aquí
método valueOf, cuando Cuando el valor está en [-128 ~ 127], se tomará del caché, de lo contrario, el nuevo objeto

Supongo que te gusta

Origin blog.csdn.net/m0_55155505/article/details/126806117
Recomendado
Clasificación