Este artículo organiza principalmente preguntas comunes de entrevistas de Java para su referencia. El contenido específico es el siguiente
1. La diferencia entre dormir y esperar en Java
① Estos dos métodos provienen de diferentes clases, el sueño proviene de la clase de hilo y la espera proviene de la clase de objeto.
El sueño es un método de hilo de clase estática. Quien lo llame se va a dormir. Incluso si el método de sueño de B se llama en el hilo A, en realidad todavía va a dormir. Para que el hilo B duerma, debe llamar a dormir en el código de b.
② Bloqueo: lo más importante es que el método de sueño no libera el bloqueo, mientras que el método de espera libera el bloqueo, para que otros hilos puedan usar bloques o métodos de control sincrónicos.
El sueño no transfiere los recursos del sistema; La espera es ingresar al hilo que espera la piscina para esperar, transferir recursos del sistema y otros hilos pueden ocupar la CPU. En general, Wait no agregará un límite de tiempo, porque si el hilo de espera se ejecuta en recursos insuficientes, será inútil salir nuevamente. Debe esperar a que otros hilos llamen a notificar/notificar a todos los hilos en la piscina de espera antes de ingresar a la cola lista y esperar que el sistema operativo asigne recursos del sistema. Se puede especificar el sueño (milisegundos) para despertarlo automáticamente. Si el tiempo es menor que el tiempo, solo puede llamar a la interrupción () para forzar la interrupción.
La función de Thread.sleep (0) es "activar el sistema operativo para volver a competir CPU una vez más".
③ Alcance de uso: espere, notifique y notifique todo solo se puede usar en métodos de control de sincronización o bloques de control de sincronización, mientras que el sueño se puede usar en cualquier lugar.
sincronizado (x) {x.notify () // o espera ()}2. La diferencia entre hashmap y hashtable en Java
① Razones históricos: la hashtable se da a la vieja clase dictonaria. HashMap es una implementación de la interfaz MAP introducida por Java 1.2.
② hashmap permite pares de valores clave vacíos, mientras que hashtable no
③ Sincronización hashtable, mientras que el hashmap asíncrono es más eficiente que el hashtable
3. Por favor, describa brevemente la diferencia entre lanzamientos y lanzamientos en excepciones
① El lanzamiento representa una acción, lo que significa que se lanza una excepción; Los lanzamientos representan un estado, lo que significa que el método puede tener una excepción de lanzamiento ② Se utiliza el lanzamiento en la implementación del método, mientras que los lanzamientos se usan en el método Declaración ③ El lanzamiento solo se puede usar para lanzar una excepción, mientras que los lanzamientos pueden lanzar múltiples excepciones
4. La diferencia entre el desbordamiento de la memoria y la fuga de memoria
El desbordamiento de memoria fuera de la memoria se refiere al hecho de que cuando un programa se aplica para la memoria, no hay suficiente espacio de memoria para que se use, y aparece fuera de la memoria; Por ejemplo, si se aplica un entero pero puede ahorrar mucho tiempo, es desbordamiento de memoria.
Memoria Flote de memoria Se refiere a la incapacidad del programa para liberar el espacio de memoria que se ha solicitado después de solicitar la memoria. Se puede ignorar el daño de una fuga de memoria, pero las consecuencias de la acumulación de fuga de memoria son muy graves. No importa cuánta memoria sea, estará ocupada tarde o temprano.
¡La fuga de memoria eventualmente conducirá a fuera de la memoria!
El desbordamiento de la memoria significa que la memoria que debe asignar excede lo que el sistema puede darle, y el sistema no puede satisfacer las necesidades, por lo que se produce un desbordamiento.
Las filtraciones de memoria son cuando solicita al sistema para asignar memoria para su uso (nuevo), pero después de su uso, no regresa (eliminar). Como resultado, ya no puede acceder a la memoria que solicitó (tal vez haya perdido su dirección), y el sistema no puede asignarla al programa requerido nuevamente. Si usa todos los métodos para llenar una placa, solo puede contener 4 frutas. Si llena 5, caerá al suelo y no puede comerlo. ¡Esto es desbordamiento! Por ejemplo, si la pila está llena, inevitablemente causará desbordamiento espacial cuando la pila esté llena, lo que se llama desbordamiento. Si la pila está vacía, también causará desbordamiento espacial cuando la pila esté vacía, lo que se llama bajo flujo. Significa que la memoria asignada no es suficiente para dejar la secuencia de elementos de datos, que se llama desbordamiento de memoria.
Clasificación de la forma en que ocurre, las filtraciones de memoria se pueden dividir en 4 categorías:
① Fugas de memoria frecuentes. El código que ocurre con una fuga de memoria se ejecutará varias veces, y cada vez que se ejecute, hará que se filtre una memoria.
② Fuencia ocasional de memoria. El código que ocurre con fugas de memoria solo ocurrirá en ciertos entornos u operaciones específicos. Regular y ocasional son relativos. Para un entorno específico, la ocasión puede ser frecuente. Por lo tanto, el entorno de prueba y los métodos de prueba son cruciales para detectar fugas de memoria.
③ Fuencia de memoria única. El código que ocurre con una fuga de memoria solo se ejecutará una vez, o debido a defectos algorítmicos, siempre habrá solo una pieza de fuga de memoria. Por ejemplo, la memoria se asigna en el constructor de la clase, pero la memoria no se libera en el destructor, por lo que las filtraciones de memoria solo ocurren una vez.
④ Fugas de memoria implícita. El programa asigna continuamente la memoria durante la operación, pero no libera la memoria hasta que esté terminada. Estrictamente hablando, no hay fuga de memoria aquí porque el programa finalmente libera toda la memoria solicitada. Pero para un programa de servidor, lleva varios días, semanas o incluso meses ejecutarse, y no liberar la memoria en el tiempo también puede conducir al final de agotar toda la memoria en el sistema. Entonces, llamamos a este tipo de fuga de memoria una fuga de memoria implícita.
Desde la perspectiva de los usuarios que usan programas, las filtraciones de memoria no causarán ningún daño. Como usuario ordinario, no puede sentir la existencia de fugas de memoria en absoluto. Lo que es realmente dañino es la acumulación de fugas de memoria, que eventualmente consumirán toda la memoria en el sistema. Desde esta perspectiva, las filtraciones de memoria única no son dañinas porque no se acumulan, mientras que las fugas de memoria implícitas son muy dañinas porque son más difíciles de detectar que las fugas de memoria frecuentes y ocasionales.
5. La diferencia entre String, StringBuffer y StringBuilder
① Variable e inmutable
La clase de cadena usa una matriz de caracteres para guardar cadenas, de la siguiente manera: debido a que hay un modificador "final", puede saber que los objetos de cadena son inmutables.
Valor de char final privado [];
Tanto StringBuilder como StringBuffer se heredan de la clase AbstractStringBuilder. En AbstractStringBuilder, las matrices de personajes se utilizan para guardar cadenas. De la siguiente manera, se puede ver que ambos objetos son mutables.
Char [] valor;
② ¿Es multiproceso y seguro?
Los objetos en la cadena son inmutables, por lo que pueden entenderse como constantes, que obviamente son seguras de hilo.
AbstractStringBuilder es una clase pública de StringBuilder y StringBuffer, que define algunas operaciones básicas de cadenas, como ExpandCapacity, Append, Insert, IndexOf y otros métodos públicos.
StringBuffer tiene un bloqueo de sincronización en el método o un bloqueo de sincronización en el método llamado, por lo que es seguro de subprocesos. Consulte el siguiente código fuente:
public sincronized StringBuffer Reverse () {super.reverse (); devolver esto; } public int indexOf (string str) {return indexOf (str, 0); // Hay un método público sincronizado int indexOf (string str, int fromindex)} StringBuilder no agrega bloqueos de sincronización al método, por lo que no es seguro para el hilo.
③StringBuilder y StringBuffer en común
StringBuilder y StringBuffer tienen clases de padres públicos AbstractStringBuilder (clase abstracta).
Una de las diferencias entre las clases e interfaces abstractas es que algunos métodos públicos de subclases pueden definirse en clases abstractas. Las subclases solo necesitan agregar nuevas funciones y no necesitan repetir los métodos existentes; mientras que las interfaces solo definen métodos y constantes.
Los métodos de StringBuilder y StringBuffer llamarán métodos públicos en AbstractStringBuilder, como Super.append (...). Es solo que StringBuffer agregará una palabra clave sincronizada al método y realizará sincronización.
Finalmente, si el programa no es multiproceso, entonces usar StringBuilder es más eficiente que StringBuffer.
6. La diferencia entre matrices y listas vinculadas
Ambos pertenecen a una estructura de datos
De la estructura lógica:
① La matriz debe definir una longitud fija (número de elementos) por adelantado, y no puede adaptarse al aumento dinámico y la disminución de los datos. Cuando los datos aumentan, el número de elementos puede exceder los definidos originalmente; Cuando los datos disminuyen, los desechos de la memoria serán causados; Se puede acceder directamente a la matriz de acuerdo con el subíndice.
② La lista vinculada se almacena y asigna dinámicamente, lo que puede adaptarse al aumento y disminución dinámica de datos, y puede insertar y eliminar fácilmente elementos de datos. (Al insertar y eliminar elementos de datos en la matriz, debe mover otros elementos de datos, lo cual es muy engorroso) La lista vinculada debe encontrar el siguiente elemento de acuerdo con el siguiente puntero.
Desde el almacenamiento de memoria:
① Las matrices (estáticas) asignan espacio desde la pila, que es conveniente y rápida para los programadores, pero tiene poca libertad.
② La lista vinculada asigna espacio desde el montón, que tiene mucha libertad, pero es más problemático de solicitar la gestión.
De la comparación anterior, podemos ver que si necesita acceder rápidamente a los datos y rara vez o no insertar y eliminar elementos, debe usar una matriz; Por el contrario, si necesita insertar y eliminar elementos con frecuencia, debe usar una estructura de datos de lista vinculada.
7. La diferencia entre ArrayList y LinkedList
①ArrayList implementa una estructura de datos basada en matrices dinámicas, y LinkedList se basa en una estructura de datos basada en una lista vinculada.
② Para el acceso aleatorio a Get and Set, ArrayList se siente mejor que LinkedList porque LinkedList necesita mover el puntero.
③ Para la adición y las operaciones de eliminación agregan y eliminan, LinedList tiene una ventaja relativamente porque ArrayList necesita mover datos.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.