Respuestas a preguntas comunes de entrevistas sobre Java

📚Conceptos básicos de Java

1. ¿Cuáles son las características de Java?

Comprender las características principales del lenguaje Java.

  • Orientado a objetos:Admite funciones como encapsulación, herencia y polimorfismo.
  • Independencia de plataforma:Escribe una vez, ejecuta en cualquier lugar (WORA)
  • Gestión automática de la memoria:El mecanismo de recolección de basura libera memoria automáticamente
  • Soporte de subprocesos múltiples:Mecanismo de subprocesos incorporado para facilitar la programación concurrente
  • Fuerte seguridad:Proporcionar mecanismos de seguridad como verificación de tipos y manejo de excepciones.
  • Características dinámicas:Comprobación de tipos de tiempo de ejecución y carga dinámica

2. ¿Cuáles son las diferencias entre JDK, JRE y JVM?

Comprender la estructura de tres niveles del entorno de ejecución de Java

  • JVM (máquina virtual Java):Máquina virtual, una computadora abstracta que ejecuta código de bytes para lograr funciones multiplataforma
  • JRE (entorno de ejecución de Java):Entorno de ejecución, incluidas JVM y bibliotecas de clases necesarias para la ejecución.
  • JDK (kit de desarrollo de Java):Kit de herramientas de desarrollo, que incluye JRE + compilador + herramientas de depuración y otras herramientas de desarrollo
  • Relación de inclusión:JDK > JRE > JVM

3. ¿Qué es el código de bytes? ¿Por qué Java es multiplataforma?

Comprender profundamente los principios del mecanismo multiplataforma de Java.

  • Definición de código de bytes:El código intermedio generado por la compilación del código fuente de Java, la extensión del archivo es .class
  • Principio multiplataforma:Código fuente de Java → código de bytes → ejecución de JVM en diferentes plataformas
  • Ventajas:Compile una vez, ejecútelo en cualquier lugar; los desarrolladores no necesitan reescribir código para diferentes plataformas
  • Proceso de ejecución:El compilador javac compila el archivo .java en un archivo .class, que luego es interpretado y ejecutado por la JVM de cada plataforma.

4. ¿Cuáles son los tipos de datos básicos en Java?

Domina el sistema de tipos de Java

  • Tipo entero:byte (1 byte), corto (2 bytes), int (4 bytes), largo (8 bytes)
  • Tipo de punto flotante:flotante (4 bytes), doble (8 bytes)
  • Tipo de personaje:char (2 bytes, admite Unicode)
  • tipo booleano:booleano (1 byte, verdadero/falso)
  • Valor predeterminado:entero 0, flotante 0.0, booleano falso, char '\u0000'
  • Categoría de embalaje:Entero, largo, flotante, doble, booleano y otros tipos de referencia correspondientes

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

Distinguir entre tres conceptos similares pero completamente diferentes

  • final (palabra clave):Las clases modificadas no se pueden heredar, los métodos modificados no se pueden anular y las variables modificadas no se pueden reasignar.
  • finalmente (palabra clave):El bloque de código en try-catch-finally se ejecutará independientemente de si hay una excepción y, a menudo, se utiliza para la liberación de recursos.
  • finalizar (método):Método de la clase Object, llamado antes de que el objeto sea recolectado como basura, usado para limpiar recursos (obsoleto)
  • Escenarios de aplicación:final se usa para control de inmutabilidad, finalmente se usa para seguridad de excepciones, finalizar ha sido reemplazado por probar con recursos

🎯 Programación orientada a objetos

6. ¿Qué es la orientación a objetos? ¿Cuáles son las cuatro características principales?

Comprender los conceptos básicos de la programación orientada a objetos

  • Definición orientada a objetos:La idea de programación basada en objetos, enfatizando las propiedades y comportamientos de los objetos.
  • Cuatro características principales:
  • Resumen:Extraer características comunes de las cosas e ignorar detalles no esenciales.
  • Paquete:Oculte detalles de implementación interna, exponga las interfaces necesarias y mejore la seguridad.
  • Herencia:Las subclases heredan las propiedades y métodos de la clase principal para lograr la reutilización del código.
  • Polimorfismo:Diferentes implementaciones de la misma interfaz, enlace dinámico en tiempo de ejecución

