Fundamentos de JAVA (Entrevista)


1. Fundación JAVA

1. ¿Qué es la orientación a objetos?

encapsulación, herencia, polimorfismo

2. ¿Cuál es su opinión sobre las excepciones? ¿Cómo sueles afrontarlo? (¿Para qué se usará finalmente y dónde se colocará cuando se cierre la transmisión?)
  • Una excepción es la aparición de un problema cuando se compila o ejecuta el programa;
  • Throwable es la clase principal de todos los errores (problemas que no son de programación, objetivos de solución principal y ajuste de rendimiento) y excepción (problemas de programación y puede manejar ajustable);
  • El manejo manual de las excepciones puede mejorar la solidez del programa;
3. La diferencia entre pila y pila en JAVA, hablemos sobre el mecanismo de memoria de Java. (¿Se puede imprimir el tipo de referencia? Al imprimir una variable declarada por String, ¿qué se imprime?)
  • El montón se utiliza para almacenar referencias a tipos de datos y objetos básicos (nombres de direcciones de memoria de tipos de referencia)
  • La pila se usa especialmente para almacenar el valor real del tipo de datos de referencia, que es administrado por la JVM y abre espacio para almacenar recursos;
4. El papel del grupo de subprocesos (describa brevemente las ventajas y desventajas del estilo perezoso y el estilo hambriento del modo singleton)
  • Mejorar la capacidad de gestión de subprocesos;
  • Reducir el consumo de recursos;
  • Mejorar la velocidad de respuesta;
5. El principio básico del mecanismo de recolección de basura (no hable demasiado profundo, si habla demasiado, pretenderá tener 13 años, lo cual es fácil de atacar)
  • El recolector de elementos no utilizados generalmente se ejecuta como un subproceso de bajo nivel separado para borrar y reciclar objetos que han muerto o que no se han utilizado durante mucho tiempo en el montón de memoria en circunstancias impredecibles;
  • Cuando se crea un objeto, el GC comienza a monitorear la dirección, el tamaño y el uso del objeto. Por lo general, GC usa un gráfico dirigido para registrar y administrar todos los objetos en el montón (heap). De esta forma, se determina qué objetos son "alcanzables" y cuáles son "inalcanzables";
6. Ventajas y desventajas del mecanismo de recolección de basura
  • Ventajas: La mayor ventaja es que el programador no necesita manejar la memoria por sí mismo;
  • Desventajas: "No se preocupe por eso" también significa "fuera de control", por lo que GC proporciona los métodos System.gc(), Runtime.gc() para notificar a GC sobre el reciclaje;
7. Ventajas y desventajas de las expresiones lambada (JDK1.8)
  • Ventajas: gramática mejorada, gramática concisa;
  • Desventajas: es difícil de entender al principio, lo que no es propicio para la comprensión de los principiantes de JAVA;
8. ¿Está ordenado HashMap?
  • No se ordenan HashMap ni HashTable;
  • Tanto TreeMap como LinkedHashmap están ordenados (TreeMap tiene por defecto el orden ascendente de claves, LinkedHashmap tiene por defecto el orden de inserción de datos);
9. Similitudes y diferencias entre ArrayList y LinkedList
  • Mismo punto:
    • ordenado;
    • repetible;
    • Tampoco son seguros para subprocesos;
  • diferencia:
    • ArrayList es la estructura de datos de Array (matriz dinámica) y LinkedList es la estructura de datos de Link (lista enlazada);
    • El rendimiento de la lista enlazada es más bajo que el de la lista de arreglos durante el acceso transversal aleatorio;
    • La adición y eliminación de la lista enlazada es mejor que la lista de arreglos;
    • La capacidad predeterminada de arraylist es 10 cuando se inicializa, mientras que la inicialización predeterminada de la lista enlazada está vacía;
10. La diferencia entre new ArrayList y Arrays.asList
  • La longitud de Arrays.asList es fija;
  • Arrays.asList solo admite el recorrido y la adquisición de valores, no admite ninguna operación de modificación como agregar(), eliminar(), etc., y solo se puede usar como un puente para pasar valores;
11. Al pasar parámetros, si pasar por valor o por referencia [todavía tengo disputas sobre esto, así que no escribiré la respuesta por ahora]
  • ¿¿¿Estar determinado???
12. ¿Cómo resuelve HashMap los conflictos hash (JDK1.8)?
  • Use el método de dirección de cadena (usando una tabla hash) para vincular datos con el mismo valor hash;

  • Use 2 funciones de perturbación (funciones hash) para reducir la probabilidad de colisiones hash y hacer que la distribución de datos sea más uniforme;

  • La introducción del árbol rojo-negro reduce aún más la complejidad temporal del recorrido, lo que lo hace más rápido;


