¡Desarrollo de Android TV! Tres años de experiencia en el desarrollo de Android, un resumen de los marcos populares generales

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!

Supongo que te gusta

Origin blog.csdn.net/chayel123/article/details/114026567
Recomendado
Clasificación