7. ¿Qué es el polimorfismo? ¿Cuáles son las formas de implementar el polimorfismo?

Comprensión profunda del mecanismo de polimorfismo de Java.

  • Definición polimórfica:Un objeto tiene múltiples formas y la misma llamada al método tiene diferentes actuaciones en diferentes objetos.
  • Método de implementación:
  • Polimorfismo en tiempo de compilación (sobrecarga):Durante la compilación se deben llamar métodos con el mismo nombre pero con diferentes parámetros.
  • Polimorfismo en tiempo de ejecución (anulado):La referencia de la clase principal apunta al objeto de la clase secundaria y el tiempo de ejecución determina el método real llamado.
  • Condiciones polimórficas en tiempo de ejecución:Heredar, reescribir, transformación ascendente
  • Ventajas:Mejore la flexibilidad y la capacidad de mantenimiento del código y admita la programación de la interfaz.

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

Compara las similitudes y diferencias entre los dos mecanismos abstractos.

  • Clase abstracta:Usando modificación abstracta, puede haber métodos abstractos y métodos concretos.
  • Interfaz:Utilice la definición de interfaz, el método predeterminado es abstracto público (Java 8+ admite la implementación predeterminada)
  • Relación de herencia:Una clase solo puede heredar una única clase abstracta, pero puede implementar múltiples interfaces
  • Modificadores de acceso:Las clases abstractas pueden ser privadas/protegidas y los miembros de la interfaz pueden ser públicos de forma predeterminada.
  • Variables:Las clases abstractas tienen variables de instancia, las interfaces solo tienen constantes estáticas
  • Escenarios de uso:Las clases abstractas se utilizan para compartir código y especificaciones de definición de interfaz.

9. ¿Qué son la sobrecarga y la anulación?

Distinguir entre dos conceptos similares pero diferentes

  • Sobrecarga:
  • En la misma clase, los nombres de los métodos son los mismos, pero los tipos/números/orden de los parámetros son diferentes.
  • Se determina en tiempo de compilación y pertenece al enlace estático.
  • Los tipos de valor de retorno pueden ser diferentes (pero no se distinguen únicamente por el valor de retorno)
  • Anular:
  • La subclase vuelve a implementar el método de la clase principal y la firma del método es exactamente la misma.
  • Se determina en tiempo de ejecución y pertenece al enlace dinámico.
  • Los tipos de valor de retorno y las excepciones deben ser compatibles

10. ¿Cuáles son los modificadores de acceso? ¿Cuál es el ámbito de actuación?

Dominar el mecanismo de control de acceso de Java

  • público:Público, accesible a todas las clases.
  • protegido:Protegido, accesible en el mismo paquete y subclases.
  • predeterminado (sin modificador):De forma predeterminada, se puede acceder al mismo paquete
  • privado:Privado, sólo accesible dentro de la clase.
  • Comparación del alcance del acceso:público > protegido > predeterminado > privado
  • Mejores prácticas:Minimizar los derechos de acceso y seguir el principio de encapsulación.

💾 Gestión de memoria y recolección de basura.

11. ¿Qué incluye la estructura de la memoria de Java?

Comprender la asignación de memoria JVM

  • Montón:Almacena instancias de objetos, compartidas por todos los subprocesos, área principal para la recolección de basura, tamaño configurable
  • Pila:Almacene variables locales y llamadas a métodos, únicas para cada hilo, y libere memoria automáticamente
  • Área del método:Todos los subprocesos comparten la información estructural de la clase de almacenamiento, el grupo constante de tiempo de ejecución, las variables estáticas, etc.
  • Contador de programa:Registre la dirección de instrucción de código de bytes ejecutada por el hilo actual
  • Pila de métodos locales:Ejecutar método nativo (código C/C++)

12. ¿Qué es la recolección de basura? ¿Cuáles son los algoritmos de recolección de basura?

