Me gustaría preguntarte si has realizado algún proyecto aquí.
¿Podría contarnos sobre los proyectos en los que ha trabajado, qué tecnología utilizó y qué contenido fue responsable de desarrollar? (Experiencia en proyectos)
¿Cuáles son los ocho tipos de datos básicos? (Base)
¿Puede decirme si el tipo largo se puede ejecutar directamente? La pregunta debería ser si se puede calcular directamente. (Base)
¿Entiendes el patrón singleton? ¿Puedes hablar de ello? (Patrones de diseño)
¿Cuál es la diferencia entre el modo hombre perezoso y el modo hombre hambriento?
¿Cuáles son las características de las transacciones? (transacción)
Cuénteme sobre alguna excepción que haya encontrado mientras trabajaba en proyectos. (anormal)
¿Hablemos de las tres categorías de tiempo de uso común? (Base)
¿Hablar de tres métodos de calendario?
Hablemos del ciclo de vida de la sesión. (sesión)
¿Alguna vez ha encontrado una pérdida de precisión de coma flotante mientras trabajaba en un proyecto? ¿Cómo lo solucionaste?
Luego tenemos un cálculo usando punto flotante. ¿Qué tipo de datos elegirías para calcular?
¿Puede decirme algunas anotaciones de uso común? ¿Primavera? ¿O algo mas?
¿Sabes sobre hilos?
¿Cuál es la diferencia entre hilo y proceso?
Entonces dime ¿qué es la seguridad de los hilos?
¿Dime la diferencia entre == y es igual?
¿Alguna vez has usado Linux? ¿Puedes hablar brevemente sobre algunos comandos de uso común?
problema resuelto
- 我想问一下你这边有做过什么项目吗?
Creo que puedes elegir uno o dos proyectos relativamente competentes para hablar.
- 你说一下long类型能直接运转吗(Creo que se pregunta si los datos de tipo largo se pueden operar directamente)
Los datos de tipo largo se pueden operar directamente. Cuando se mezclan valores de tipo int y long en una expresión, el valor de tipo int se promoverá automáticamente a tipo largo para garantizar que el resultado de toda la expresión sea de tipo largo.
- 你了解单例模式吗?你可以讲一下吗
Singleton Pattern es un patrón de diseño de software de uso común. Su propósito es garantizar que una clase tenga solo una instancia y proporcionar un punto de acceso global para obtener esta instancia única. Este patrón es útil cuando necesita controlar el acceso a los recursos, o cuando la creación de instancias de objetos consume mucho tiempo o recursos y solo se necesita uno de estos recursos o instancias globalmente. Los métodos de implementación comunes del modo singleton incluyen principalmente: modo perezoso y modo hambriento.
- 懒汉模式跟饿汉模式有什么区别?
Se puede obtener deTiempo de inicialización de objetos, seguridad de subprocesos y utilización de recursosComparar en otros aspectos:
Tiempo de inicialización
modo perezoso: El modo Lazy es un延迟加载 patrón singleton.Se caracteriza por第一次使用时创建实例对象 , en lugar de crearlo cuando se carga la clase.Este patrón evita la necesidad de, por ejemplo, objetos cuando资源浪费, creado solo cuando es necesario.
Modo hambre: El modo hombre hambriento es una especie de在类加载时就创建实例 patrón singleton. Su característica es que el objeto de instancia se crea cuando se carga la clase, independientemente de si se utilizará o no.Este método garantiza que se pueda obtener el mismo objeto de instancia bajo cualquier circunstancia, pero puede causar algunos性能和资源上的浪费, especialmente en algunos casos no se utiliza el objeto de instancia.
seguridad del hilo
modo perezoso: El modo Lazy en sí es非线程安全的 , porque existe la posibilidad de que varios subprocesos llamen al método getInstance () al mismo tiempo e ingresen la declaración de juicio al mismo tiempo, lo que resultará en la creación de múltiples instancias.Para lograr la seguridad de los subprocesos, puede utilizar el método getInstance()添加synchronized关键字 , pero esto generará una sobrecarga de rendimiento. Además, también puede utilizar el bloqueo de doble verificación y otros métodos para reducir la sobrecarga de sincronización.
Modo hambre: El modo hambre es线程安全Sí, debido a que el objeto de instancia se creó cuando se carga la clase, no hay problema de competencia en un entorno de subprocesos múltiples.
Utilización y rendimiento de recursos
modo perezoso : El modo diferido puede ahorrar recursos porque evita desperdiciar recursos cuando los objetos de instancia no son necesarios. Sin embargo, dado que es necesario inicializarlo la primera vez que se utiliza, el rendimiento puede verse afectado si el proceso de inicialización es complejo o lleva mucho tiempo.
Modo hambre : El modo hambriento puede no ser tan flexible como el modo diferido en términos de utilización de recursos, porque crea objetos de instancia independientemente de si se utilizarán o no. Sin embargo, dado que el objeto de instancia ya está creado cuando se carga la clase, es más rápido en la primera llamada porque no se requiere inicialización.
Escena aplicable
modo perezoso: Aplicable aUn escenario en el que el objeto se crea solo cuando se usa por primera vez y no existen requisitos complejos de seguridad de subprocesos durante el proceso de inicialización del objeto de instancia. . Por ejemplo,administrador de archivosEste es un ejemplo típico, porque es posible que no necesite leer y escribir archivos inmediatamente cuando se inicia la aplicación, sino que solo realice operaciones relacionadas cuando sea necesario.
Modo hambre : Adecuado para recursos que deben inicializarse cuando se inicia el programa y se utilizan durante todo el ciclo de vida de la aplicación. Por ejemplo, un registrador es un buen candidato para el patrón Hungry porque la funcionalidad de registro generalmente debe estar lista al inicio de la aplicación y registrar mensajes durante todo el tiempo de ejecución de la aplicación.
En resumen, el modo del hombre perezoso y el modo del hombre hambriento tienen cada uno sus propias ventajas y desventajas, y en aplicaciones prácticas deben considerarse y diseñarse de manera integral de acuerdo con escenarios específicos.
- 说一下事务的几种特性?
Las transacciones tienen cuatro características básicas, que también se conocen comoÁCIDOLas características, específicamente incluyen:
Atomicidad : Atomicidad significa que todas las operaciones de una transacción se completan o no se ejecutan. Son una unidad de trabajo indivisible. Si se produce algún error o falla durante la ejecución de la transacción, las operaciones que se han realizado se desharán (revertirán) y toda la transacción será como una operación que nunca sucedió. Esta característica garantiza la integridad y coherencia de las transacciones.
Consistencia : Coherencia significa que una transacción debe transformar la base de datos de un estado de coherencia a otro estado de coherencia. Antes de que comience la transacción y después de que finalice, las restricciones de integridad de la base de datos (como restricciones de clave primaria, restricciones de clave externa, etc.) no se destruyen y todos los datos mantienen una coherencia lógica. Si la integridad de la base de datos se ve comprometida durante la ejecución de una transacción, la transacción se cancelará y las operaciones que se hayan realizado se revertirán.
Aislamiento : Aislamiento significa que cuando se ejecutan varias transacciones al mismo tiempo, cada transacción está aislada entre sí y la ejecución de una transacción no puede ser interferida por otras transacciones. El sistema de base de datos proporciona un cierto nivel de aislamiento para que las transacciones ejecutadas simultáneamente no interfieran entre sí, garantizando así la exactitud y coherencia de los datos. El aislamiento generalmente se logra mediante mecanismos como bloqueos (como bloqueos de fila, bloqueos de tabla, etc.) o control de concurrencia de versiones múltiples (MVCC).
Durabilidad : Durabilidad, también llamada permanencia, significa que una vez que se confirma una transacción, sus modificaciones en la base de datos son permanentes y no se perderán incluso si el sistema falla. El sistema de base de datos garantiza la durabilidad de las transacciones a través de registros y mecanismos de recuperación. Incluso si ocurre una falla del sistema, el sistema puede recuperar las modificaciones en la base de datos mediante transacciones confirmadas a través de registros.
- 说一下你在做项目的过程中都遇到过哪些异常吗?(Solo enumera algunos)
Excepciones de código:
Excepción de puntero nulo : Se produce al intentar acceder u operar un objeto no inicializado. Es común olvidarse de comprobar si el objeto es nulo y utilizarlo directamente.
Excepción de matriz fuera de límites (ArrayIndexOutOfBoundsException): Se utilizó un índice no válido al acceder a la matriz (el índice es menor que 0 o mayor o igual que el tamaño de la matriz).
Excepción de conversión de tipos (ClassCastException): Al realizar la conversión, el objeto que se convierte no es una instancia del tipo de destino ni su subclase.
ArithmeticException // por cero: Al realizar la operación de división, el divisor es cero.
Excepciones de datos:
Error de formato de datos: Por ejemplo, al analizar datos JSON o XML, el formato de los datos no cumple con las expectativas.
Excepción de integridad de datos: Si falla una restricción de clave externa en la base de datos, se violan las reglas de integridad de los datos al intentar insertar o actualizar datos.
Excepción de datos no encontrados: Si los datos correspondientes no se encuentran de acuerdo con las condiciones dadas al consultar la base de datos.
Excepciones de red:
Tiempo de espera de conexión (ConnectTimeoutException): Al intentar establecer una conexión de red, la solicitud de conexión expiró mientras esperaba una respuesta.
Tiempo de espera de lectura (SocketTimeoutException): Se agotó el tiempo de espera de la operación mientras se leían datos de la conexión.
La red es inaccesible (UnknownHostException):no se puede resolver el nombre de host.
Conexión rechazada (ConnectionRefusedError): La máquina de destino rechazó la solicitud de conexión.
Excepciones de recursos del sistema:
Desbordamiento de memoria (OutOfMemoryError): La JVM no tenía suficiente espacio de memoria disponible al intentar asignar memoria.
El archivo no existe (FileNotFoundException): El archivo o directorio al que intenta acceder no existe.
Permisos insuficientes (SecurityException/AccessDeniedException): Permisos insuficientes para realizar una operación, como leer y escribir archivos, acceder a recursos de red, etc.
Excepciones de servicios de terceros:
El servicio no está disponible (ServiceUnavailableException): El servicio de terceros dependiente no está disponible temporalmente.
Límite de API (RateLimitException): La solicitud a la API de terceros excede su límite (como el límite de frecuencia de solicitud).
Error de autenticación (AuthenticationException): Al acceder a servicios de terceros, la información de autenticación no es válida o ha caducado.
Excepciones lógicas:
Error de lógica empresarial: Por ejemplo, el monto del pedido se calcula incorrectamente, el inventario es insuficiente pero el pedido aún se procesa, etc.
Estado inconsistente: Cierto estado del sistema no coincide con las expectativas, lo que hace que las operaciones posteriores sean imposibles.
- 说一下时间常用的三个类?
Fecha local, hora local, fecha y hora local. (Solo enumere tres)
En Java, las clases comúnmente utilizadas para el tiempo de procesamiento son clases de los tres paquetes java.util.Date, java.util.Calendar y java.time introducidos en Java 8 (comoFecha local, Hora local, Fecha y hora localesperar)
- 说一下日历的三个方法?
Cuando se trata de operaciones relacionadas con el calendario, generalmente pensamos en la clase java.util.Calendar, porque es una clase abstracta que proporciona métodos para operar campos del calendario (como año, mes, día, hora, etc.).A partir de Java 8, se introdujo una nueva API de fecha y hora (ubicada en el paquete java.time), que proporciona mejores capacidades de procesamiento de fecha y hora.
Introducción a los métodos comunes de LocalDateTime:
Crear objeto LocalDateTime
now(): crea un objeto LocalDateTime que representa la fecha y hora actuales.
of(): crea un objeto LocalDateTime con el año, mes, día, hora, minuto, segundo especificado (y nanosegundos opcionales). Por ejemplo: LocalDateTime.of(2023, Month.ENERO, 1, 12, 0, 0).
Obtener las propiedades del objeto LocalDateTime
getYear(), getMonth(), getDayOfMonth(), getHour(), getMinute(), getSecond(), etc.: se utilizan para obtener los atributos de año, mes, día, hora, minuto y segundo en el objeto LocalDateTime respectivamente.
Modificar las propiedades del objeto LocalDateTime
withYear(), withMonth(), withDayOfMonth(), withHour(), withMinute(), withSecond(), etc.: establece una propiedad del objeto LocalDateTime en el valor especificado y devuelve un nuevo objeto LocalDateTime. El objeto original permanece sin cambios. . variable (porque LocalDateTime es inmutable).
Suma y resta de fecha y hora.
plusYears(), plusMonths(), plusDays(), plusHours(), plusMinutes(), plusSeconds(), etc.: agrega el período de tiempo especificado al objeto LocalDateTime y devuelve un nuevo objeto LocalDateTime. minusYears(), minusMonths(), minusDays(), minusHours(), minusMinutes(), minusSeconds(), etc.: resta el período de tiempo especificado del objeto LocalDateTime y devuelve un nuevo objeto LocalDateTime.
Comparar objetos LocalDateTime
isBefore (LocalDateTime other): determina si el objeto actual es anterior al objeto LocalDateTime especificado.
isAfter (LocalDateTime other): determina si el objeto actual es posterior al objeto LocalDateTime especificado.
Dar formato al objeto LocalDateTime
formato (formateador DateTimeFormatter): formatea el objeto LocalDateTime en una cadena en el formato de fecha y hora especificado. Por ejemplo: DateTimeFormatter formateador = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = dateTime.format(formateador);.
Calcular la diferencia horaria
Aunque LocalDateTime en sí no proporciona un método para calcular directamente la diferencia horaria, puede usar la clase Duration o la clase ChronoUnit para calcular la diferencia horaria entre dos objetos LocalDateTime.
Utilice la clase de Duración: Duración duración = Duración.entre (inicio, fin); y luego puede obtener el valor específico de la diferencia horaria, como segundos, milisegundos, etc., a través del objeto de duración.
Usando la clase ChronoUnit: puede especificar la unidad para calcular la diferencia horaria, como año, mes, día, hora, etc. Por ejemplo: días largos = ChronoUnit.DAYS.between(inicio, fin);.
- 说一下session的生命周期吧。
Creación de sesión
Tiempo de creación:Session se utiliza cuando el usuario accede por primera vez al servidor y solicita JSP, Servlet, etc.动态资源 creado cuando.Accede únicamente a HTML, imágenes, etc.静态资源 No activará la creación de la sesión. Si es necesario, puede forzar la generación de una sesión llamando a request.getSession(true).
ubicación de almacenamiento: La sesión se almacena en el lado del servidor, generalmente en la memoria del servidor para un acceso rápido.
Mantenimiento de sesión
Actualizar la hora del último acceso: mientras el usuario continúe accediendo al servidor, el servidor actualizará la hora del último acceso de la sesión y mantendrá la sesión para cada solicitud, independientemente de si lee o escribe la sesión. Esto indica que la sesión del usuario está en un estado "activo".
singularidad de la sesión : Cada usuario tendrá una sesión independiente, identificada de forma única por el ID de sesión. El ID de sesión generalmente se envía al cliente a través de una cookie (llamada JSESSIONID) para que el servidor pueda identificar diferentes sesiones de usuario.
Destrucción de sesión
Destruir automáticamente : Cuando el ciclo de vida de la sesión se agota (es decir, no hay actividad durante mucho tiempo), el servidor lo borrará automáticamente de la memoria. Este tiempo suele ser configurable y el valor predeterminado es 30 minutos en Tomcat.
Destrucción manual : Los desarrolladores pueden destruir manualmente la sesión llamando al método invalidate() de la sesión. Esto generalmente se usa para escenarios como cierre de sesión y tiempo de espera.
Configuración del ciclo de vida de la sesión
Establecer en Servlet: establezca el tiempo de espera de la sesión en segundos llamando al método session.setMaxInactiveInterval (intervalo int).
Establecer en web.xml: en el archivo web.xml de la aplicación web,通过