Prefacio
El texto se ha incluido en mi artículo destacado de GitHub, bienvenido a Star : https://github.com/ZhongFuCheng3y/3y
A partir de hoy, yo, Sanwai, comencé oficialmente a escribir la serie de entrevistas. Le di a esta serie de entrevistas un nombre llamado "Solicite una oferta a una gran fábrica".
El último se tituló "Solicite una oferta a una gran fábrica: cómo redactar un currículum"
Por eso, este artículo se llama " Solicite una oferta a una gran empresa: enumere las preguntas de la entrevista ".
Empecemos a continuación.
Este artículo tiene una visualización de video de apoyo : https://www.bilibili.com/video/BV1nT4y1L71r/ Bienvenido a Sanlian .
Sitio de entrevistas
Entrevistador: "Preséntese brevemente"
Sanwai : "Mi nombre es Sanwai . Actualmente mantengo una cuenta pública llamada Java3y . En los últimos años, he escrito más de 300 artículos técnicos originales, casi 1000 páginas de libros electrónicos originales y mapas mentales con múltiples puntos de conocimiento. Mi visión es: Siempre que me presten atención y los terceros compañeros de clase consecutivos puedan obtener la oferta de Dachang . Mi ... "
Entrevistador: "Para, para, deja de soplar, comencemos oficialmente".
Entrevistador: "Hablemos de Java List. ¿Cuánto sabes sobre List?"
Tres ladrones: "List es una interfaz en Java. Las clases de implementación comunes son ArrayList y LinkedList. ArrayList es la más utilizada en desarrollo".
Entrevistador: "Puede hablar sobre la diferencia entre ArrayList y LinkedList por separado"
Tres ladrones: "La estructura de datos subyacente de ArrayList es una matriz y la estructura de datos subyacente de LinkedList es una lista vinculada".
Entrevistador: "Entonces ya tenemos matrices, ¿por qué usar ArrayList?"
Tres ladrones: "Una matriz nativa tiene una característica: debe crear un tamaño para ella cuando la usa, y ArrayList no la usa"
Entrevistador: "Entonces dime cómo se implementa ArrayList. ¿Por qué ArrayList no necesita crear un tamaño?"
Tres torcidos: "De hecho, este es el caso. He visto el código fuente . Cuando lo new ArrayList()
estemos, habrá una Object
matriz vacía por defecto con un tamaño de 0. Cuando agreguemos datos por primeraadd
vez, inicializaremos esta matriz con un tamaño, este El tamaño predeterminado es 10 "
Entrevistador: "Sí"
Tres torcidos: "El otro es, el tamaño de la matriz es fijo, pero el tamaño de ArrayList es variable"
Entrevistador: "¿Cómo entiendes fijo y variable? Cuéntamelo".
Tres torcidos: "Suponiendo que el tamaño de nuestra matriz dada es 10, para llenar la matriz con elementos, solo podemos agregar 10 elementos. A diferencia de ArrayList, podemos agregar 20 o 30 a ArrayList cuando lo usamos. Y aún más elementos "
Tres torcidos: "Porque ArrayList se expande dinámicamente"
Entrevistador: "Entonces, ¿cómo se logra?"
Tres ladrones: "Cada vez add
que use ArrayList , primero calculará si la matriz tiene suficiente espacio. Si el espacio es suficiente, simplemente agréguelo directamente. Si no es suficiente, entonces debe expandir".
Entrevistador: "Entonces, ¿cómo expandir? ¿Cuánto a la vez?"
Tres torcidos: "En el código fuente, hay una grow
manera de expandir la hora original cada vez 1.5
. Por ejemplo, el valor inicializado es 10. Ahora voy a ingresar el undécimo elemento y descubrí que el espacio de esta matriz no es suficiente, por lo que expandiré Hasta 15 "
Tres torcidos: "Después de expandir el espacio, se llamará arraycopy
para copiar la matriz"
Entrevistador: "Oh, sí. Entonces, ¿por qué mencionó anteriormente que ArrayList es el más utilizado en el desarrollo diario?"
Tres ladrones: "Está determinado por la estructura de datos subyacente. En el desarrollo diario, la necesidad de un recorrido es más que adiciones y eliminaciones. Incluso si las adiciones y eliminaciones se agregan a menudo al final de la Lista, está bien. Al igual que agregar elementos al final, el tiempo de ArrayList la complejidad de la misma O(1)
".
Tres errores: "La otra cosa es que las llamadas subyacentes para la adición y eliminación de ArrayList se copyOf()
han optimizado. Las CPU modernas pueden bloquear las operaciones de memoria , y la adición y eliminación de ArrayList no es más lenta que LinkedList".
Entrevistador: "¿Entiendes Vector?"
Tres torcidos: "Bueno, la estructura subyacente de Vector es una matriz. Generalmente, rara vez la usamos ahora. En comparación con ArrayList, es seguro para subprocesos. Cuando se expande, se expande directamente dos veces, por ejemplo, ahora hay 10 elementos. , Cuando desee expandir, el tamaño de la matriz aumentará a 20 "
Entrevistador: "Bueno, si no usamos Vector, ¿qué más es Lista segura para subprocesos?"
Tres torcidos: "En primer lugar, también podemos usar Colecciones para envolver ArrayList y hacerlo seguro para subprocesos. Pero esto definitivamente no es lo que quieres escuchar, ¿verdad? java.util.concurrent
También hay una clase bajo el paquete llamada CopyOnWriteArrayList"
Entrevistador: "Bueno, sigue diciendo"
Tres torcidos: "Antes de que quiera hablar sobre CopyOnWriteArrayList, todavía quiero hablar sobre copy-on-write
este significado, lo abreviaré a continuación cow
. Por ejemplo, en Linux, sabemos que todos los init
procesos fork
salen de procesos, excepto el número de proceso fork
. El valor predeterminado es exactamente el mismo que el proceso principal. Antes de fork
eso exec
, los dos procesos utilizan el mismo espacio de memoria, lo que significa que el segmento de código, el segmento de datos y la pila del proceso secundario apuntan al espacio físico del proceso principal ".
Entrevistador: "Sí"
Tres ladrones: "Cuando hay un comportamiento modificado en el proceso padre-hijo, el espacio físico correspondiente se asigna al proceso hijo. La ventaja de esto es que espera hasta que se produce la modificación real antes de asignar recursos, lo que puede reducir la asignación o copiar una gran cantidad de recursos. El retraso instantáneo causado . En pocas palabras, se puede entender como nuestra carga diferida, o el estilo de hombre perezoso del modo singleton. Se asignará cuando se utilice realmente ".
Entrevistador: "Sí"
Tres torcidos: "en el sistema de archivos, de hecho, allí cow
. El mecanismo del sistema de archivos cow
es cuando se modifican los datos, no directamente en la ubicación original de los datos de la operación, sino en un lugar para volver a modificarlos. Ejemplo: Para modificar los datos El contenido del bloque A, primero lea A y escríbalo en el bloque B. Si se corta la energía en este momento, el contenido original de A todavía está allí. La ventaja de esto es que puede garantizar la integridad de los datos y se puede restaurar fácilmente cuando se suspende instantáneamente .
Tres ladrones: "Echemos un vistazo a CopyOnWriteArrayList. CopyOnWriteArrayList es una lista segura para subprocesos. La capa inferior se implementa copiando matrices .
Tres torcidos: "Déjame hablar add()
sobre la realización de su método"
Entrevistador: "Bueno"
Tres torcidos: "En el add()
método, de hecho, él agregaría lock
un candado, luego copiaría una nueva matriz a la nueva matriz dentro de add
los elementos reales de la matriz, es el último punto que se cambiará a la nueva matriz".
Tres torcidos: "De hecho, el get()
método o size()
método es solo para obtener el elemento o el tamaño de la matriz al que apunta la matriz. La lectura no está bloqueada, la escritura está bloqueada"
Tres torcidos: "Lo que se puede encontrar es que CopyOnWriteArrayList es muy similar al mecanismo COW del sistema de archivos"
Entrevistador: "¿Entonces puede hablarnos de las desventajas de CopyOnWriteArrayList?"
Tres errores: "Obviamente, CopyOnWriteArrayList consume mucha memoria y set()/add()
se copia una matriz cada vez . Además, CopyOnWriteArrayList solo puede garantizar la coherencia final de los datos, pero no puede garantizar la coherencia en tiempo real de los datos. Supongamos que dos subprocesos, el subproceso A va La lectura de los datos de CopyOnWriteArrayList no ha terminado de leer. Ahora el hilo B ha vaciado esta Lista, el hilo A todavía puede leer los datos restantes en este momento ".
Entrevistador: "Bueno, está bien. La entrevista de hoy ha terminado. ¿Tiene algo que preguntarme?"
Sanwai: "¿Qué opinas de mi actuación de hoy?"
Entrevistador: "La actuación de hoy está bien. Si no tienes 100 Me gusta esta vez , RR.HH. no se comunicará contigo de nuevo. Si tienes más de 100 Me gusta , hazlo bien en la segunda ronda".
Entrevistador: "Te lo revelaré, la colección de mapas se puede preparar y la próxima ronda examinará el conocimiento de los mapas "
Digresión
La recopilación de listas no es demasiado difícil en general, pero es posible que muchos estudiantes aún no conozcan CopyOnWriteArrayList.
Este artículo tiene una visualización de video de apoyo : https://www.bilibili.com/video/BV1nT4y1L71r/ Bienvenido a Sanlian .
Proyectos de código abierto que cubren todos los puntos de conocimiento del backend de Java (más de 10K estrellas ya):
Soy Sanwai, un hombre que quiere volverse más fuerte. Gracias por tus Me gusta, colecciones y publicaciones. Hasta la próxima. Dale un like a Sanwai, ¡es muy importante para Sanwai!