Comprensión profunda del mecanismo de GC.

  • Definición de recolección de basura:Recuperar automáticamente la memoria ocupada por objetos que ya no se utilizan
  • Algoritmo principal:
  • Marcar claro:Marque objetos vivos, elimine basura y genere fragmentos
  • Algoritmo de copia:Divide la memoria en dos partes y copia los objetos supervivientes durante la limpieza. No hay fragmentación sino desperdicio de memoria.
  • Clasificación de etiquetas:Compresión y desfragmentación después del marcado, sin fragmentación pero con bajo rendimiento
  • Algoritmo generacional:Los objetos se dividen en nueva generación y vieja generación, y diferentes generaciones utilizan diferentes estrategias.
  • Ventajas:Gestión automática de la memoria para evitar pérdidas de memoria.

13. ¿Cuál es la diferencia entre montón y pila?

Compara dos áreas importantes de la memoria

  • Contenido de almacenamiento:Objetos de montón, tipos básicos de pila y referencias
  • Hilo:El montón es compartido por todos los subprocesos y cada subproceso tiene una pila independiente.
  • Gestión:El recolector de basura administra el montón y la pila se libera automáticamente.
  • Tamaño:El montón es generalmente más grande y la pila es relativamente más pequeña.
  • Rendimiento:La asignación de pila es rápida y la asignación de montón es relativamente lenta
  • Excepción:Desbordamiento de montón OutOfMemoryError, desbordamiento de pila StackOverflowError

14. ¿Qué es una pérdida de memoria? ¿Cómo evitarlo?

Reconocer problemas comunes de memoria

  • Definición de pérdida de memoria:La memoria solicitada por el programa no se puede liberar y la memoria está ocupada durante mucho tiempo.
  • Razones comunes:
  • Los objetos de larga duración se refieren a objetos de corta duración.
  • Los objetos de la colección no se limpian a tiempo.
  • Oyente o devolución de llamada no registrado
  • La colección estática crece infinitamente
  • Cómo evitarlo:Publique las referencias con prontitud, utilice la prueba con recursos y verifique el uso de la memoria con regularidad.

15. ¿Qué son las referencias fuertes, las referencias suaves, las referencias débiles y las referencias virtuales?

Comprender los cuatro tipos de referencia de Java

  • Cita fuerte:Referencia ordinaria, el objeto no se recicla hasta que no existe una referencia fuerte.
  • Referencia suave:Se recicla cuando no hay suficiente memoria y se utiliza para el almacenamiento en caché.
  • Referencia débil:Se reciclará en el próximo GC y se utilizará para WeakHashMap.
  • Referencia fantasma:Puede reciclarse en cualquier momento y debe usarse con una cola de referencia para realizar un seguimiento del reciclaje de objetos.
  • Prioridad de reciclaje:Referencia virtual > Referencia débil > Referencia suave > Referencia fuerte

📦 Marco de colección

16. ¿Cuál es la estructura de Java Collections Framework?

Dominar el concepto general del marco de recopilación.

  • Interfaz de colección:
  • Lista:Ordenado y repetible, como ArrayList, LinkedList
  • Conjunto:Desordenados y no repetitivos, como HashSet, TreeSet
  • Cola:Colas, como LinkedList, PriorityQueue
  • Interfaz del mapa:
  • Mapeo de pares clave-valor:HashMap, TreeMap, ConcurrentHashMap
  • Nivel general:Iterable → Colección/Mapa → clase de implementación concreta

17. ¿Cuál es la diferencia entre ArrayList y LinkedList?

Compare dos implementaciones de listas de uso común

  • Estructura de datos:ArrayList se basa en matrices, LinkedList se basa en listas doblemente enlazadas
  • Acceso aleatorio:ArrayList O (1), LinkedList O (n)
  • Inserción y eliminación:ArrayList O (n), LinkedList O (1)
  • Uso de memoria:ArrayList es continuo, LinkedList está disperso (puntero superior)
  • Seguridad del hilo:Ninguno está sincronizado, puedes usar Collections.synchronizedList() o CopyOnWriteArrayList
  • Seleccione:Utilice ArrayList para consultas frecuentes y LinkedList para inserciones y eliminaciones frecuentes.

18. ¿Cuál es el principio y el rendimiento de HashMap?

