minhas informações de contato
Correspondência[email protected]
2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
A camada inferior do ArrayList é implementada com base em arrays. Isso é feito expandindo ou reduzindo dinamicamente o tamanho do array. Quando a capacidade não for suficiente, ele criará um array maior, copiará os dados originais e, finalmente, adicionará os novos dados a ele.
O mecanismo de expansão do ArrayList é: quando o primeiro elemento é adicionado, a capacidade do ArrayList é 10 cada vez que um novo elemento é adicionado, se a capacidade for ultrapassada, a capacidade original será duplicada, ou seja, a capacidade original * 2; , se a capacidade original for 0, a nova capacidade será 1.
A implementação interna de ArrayList é baseada em arrays. Quando vários threads acessam o mesmo ArrayList ao mesmo tempo, pode ocorrer inconsistência de dados. Por exemplo, quando um thread está lendo os dados do ArrayList e outro thread está adicionando/excluindo dados. no ArrayList, pode haver alteração dos dados no ArrayList, para que o thread que lê os dados do ArrayList possa ler dados incorretos, causando um erro no programa.
A pilha é uma tabela linear especial. Sua característica é que os dados só podem ser inseridos e excluídos em uma extremidade, com base no princípio primeiro a entrar, último a sair, último a entrar, primeiro a sair. É uma estrutura de armazenamento que pode ser usada para armazenar valores de parâmetros de função, variáveis locais, etc.
Um heap é uma estrutura de árvore especial caracterizada pelo fato de que os valores de todos os nós são maiores ou iguais aos valores de seus nós filhos e o valor do nó raiz é o maior ou o menor. O heap é uma estrutura de armazenamento dinâmica que pode ser usada para armazenar grandes quantidades de dados, como classificação, pesquisa, etc.
A essência de uma corrotina é um thread leve. Cada corrotina possui uma pilha para armazenar funções e seus parâmetros, variáveis locais, etc. A corrotina pode ser suspensa, retomada e trocada.
Sincronização de estado Refere-se à transmissão do status (como posição, velocidade, aceleração, etc.) de cada máquina do sistema multimáquina para outras máquinas em cada ciclo de controle, para que cada máquina permaneça sincronizada. A sincronização de estado pode alcançar o desempenho em tempo real do controle colaborativo de várias máquinas, mas como uma grande quantidade de dados precisa ser transmitida em cada ciclo de controle, sua precisão pode ser relativamente baixa.
Sincronização de quadros Isso significa que em cada ciclo de controle, os comandos de controle de cada máquina do sistema multimáquina são transmitidos para outras máquinas para que cada máquina permaneça sincronizada. A sincronização de quadros pode atingir a precisão do controle colaborativo de várias máquinas, mas como apenas um pequeno número de comandos de controle é transmitido em cada ciclo de controle, seu desempenho em tempo real pode ser relativamente baixo.
A camada inferior do HashMap é implementada usando uma lista vinculada de array (árvore vermelha e preta). Ela armazena dados de acordo com o valor hashCode da chave. Ele pode calcular a posição dos dados na matriz (conflito de hash) com base no hash. código e usa uma lista vinculada (árvore vermelha e preta) para armazenar os conflitos. HashMap Em Java 8, quando o comprimento da lista vinculada exceder o limite (o padrão é 8), ela será convertida em uma árvore vermelha e preta para melhorar a eficiência da consulta.Quando a capacidade não for suficiente, ela será expandida automaticamente. O fator de carga padrão é 0,75 e o método de expansão é 2 vezes a capacidade.
Quais são os cenários de uso de pilhas e filas?
As funções de avanço e retrocesso do navegador: As páginas da web visitadas pelo navegador podem realizar as funções de avanço e retrocesso por meio da estrutura de dados da pilha.
O problema TCP sticky refere-se ao fato de que o protocolo TCP não fragmenta os dados ao transmiti-los, fazendo com que a quantidade de dados recebidos pelo terminal receptor seja maior do que a quantidade de dados enviados pelo terminal emissor.
Em primeiro lugar, os datagramas UDP podem ajudar a implementar o processo de handshake triplo no protocolo TCP/IP. No primeiro handshake, um cliente envia um datagrama UDP contendo uma solicitação de handshake. Ao receber esta mensagem, o servidor responderá com uma mensagem de confirmação, indicando que o servidor recebeu a solicitação de handshake do cliente e está pronto para fornecer serviços. No segundo handshake, o cliente enviará novamente um datagrama UDP. Desta vez a mensagem contém algumas informações úteis, como endereço IP do cliente, número da porta, etc., para que o servidor possa identificar o cliente. No terceiro handshake, o servidor enviará um datagrama UDP indicando que a conexão foi estabelecida e o cliente pode iniciar o envio de dados.
Em segundo lugar, os datagramas UDP também podem ajudar a realizar o processo de transmissão de dados no protocolo TCP/IP. Quando o cliente precisar enviar dados ao servidor, os dados serão encapsulados em um datagrama UDP e enviados ao servidor após o servidor receber o datagrama UDP, ele analisará os dados contidos na mensagem e realizará o processamento relacionado;
Finalmente, os datagramas UDP também podem ajudar a implementar o processo de encerramento da conexão no protocolo TCP/IP.Quando o cliente não precisar mais se comunicar com o servidor, ele poderá enviar um datagrama UDP para indicar que o cliente está encerrando a conexão. Após o servidor receber esta mensagem, ele liberará os recursos correspondentes, completando assim todo o protocolo TCP/IP. processo de conexão
As corrotinas permitem que os programas alternem entre diferentes tarefas, melhorando assim a eficiência do programa e reduzindo o tempo de execução do programa. As corrotinas permitem que um programa alterne entre várias tarefas em vez de esperar que uma tarefa seja concluída antes de iniciar outra. Ele também pode compartilhar variáveis entre diferentes threads, reduzindo assim o tempo de execução do programa. Para aplicativos multitarefa, o uso de corrotinas pode melhorar significativamente o desempenho, resultando em velocidades de execução mais rápidas.
Matrizes são mais rápidas, porque o endereço de cada elemento da matriz é contínuo e fixo, e o endereço do próximo elemento pode ser obtido rapidamente, enquanto o endereço de cada elemento da lista vinculada é descontínuo e você precisa percorrer o ponteiro para obter o endereço do próximo elemento, para que o array Traversing seja mais rápido.
Uma função virtual é uma função especial que difere das funções comuns porque é definida automaticamente pelo compilador e pode ser chamada em tempo de compilação. A característica de uma função virtual é que sua implementação é determinada em tempo de execução e não em tempo de compilação.
O principal objetivo das funções virtuais é alcançar o polimorfismo. Uma classe abstrata pode definir múltiplas funções virtuais e então suas subclasses podem implementar essas funções.
Não precisa ser uma função virtual, mas geralmente é recomendado usar uma função virtual, porque uma função virtual pode ser substituída por uma classe derivada, para que o destruidor da classe derivada possa ser executado corretamente se uma função virtual. não for usado, o destruidor da classe derivada não será chamado, o que pode causar problemas como vazamentos de memória.
O pipeline de renderização é uma série de etapas usadas para converter dados da cena do jogo de informações de entrada em imagens exibidas na tela.
O processo do pipeline de renderização é dividido em três etapas principais: etapa de preparação, etapa de geometria e etapa de iluminação.
Na fase de preparação, o motor de jogo carrega os modelos e texturas da cena do jogo na unidade de processamento gráfico (GPU) e organiza os dados para uso nas fases subsequentes.
Durante o estágio de geometria, transformações de matriz são usadas para colocar o modelo no espaço tridimensional e converter o modelo em uma forma que possa ser suportada por pixels na tela.
Na fase de iluminação, a fonte de luz e o modelo de iluminação são usados para calcular o valor da cor de cada pixel, e a imagem resultante é finalmente exibida na tela.
As condições para o algoritmo ganancioso obter a solução ótima são a "subestrutura ótima" e a "propriedade de seleção gananciosa":