2. Programa intermedio

1. ¿Cuáles son los beneficios de las colas de mensajes (qué middleware ha utilizado, ha encontrado algún problema, por ejemplo)
  • Mejorar la velocidad de respuesta del sistema;
  • Desvincular la producción y el consumo hace que el sistema sea más robusto y estable.
2. ¿Qué debo hacer si se pierde el mensaje MQ?
  • La cola de mensajes pierde datos: los mensajes persistentes y no persistentes deben procesarse de manera oportuna sin acumulación (cabe mencionar que en el caso de la persistencia, es mejor procesar de forma asíncrona e iniciar transacciones, de lo contrario será más lento y la cantidad de datos En casos grandes, es fácil provocar una reacción en cadena);
  • Los productores pierden datos: MQ convencional tiene un mecanismo de confirmación o mecanismo de transacción, que puede garantizar que el productor envíe el mensaje a MQ. Por ejemplo, RabbitMQ tiene modo de transacción y modo de confirmación;
  • Los consumidores pierden datos: los consumidores generalmente pierden datos porque usan el modo de mensaje de confirmación automático. MQ eliminará el mensaje después de recibir el mensaje de confirmación. Si el consumidor es anormal en este momento, el mensaje desaparecerá. Cambiar a la confirmación manual puede resolver este problema;
3. ¿Cómo logra MQ el consumo secuencial?
  • El productor garantiza ingresar a la cola secuencialmente e ingresar a la misma cola;
  • Se garantiza que los consumidores consumirán una cola y evitarán que múltiples consumidores consuman la cola;
4. Los beneficios de Redis para el almacenamiento en caché y qué otros escenarios de aplicación existen además del almacenamiento en caché
  • Bloqueo distribuido;
  • compartir sesiones;
  • cola de mensajes;
5. En Redis, ¿cuál es el principio de bloqueos distribuidos?
  • Los bloqueos distribuidos están diseñados para resolver el problema de los objetos que no se pueden crear en el escenario de la aplicación de servicio de clúster/distribuido, pero se crean de forma continua -> consumo (¡un poco complicado, comprenda con atención!);
  • En pocas palabras, los bloqueos distribuidos pueden garantizar que solo un cliente pueda operar en recursos compartidos a la vez;
  • Los bloqueos distribuidos deben cumplir los siguientes puntos:
    • No se producirá ningún interbloqueo (incluso si un cliente falla mientras mantiene el bloqueo y no lo desbloquea activamente, también puede garantizar que otros clientes puedan bloquearlo más tarde);
    • Tolerante a fallas (siempre que la mayoría de los nodos de Redis se ejecuten normalmente, el cliente puede bloquear y desbloquear);
    • El desbloqueo del timbre requiere la persona que ató el timbre (el bloqueo y el desbloqueo deben ser el mismo cliente, el cliente no puede desbloquear el bloqueo agregado por otros);
  • Los métodos proporcionados por Redis son: establecer el indicador de bloqueo, establecer el identificador único del cliente y proporcionar el tiempo de vencimiento del bloqueo;
  • Vea cómo el maestro juega la entrada del bloqueo distribuido de Redis: https://blog.csdn.net/qq_37781649/article/details/108814474
6. Cómo resolver la penetración de Redis (en general, comprenda el significado y comprenda la solución. Si estudia detenidamente, debe combinar aplicaciones prácticas para un análisis específico)
  • La penetración de Redis se refiere a un fenómeno en el que cuando la solicitud se envía a Redis, los datos de Redis no se ven afectados y luego los datos se consultan en la capa de base de datos;
  • solución:
    • Si se consideran ataques de piratas informáticos, es necesario combinar el filtro Bloom (BloomFilter) o el filtro de compresión para interceptar por adelantado;
    • En términos generales, consulte los datos de la base de datos y guárdelos en Redis con regularidad;
7. Cómo resolver la avalancha de Redis
  • La avalancha de Redis se refiere a un fenómeno en el que los datos de Redis se vacían debido a algunas razones, como que la aplicación de Redis se cuelga, el tiempo de datos de caché de Redis caduca y luego todas las solicitudes van a la base de datos;
  • solución:
    • Agregue juicio al negocio, cuando el valor recuperado por redis esté vacío, qué valor se tomará por defecto;
    • Al configurar el tiempo de caducidad de los datos almacenados en caché, en lugar de utilizar un valor uniforme, se puede aleatorizar dentro de un cierto rango para evitar que todos los datos se invaliden al mismo tiempo;
    • En caso de bloqueo de Redis, puede usar el modo centinela o clúster antes del incidente, configurar el caché local o el límite actual durante el incidente, reiniciar automáticamente y leer los datos de Redis del disco después del incidente, para restaurar rápidamente los datos almacenados en caché. de estrategias;