Comprensión profunda de cómo funciona HashMap

  • Estructura de datos:Matriz + lista vinculada + árbol rojo-negro (JDK 8+)
  • Cómo funciona:hash(key) % table.length Calcular subíndice de matriz, enlace o árbol en caso de conflicto
  • Factor de carga:El valor predeterminado es 0,75, se expande cuando se usa capacidad ≥ capacidad × factor de carga
  • Mecanismo de expansión:Se duplicó la capacidad y se repitieron los elementos
  • Complejidad del tiempo:Promedio O(1), peor O(n) (cuando hay muchos conflictos)
  • Seguridad del hilo:No sincronizado, use ConcurrentHashMap o Collections.synchronizedMap() para subprocesos múltiples

19. ¿Cómo garantizar que HashSet no se duplique?

Comprender el mecanismo de deduplicación de Set

  • Implementación de bajo nivel:Basado en HashMap, la clave es el elemento y el valor es el objeto fijo
  • Mecanismo de deduplicación:Primero compare hashCode (), luego use igual () para determinar la igualdad.
  • Agregar proceso:Calcular hash → comprobar si existe → agregar si no existe → ignorar si existe
  • Objetos personalizados:Equals() y hashCode() deben reescribirse para garantizar la coherencia.
  • Rendimiento:Agregar, eliminar y buscar el promedio O (1), según la calidad del hash

20. ¿Qué son los sistemas a prueba de fallos y a prueba de fallos?

Comprender el mecanismo de seguridad del iterador de las colecciones.

  • fallar rápido:
  • Modificar la colección durante el proceso de iteración generará ConcurrentModificationException
  • Detectado mediante modCount y esperadoModCount
  • Como ArrayList, HashMap (no seguro para subprocesos)
  • a prueba de fallos:
  • La iteración se basa en una instantánea o copia de la colección. Modificar la colección original no afecta la iteración.
  • Como CopyOnWriteArrayList, ConcurrentHashMap
  • Sugerencias de uso:Al iterar, utilice remove() del iterador o utilice una colección a prueba de fallos.

⚠️Manejo de excepciones

21. ¿Sistema de excepción de Java?

Comprender la clasificación de las excepciones de Java.

  • Lanzable (clase raíz):
  • Excepción:excepción recuperable
  • Error:Error a nivel de máquina virtual, irrecuperable
  • Categoría de excepción:
  • Excepción marcada (marcada):Debe ser capturado o declarado, como IOException
  • Excepción no marcada (sin marcar):No se puede detectar, como NullPointerException, IndexOutOfBoundsException
  • Excepciones comunes:NPE, ClassCastException, ArrayIndexOutOfBoundsException, etc.

22. ¿Orden de ejecución try-catch-finally?

Domine el flujo de ejecución del manejo de excepciones.

  • Situación normal:intentar → finalmente → regresar normalmente
  • Excepción:intentar → ocurre una excepción → capturar → finalmente → se pasa o devuelve la excepción
  • finalmente características:Debe ejecutarse, incluso si return, throw, System.exit() en catch
  • Excepciones:El retorno en finalmente anulará el retorno en try/catch
  • Liberación de recursos:Se recomienda utilizar try-with-resources para cerrar automáticamente los recursos.
  • Mejores prácticas:No cambie el valor de retorno finalmente, ya que esto provocará que se pierdan las excepciones.

23. ¿Cuál es la diferencia entre lanzamientos y lanzamiento?

Distinguir entre dos palabras clave de manejo de excepciones

  • tirar:
  • Lanzar manualmente instancias de excepción, debe usarse dentro del método
  • Formato: lanzar una nueva excepción ("mensaje")
  • lanza:
  • Declarar posibles excepciones lanzadas en la firma del método
  • Formato: método público vacío () lanza IOException
  • Método de procesamiento:el lanzamiento es declarado por lanzamientos y los lanzamientos son manejados por la persona que llama
  • Aplicación:throw se usa para el manejo de excepciones específicas, throws se usa para la entrega de excepciones

24. ¿Cómo personalizar las excepciones?

Crear clases de excepción específicas del proyecto

  • Relación de herencia:Heredar excepción (excepción marcada) o RuntimeException (excepción no marcada)
  • Piezas necesarias:
  • Proporcionar un constructor sin parámetros.
  • Proporcionar un constructor con un mensaje.
  • Proporcionar un constructor con mensaje y causa.
  • Ejemplo de código:clase pública CustomException extiende la excepción {...}
  • Mejores prácticas:Nomenclatura clara, documentación clara y herencia de clases de excepción apropiadas

