Prefacio
Desde que me gradué en 18 años, he trabajado para dos empresas y he realizado algunos proyectos grandes y pequeños. Estoy muy agradecido con mis dos jefes por brindarme mucha orientación sobre mi camino de crecimiento de Android y la relación entre profesores y amigos.
He participado en entrevistas con muchas empresas desde hace años, y también he recibido ofertas de varios gigantes, así como de otras empresas. Resumir la experiencia también es una revisión y un resumen del pasado.
Red: modelo en capas, TCP, UDP, HTTP, HTTPS
Modelo jerárquico
- Capa de aplicación: responsable de manejar detalles específicos de la aplicación, como HTTP, FTP, DNS
- Capa de transporte: proporcione comunicación básica de un extremo a otro para dos hosts, como TCP, UDP
- Capa de red: controla la transmisión de paquetes, el enrutamiento, etc., como IP
- Capa de enlace: controladores de dispositivo del sistema operativo, interfaces relacionadas con la tarjeta de red
UDP
- Estructura de encabezado UDP: puerto de origen, puerto de destino, campo de longitud, suma de comprobación
- Características: poco confiable, desordenado, orientado a mensajes, rápido, liviano
- Escenarios aplicables: adecuado para mensajería instantánea, videollamadas, etc.
- Aplicación: DHCP, DNS, QUCI, VXLAN, GTP-U, TFTP, SNMP
TCP
- Estructura del encabezado TCP: puerto de origen, puerto de destino, número de secuencia, número de secuencia de confirmación, SYN / ACK y otros bits de estado, tamaño de ventana, suma de comprobación, puntero de emergencia
- Características: Orientado al flujo de bytes, con control de congestión y flujo, confiable, ordenado, lento y pesado. El control de flujo y control de congestión se realiza a través de ventana deslizante
- Escenarios aplicables: transferencia de archivos, navegador, etc.
- 应用 : HTTP 、 HTTPS 、 RTMP 、 FTP 、 SMTP 、 POP3
- Tres apretón de manos:
1\. C->S:SYN,seq=x(你能听到吗?)
2\. S->C:SYN,seq=y,ack=x+1(我能听到,你能听到吗?)
3\. C->S:ACK,seq=x+1,ack=y+1(我能听到,开始吧)
两方都要能确保:我说的话,你能听到;你说的话,我能听到。所以需要三次握手
复制代码
- Salude cuatro veces:
1\. C->S:FIN,seq=p(我说完了)
2\. S->C:ACK,ack=p+1(我知道了,等一下,我可能还没说完)
3\. S->C:FIN,seq=q,ACK,ack=p+1(我也说完了)
4\. C->S:ACK,ack=q+1(我知道了,结束吧)
S 收到 C 结束的消息后 S 可能还没说完,没法立即回复结束标示,只能等说完后再告诉 C :我说完了
复制代码
HTTP
- Protocolo de transferencia de hipertexto, transmisión de texto claro, puerto predeterminado 80
- POST y GET: los parámetros de obtención se colocan en la URL; los parámetros de publicación se colocan en el cuerpo de la solicitud
- Proceso de acceso a la página web: resolución de nombre de dominio DNS, protocolo de enlace de tres vías TCP para establecer una conexión, iniciar solicitud HTTP
HTTPS
- El puerto predeterminado es 443 y los datos de transmisión HTTP se cifran mediante el protocolo SSL, que es seguro.
- Proceso de encriptación: Cliente / Servidor genera una clave a través de encriptación asimétrica y luego usa esta clave para encriptar simétricamente los datos de transmisión.
Algoritmos: estructura de datos, algoritmos de uso común
estructura de datos
- Matriz, lista vinculada
- Pila, cola
- Tabla de picadillo
- Árbol, pila, figura
Algoritmos de uso común
- Clasificar
- Puntero doble, ventana corrediza, cuerda
- Recurrencia, divide y vencerás, dicotomía
- Planificación dinámica, codiciosa y retrocedida
Conceptos básicos de Java: StringBuilder, borrado genérico, Excepción, IO, contenedor
StringBuilder
- StringBuffer es seguro para subprocesos, StringBuilder no es seguro para subprocesos
- + De hecho, lo realiza StringBuilder, por lo que el cuerpo sin bucle se puede usar directamente +, pero el cuerpo del bucle no puede, porque StringBuilder se creará con frecuencia
- String.concat es esencialmente un String nuevo, que es ineficiente y requiere mucho tiempo para ordenar: StringBuilder <StringBuffer <concat <+
Borrado genérico
- Los genéricos relacionados con la estructura de la clase, como las variables miembro modificadas, no se borrarán
- Los contenedores genéricos se borrarán
Excepción 和 Error
- Tanto la excepción como el error heredan de Throwable
- Error se refiere principalmente a estados de error irrecuperables, como OOM, por lo que no es necesario capturar
- Excepción 分为 CheckedException 和 UnCheckedException
- CheckedException: debe ser detectado y verificado explícitamente por el compilador, como las operaciones io
- UnCheckedException: no es necesario mostrar la captura, como un puntero nulo, una matriz fuera de los límites, etc.
IO 、 NIO 、 OKIO
- IO está orientado a la transmisión, procesando un byte a la vez, NIO está orientado al búfer, generando o consumiendo un bloque de datos a la vez
- IO está bloqueando, NIO no está bloqueando
- NIO admite mapeo de memoria
- En comparación con io y nio, okio tiene una API más simple y fácil de usar
- okio admite el mecanismo de tiempo de espera
- okio introduce el espacio ByteString para el tiempo para mejorar el rendimiento
- Okio utiliza el mecanismo de segmento para compartir memoria, lo que ahorra el consumo de tiempo de copia
ArrayList 、 LinkedList
- Lista de arreglo
- Basado en la implementación de la matriz, búsqueda rápida: o (1), adición y eliminación lentas: o (n)
- La capacidad inicial es 10 y la capacidad se amplía mediante el método System.arrayCopy
- Lista enlazada
- Realización basada en lista doblemente enlazada, búsqueda lenta: o (n), adición y eliminación rápidas: o (1)
- Encapsula llamadas a colas y pilas
HashMap 、 HashTable 、 HashSet
-
HashMap (permitir que la clave / valor sea nulo)
- Según la implementación de matrices y listas vinculadas individualmente, la matriz es el cuerpo principal del HashMap; la lista vinculada existe para resolver conflictos de hash y almacena la entidad que combina la clave y el valor.
- El índice de la matriz se obtiene mediante key.hashCode (también con hash dos veces) y se indexa mediante key.equals en la lista vinculada
- Cuando la colisión de hash cae en el mismo cubo, se coloca directamente al principio de la lista vinculada (después de java1.8, se coloca al final)
- Cuando el número de listas enlazadas en JAVA 8 es mayor que 8, se convertirá en almacenamiento de árbol rojo-negro y el tiempo de búsqueda cambiará de O (n) a O (logn)
- La longitud de la matriz es siempre 2 elevado a la potencia de n: de esta manera, el resto se puede lograr mediante operaciones de bits, de modo que el índice puede caer dentro del rango de la longitud de la matriz.
- El factor de carga (predeterminado 0,75) indica la proporción de llenado que se agrega para la expansión. La proporción de llenado es grande: la lista vinculada es más larga y la búsqueda es lenta; la proporción de llenado es pequeña: la lista vinculada es corta y la búsqueda es rápido
- Al expandir la capacidad, cree directamente el doble de la longitud de la matriz original y luego hash el objeto original para encontrar el nuevo índice y reubicarlo
-
HashTable (la clave / valor no puede ser nulo)
- La estructura de datos es la misma que HashMap
- A salvo de amenazas
-
HashSet
- Basado en la implementación de HashMap, el elemento es la clave de HashMap, y Value se pasa en un valor fijo
ArrayMap 、 SparseArray
-
ArrayMap
- Implementación basada en dos matrices, una para almacenar hash y otra para almacenar pares clave-valor
- La matriz que almacena el hash está ordenada y la búsqueda binaria se usa cuando se busca
- Cuando ocurre un conflicto de hash, la matriz de pares clave-valor se almacena continuamente y la búsqueda también se indexa por key.equals. Cuando no se encuentra, la matriz de pares clave-valor con el mismo valor hash se recorre hacia atrás y luego hacia adelante .
- Al expandir la capacidad, a diferencia de HashMap directamente al doble, la utilización de la memoria es alta; no hay necesidad de reconstruir la tabla hash, simplemente llame a system.arraycopy array copy, que tiene un mayor rendimiento
- No es adecuado para almacenar grandes cantidades de datos (por debajo de 1000), porque la búsqueda binaria es mucho más lenta que los árboles rojo-negro cuando la cantidad de datos es grande
-
SparseArray
- Según ArrayMap, la clave solo puede ser de un tipo específico
Colección concurrente
- ConcurrentHashMap
- La estructura de datos es la misma que HashMap, o una matriz más una lista vinculada
- Usando tecnología de bloqueo de segmento, a diferencia de HashTable, que sincroniza directamente las operaciones de colocación y obtención sin cerebro
- La operación de obtención no está bloqueada, porque el valor se modifica con volátil para garantizar filas visibles y el rendimiento es muy alto
- Después de java1.8, se elimina el bloqueo de segmento y se usa el bloqueo optimista CAS más sincronizado para lograr
Principio LRUCache
- Implementación de LinkedHashMap en función del orden de acceso, el más recientemente accedido se clasificará en último lugar
Por fin
Teniendo en cuenta la extensión del artículo, hice estas preguntas y respuestas, así como las preguntas que encontré en muchos años de entrevistas, y algunos materiales de la entrevista en documentos PDF. Si necesita un amigo, puede enviarme un correo privado [Entrevista ] para recibirlo gratis
Haga clic aquí para recibir un resumen de los materiales de la entrevista de Android
BC% 9F% E5% A6% 82% E4% BD% 95% E9% 9D% A2% E8% AF% 95% E6% 8B% BF% E9% AB% 98% E8% 96% AA% EF% BC% 81.md) **
[Las imágenes del enlace externo se están transfiriendo ... (img-5FWI5KPr-1614154915374)]
[La imagen del enlace externo se está transfiriendo ... (img-OQJb2MiB-1614154915378)]
Los amigos a los que les guste pueden seguir, reenviar y dar me gusta ¡gracias!