3. Tecnología de marco convencional

1. Describa brevemente la comprensión de la primavera (el núcleo es AOP e IOC, si cree que el tiempo de la entrevista es corto, puede divergir y hablar sobre el concepto de MVC)
  • AOP: programación orientada a aspectos (principalmente interceptar un cierto punto y luego ejecutar un método público antes o después de este punto, que es reutilizable)
  • IOC: Inversion of Control (usando la forma de inyectar dependencias para lograr el desacoplamiento entre objetos)
2. Describa brevemente el ciclo de vida de Spring Bean
  • (Es broma, jajaja) El proceso principal es: inicialización del contenedor --> llamada comercial --> cerrar el contenedor;
  • Cuando se inicializa el contenedor, se seguirá a su vez: Construir Bean --> Inyectar Propiedades de Bean --> (Ejecutar el método de inicialización especificado), luego realizar una llamada comercial y finalmente destruir el contenedor

3. La forma de inyección de dependencia

  • inyección de constructor;
  • inyección de setter;
  • Inyección basada en anotaciones (recomendación oficial);
4. La diferencia entre @RestController y @Controller
  • La anotación @RestController es equivalente a la combinación de dos anotaciones @Controller+@ResponseBody
  • Pero al usar la anotación @RestController, las páginas jsp y html no se pueden devolver, y el analizador de vistas no puede analizar las páginas jsp y html
5. El alcance de Spring Bean
  • singleton: solo habrá una instancia de Bean compartida en el contenedor Spring IoC, no importa cuántos beans se refieran a él, siempre apuntará al mismo objeto (de uso común);
  • prototipo: Cada vez que se obtiene el bean definido por el prototipo a través del contenedor Spring, el contenedor creará una nueva instancia de Bean, cada instancia de Bean tiene sus propias propiedades y estado (de uso común);
  • solicitud: en una solicitud Http, el contenedor devolverá la misma instancia del Bean. Se generará un nuevo bean para diferentes solicitudes Http, y el bean solo es válido dentro de la solicitud Http actual;
  • sesión: en una sesión Http, el contenedor devolverá la misma instancia del Bean. Se creará una nueva instancia para diferentes solicitudes de sesión, y esta instancia de bean solo es válida dentro de la sesión actual;
  • Sesión global: en una sesión Http global, el contenedor devolverá la misma instancia del Bean, que solo es válida cuando se usa el contexto del portlet;
6. La diferencia entre Mybatis-plus y Mybatis (tenga en cuenta que debe explicarse junto con el proyecto, no solo las siguientes diferencias)
  • Mybatis-plus ha realizado más extensiones sobre la base de Mybatis;
  • Plus puede usar el bloqueo optimista;
  • Plus cuenta con un generador de código;
  • Además, puede realizar análisis de rendimiento de ejecución de SQL (no recomendado para entornos de producción);
  • Además, puede realizar interceptores de análisis de ejecución de SQL (no recomendado para entornos de producción);
7. La diferencia entre resultType y resultMap
  • En general, resultMap es más potente porque puede combinar libremente conjuntos de resultados en comparación con resultType;
  • resultType es un mapeo uno a uno para una sola clase de VO;
  • resultMap puede combinar y mapear libremente el conjunto de resultados devuelto, sin crear una nueva clase VO o clase PO;
8. La diferencia entre el marcador de posición # y $
  • #{} solo puede representar un cierto valor, y el valor rellenado subsiguiente tiene una correspondencia uno a uno con el marcador de posición, lo cual es relativamente monótono, pero no hay riesgo de inyección SQL;
  • ${} representa un fragmento determinado, que se puede rellenar arbitrariamente, lo que es más flexible, pero existe el riesgo de inyección de SQL;
9. Reflection costará más gastos generales de rendimiento, pero ¿por qué Spring es tan genial?
  • JVM no optimizará la reflexión y, de hecho, tendrá una mayor sobrecarga de rendimiento;
  • Spring agrega todas las clases que necesitan obtenerse y configurarse en forma de archivos de configuración cuando se carga el contenedor;
  • El problema de la dependencia circular se resuelve a través del caché de segundo nivel y el caché de tercer nivel (punto central);