25. ¿Cuáles son los beneficios de la sintaxis de prueba con recursos?

Comprender la gestión automática de recursos

  • Sintaxis:intente (InputStream es =...) {...} cerrar recursos automáticamente
  • Requisitos:Los recursos deben implementar la interfaz AutoCloseable
  • Ventajas:
  • Llame automáticamente al método close() sin administración manual
  • Manejo correcto de excepciones cuando se suprimen.
  • El código es más conciso y evita la fuga de recursos.
  • Escenarios aplicables:Clases de recursos como Archivo, Corriente, Conexión, Declaración, etc.

🔤 Cadena, StringBuilder, StringBuffer

26. La cadena es inmutable y ¿por qué?

Comprender las profundas consideraciones detrás del diseño de cadenas

  • Definición inmutable:El objeto String no se puede modificar una vez creado y cualquier operación de modificación devuelve un nuevo objeto.
  • Método de implementación:La matriz de valores se modifica finalmente y no tiene ningún método de establecimiento.
  • Razones inmutables:
  • Optimización del grupo de búfer de cadenas para evitar la creación repetida
  • Seguro para subprocesos, no requiere sincronización
  • Admite el almacenamiento en caché de hashCode, adecuado para la clave HashMap
  • Desventajas:Las modificaciones frecuentes crean una gran cantidad de objetos intermedios.

27. ¿Cuáles son las diferencias entre String, StringBuilder y StringBuffer?

Elija la clase de manipulación de cadenas adecuada

  • Cadena:Inmutable, seguro para subprocesos, rendimiento deficiente (modificación frecuente)
  • Constructor de cadenas:Variable, no seguro para subprocesos, excelente rendimiento (un solo subproceso)
  • búfer de cadena:Mutable, seguro para subprocesos (métodos sincronizados), rendimiento medio (multiproceso)
  • Comparación de rendimiento:StringBuilder > StringBuffer > Cadena
  • Sugerencias de uso:
  • Concatenación de cadenas de un solo subproceso usando StringBuilder
  • StringBuffer para concatenación de cadenas multiproceso
  • No es necesario modificar, use String

28. ¿Qué es el grupo constante de cadenas?

Comprender el mecanismo de almacenamiento en caché de cadenas

  • Definición:Caché de cadenas mantenida por JVM, que almacena literales de cadenas
  • Ubicación:JDK 7+ en el montón, anteriormente en el área de método
  • Mecanismo de creación:
  • Literales como "abc" ingresan automáticamente al grupo constante
  • new String("abc") Si "abc" no está en el grupo, agréguelo
  • método interno():Agregue una cadena al grupo constante o devuelva una referencia existente
  • Efecto de optimización:Ahorre memoria y acelere las comparaciones de cadenas

29. ¿Cómo comparar cadenas para determinar la igualdad?

Aprenda a comparar cadenas

  • == Comparar:Compara si las referencias son iguales, no compara contenido
  • comparación igual():Compare el contenido de las cadenas para ver si son iguales. Se recomienda utilizar
  • Comparación de equalsIgnoreCase():Ignorar el contenido de comparación de casos
  • comparación compareTo():Comparación lexicográfica, devolviendo un número entero
  • Objetos.equals():Manejo de comparaciones seguras de valores nulos
  • Mejores prácticas:Utilice equals() para comparar el contenido de la cadena, evite usar ==

30. ¿Cuáles son los problemas de rendimiento con la concatenación de cadenas?

Optimice el rendimiento de la concatenación de cadenas.

  • Pregunta:String s = "a" + "b" + "c" produce múltiples objetos intermedios y copias
  • Razón:La cadena es inmutable y se crea un nuevo objeto cada vez que se empalma.
  • Impacto en el rendimiento:O (n²) complejidad de tiempo al empalmar bucles
  • Plan de optimización:
  • Directo + fuera del bucle: el compilador optimizará a StringBuilder
  • Utilice explícitamente StringBuilder o StringBuffer
  • Utilice herramientas como String.join(), StringJoiner, etc.

🔄 Subprocesos múltiples y concurrencia

31. ¿Qué es un hilo? ¿Cómo crear un hilo?

Dominar los conceptos básicos y métodos de creación de hilos.

  • Definición del hilo:Flujo de ejecución independiente dentro del proceso, memoria compartida pero pila independiente
  • Cómo crear:
  • Heredar hilo:clase pública MyThread extiende Thread { public void run() {} }
  • Implementar ejecutable:clase pública MyRunnable implementa Runnable { public void run() {} }
  • Implementar invocable:Valores de retorno y soporte de excepciones
  • Diferencia:Se recomienda Runnable para evitar restricciones de herencia única.
  • Inicio:Llame a thread.start(), no puede llamar a run() directamente

32. ¿Ciclo de vida y estado del hilo?

Comprender las distintas transiciones de estado de los subprocesos.

  • NUEVO:Hilo creado pero no iniciado.
  • EJECUTABLE:Estado ejecutable (esperando ejecución o en ejecución)
  • BLOQUEADO:Estado bloqueado, esperando adquirir el bloqueo.
  • ESPERANDO:Estado de espera, esperando notificaciones de otros hilos
  • TIEMPO_ESPERA:Espere el tiempo especificado
  • TERMINADO:Hilo terminado
  • Transición de estado:NUEVO → EJECUTABLE → BLOQUEADO/ESPERANDO → TERMINADO

33. ¿Cómo funciona sincronizado?

Comprender el mecanismo de bloqueo integrado de Java

  • Mecanismo de sincronización:Sincronización mediante el bloqueo integrado del objeto
  • Cómo utilizar:
  • Método de sincronización:método vacío sincronizado público () {}
  • Bloque de sincronización:sincronizado (obj) {...}
  • Cómo funciona:
  • Cada objeto tiene un monitor.
  • El hilo adquiere el bloqueo y entra en la sección crítica, ejecución mutuamente excluyente
  • Código de bytes: monitorenter, monitorexit
  • Características:Reentrante, exclusivo, lanzamiento automático.

34. ¿Cuál es el papel de la palabra clave volátil?

Comprender la visibilidad de la memoria y deshabilitar el reordenamiento de instrucciones

  • Función:
  • Visibilidad:Asegúrese de que los cambios sean inmediatamente visibles para otros hilos.
  • Reflujo prohibido:Evitar optimizaciones de reordenamiento del compilador y la CPU
  • Implementación:Barrera de la memoria, que obliga a leer y escribir desde la memoria principal.
  • Limitaciones:La atomicidad no está garantizada y no puede reemplazar a sincronizado.
  • Escenarios de aplicación:Bit de bandera, singleton de doble verificación, marca de estado
  • Comparar sincronizado:volátil es más liviano pero tiene una funcionalidad limitada

35. ¿Cuáles son las funciones y diferencias de esperar (), notificar () y notificar a todos ()?

Dominar el mecanismo de comunicación entre hilos.

  • espera():
  • El hilo actual libera el bloqueo y espera hasta que se despierte.
  • Debe ser llamado dentro de un bloque sincronizado.
  • notificar():
  • Activar un hilo en espera (seleccionado aleatoriamente)
  • No suelte el bloqueo, espere hasta el final del bloque de sincronización antes de soltarlo
  • notificar a todos():
  • Despierta todos los hilos en espera
  • Modo de uso:Modo productor-consumidor, modo monitor

💡 Consejos para la preparación de la entrevista

Profundiza en los conceptos básicos:No solo conozca los conceptos, sino que también comprenda los principios y los detalles de implementación.

Haz más ejercicios:Consolidar conocimientos a través de la práctica de codificación, especialmente en relación con subprocesos múltiples y concurrencia.

Lea el código fuente:Estudie el código fuente de la biblioteca Java (colecciones, concurrencia, etc.) para profundizar su comprensión.

Presta atención a los detalles:Domine los errores comunes y las mejores prácticas, como la comparación de cadenas, la modificación de colecciones y más.

Ejemplo:Utilice ejemplos específicos para ilustrar conceptos durante la entrevista y mejorar su poder expresivo.