10. Qué patrones de diseño se utilizan en el marco Spring (muchos, aquí hay algunos patrones típicos para ilustrar)
  • Modo de fábrica: cree objetos Bean, e IOC es una canalización desacoplada construida en el modo de fábrica;
  • Modo singleton: el alcance predeterminado de Spring Bean es singleton;
  • Modo proxy: la implementación de AOP es el modo proxy. Además, el registro de aspectos de uso frecuente también es la realización del modo proxy;
  • Modo observador: el modelo basado en eventos de Spring es una aplicación clásica del modo observador;
  • Modo decorador: cada clase principal de entidad vacía que ve es básicamente un modo decorador, no limitado a Spring;
11、Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
  • 可以通信的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用;注 册中心对等集群,任意一台宕机后,将会切换到另一台;注册中心全部宕机 后,服务的提供者和消费者仍能通过本地缓存通讯。服务提供者无状态, 任一台宕机后,不影响使用;服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复;挂掉是不要紧的,但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的;
12、Dubbo在安全机制方面是如何解决的
  • Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管 理授权。Dubbo还提供服务黑白名单,来控制服务所允许的调用方。
13、SpringBoot 核心组件
  • 【常用】Spring boot Starter(核心启动器、集成了很多常见依赖包)
  • 【常用】Spring boot Autoconfigure(配置Bean到Spring容器中的代码实现包,这是Spring初期便有的一贯风格)
  • Spring boot Cli(不常用,是一个客户端工具,结合了groovy脚本使用,有兴趣的可以了解下)
  • Spring boot actuator(不常用,监控插件,有兴趣的可以了解下)

四、数据库


五、其他

1、系统如何优化(有没有处理过系统性的问题,比如因线程问题导致的服务器宕机,或者因为没有借助缓存工具导致DB负荷较重而并发不够】
  • 代码逻辑优化;
  • 数据库优化;
  • 借助第三方缓存工具,比如redis和mem的方式来提升读写,减轻DB压力;
  • 服务器扩充,磁盘扩容等物理增大;
2、怎么解决高并发问题?(此问题不好回答,因为每个公司或者项目要求不一样,但主要从这几个方面来进行阐述)
  • 服务层面(服务器扩容或单独服务器部署、数据库能力提升等);
  • 代码层面(代码逻辑优化、第三方缓存提升读写、减少DB交互);
  • Bloqueo (muchas personas pueden responder un bloqueo optimista, pero a veces es más aplicable un bloqueo pesimista considerado desde el nivel empresarial);
3. ¿Cuál es el significado del equilibrio de carga?
  • Mejorar la usabilidad (el núcleo es este, es inútil decir más, pero se puede explicar en combinación con tu propia experiencia de combate real);
4. Afinación de Tomcat (es suficiente hablar de algunos parámetros aquí, porque la afinación de Tomcat está relacionada con el hardware, y aquellos con experiencia real en combate pueden combinar casos anteriores para dar respuestas divergentes)
  • maxThreads: el número máximo de hilos que se pueden crear
  • acceptCount: cuando se utilizan todos los subprocesos disponibles para procesar solicitudes, la cantidad de solicitudes que se pueden colocar en la cola de procesamiento, las solicitudes que excedan este número no se procesarán;
  • connectionTimeout: tiempo de espera de conexión de red, unidad: milisegundos. Establecerlo en 0 significa que nunca se agota el tiempo, lo cual es un peligro oculto. Por lo general, se puede configurar en 30000 milisegundos;
  • minSpareThreadsTomcat: el número de subprocesos creados durante la inicialización;
  • maxSpareThreads: una vez que el subproceso creado supera este valor, Tomcat cerrará el subproceso de socket que ya no se necesita;
  • minProcessors: la cantidad mínima de subprocesos de conexión inactivos, utilizados para mejorar el rendimiento del procesamiento del sistema, el valor predeterminado es 10;
  • maxProcessors: el número máximo de subprocesos de conexión, es decir: el número máximo de solicitudes procesadas simultáneamente, el valor predeterminado es 75;
  • acceptCount: el número máximo de conexiones permitidas, debe ser mayor o igual a maxProcessors, el valor predeterminado es 100;
  • enableLookups Ya sea para buscar el nombre de dominio, el valor es: verdadero o falso. Para aumentar la potencia de procesamiento, debe establecerse en falso;
  • Aumente la memoria de Tomcat (principalmente resuelva el problema OutOfMemoryError);

Supongo que te gusta

Origin blog.csdn.net/qq_23845083/article/details/118435733
Recomendado
Clasificación