1. O método igual é usado para comparar se o conteúdo do objeto é igual (substituído posteriormente)
2. O método HashCode é usado apenas em coleções
3. Quando o método igual é substituído, se o objeto de comparação é igual será comparado através do método sobrescrito igual (julgando se o conteúdo do objeto é igual).
4. Ao colocar um objeto em uma coleção, primeiro determine se o valor do código de hashcode do objeto a ser colocado é igual ao valor de hashcode de qualquer elemento da coleção. Se não for igual, coloque o objeto diretamente na coleção. Se os valores do código hashCode forem iguais, use o método igual para determinar se o objeto a ser colocado é igual a qualquer objeto na coleção. Se o julgamento igual não for igual, coloque o elemento diretamente na coleção, caso contrário, ele não será colocado.
5. O método Equals usa se os endereços de memória do objeto são iguais para determinar se os objetos são iguais.
Por serem dois novos objetos, os endereços de memória dos objetos não são iguais, portanto, Stu1.Equals (STU2) é falso.
6. Os threads A e B devem obter a trava do objeto O. Supondo que a adquira a trava do objeto O, B aguardará que um libere a fechadura de O. Se o sincronizado for usado, se A não for liberado, B aguardará que ele continue e não puder ser interrompido. Se o Reentrantlock for usado, se A não for lançado, B poderá interromper a espera depois de esperar por um tempo suficiente e fazer outras coisas.
Reentrantlock adquire bloqueios de três maneiras:
a) Lock (), se o bloqueio for adquirido, retorne imediatamente. Se outro thread segurar a trava, o encadeamento atual permanecerá em um estado inativo até que a trava seja adquirida.
b) Trylock (), se o bloqueio for adquirido, ele retornará verdadeiro imediatamente e, se outro thread estiver segurando a trava, ele retornará falsa imediatamente;
c) Trylock (tempo limite de longa data, unidade de unidade de tempo), se o bloqueio for adquirido, ele retornará verdadeiro imediatamente. Se outro thread estiver segurando o bloqueio, ele aguardará o tempo fornecido do parâmetro.
Durante o processo de espera, se o bloqueio for adquirido, ele retornará verdadeiro e, se o tempo limite de espera, ele retornará false;
d) LOCK INTERMUPBILIÁRIO: Se o bloqueio for adquirido, retorne imediatamente. Se o bloqueio não for adquirido, o encadeamento atual estará em um estado inativo até ou bloqueado.
Ou o tópico atual é interrompido por outro tópico
O sincronizado é implementado no nível da JVM. Não apenas o bloqueio sincronizado pode ser monitorado por meio de algumas ferramentas de monitoramento, mas as exceções também podem ocorrer durante a execução do código.
A JVM liberará automaticamente o bloqueio, mas não é possível usar o bloqueio. O bloqueio é implementado através do código. Para garantir que o bloqueio seja liberado, o desbloqueio () deve ser colocado em finalmente {}
Quando a competição de recursos não é muito feroz, o desempenho do sincronizado é melhor que o de Reetrantlock. No entanto, quando a competição de recursos é muito feroz, o desempenho do sincronizado diminuirá em dezenas de vezes, mas o desempenho do reetrantlock pode permanecer normal;
No JDK, as classes a seguir são usadas principalmente para implementar o mecanismo de reflexão Java, todos localizados no pacote java.lang.reflect:
Classe: representa uma classe.
Classe de campo: uma variável de membro que representa uma classe (as variáveis de membro também são chamadas de atributos de uma classe).
Classe de método: um método que representa a classe.
Classe de construtor: representa o método do construtor da classe.
Classe de matriz: fornece métodos estáticos para criar dinamicamente matrizes e acessar elementos da matriz.
Aqui estão alguns exemplos para ver a aplicação real da API de reflexão:
1. Obtenha variáveis de membros, métodos de membros, interfaces, superclasses, métodos construtores, etc. Através da classe de classe
O método getClass () é definido na classe java.lang.Object; portanto, para qualquer objeto Java, o tipo de objeto pode ser obtido através desse método. A aula é uma classe central na API de reflexão e possui os seguintes métodos
getName (): Obtenha o nome completo da classe.
getfields (): obtenha a propriedade do tipo público da classe.
getDecLaredFields (): obtenha todas as propriedades da classe.
getMethods (): um método para obter o tipo público da classe.
getDecLaredMethods (): obtenha todos os métodos da classe.
getMethod (nome da string, classe [] parameterTypes): obtém um método específico da classe, o parâmetro de nome especifica o nome do método, o parâmetro ParameterTypes especifica o tipo de parâmetro do método.
getConstructors (): obtenha o construtor do tipo público da classe.
getConstructor (classe [] parameterTypes): obtém o construtor específico da classe. O parâmetro ParameterTypes especifica o tipo de parâmetro do construtor.
newInstance (): crie um objeto dessa classe através do construtor da classe sem parâmetros.
Etapas para escrever um refletor Java:
1) Você deve primeiro obter o objeto de classe de uma classe
Por exemplo:
Classe C1 = test.class; Classe C2 = classe.ForName ("com.reflection.test"); Classe C3 = new test (). GetClass (); 2) Então chame os métodos no objeto de classe separadamente para obter as propriedades/métodos/construtores de uma classe
Nota: Se você deseja obter métodos/propriedades/construtores da classe normalmente, você deve se concentrar nas seguintes classes de reflexão
Campo
Construtor
Método
<Verlet-mapping> <Verlet-name> </servlet-name> <url-tattern> </url-tattern> </servlet-mapping> para (string elementar: str) {System.out.print (elemento + ""); } Lista <String> list = new ArrayList <String> (); for (int i = 0; i <str.Length; i ++) {if (! list.contains (str [i])) {list.add (str [i]); }} Set <tring> set = new HashSet <String> (); for (int i = 0; i <str.Length; i ++) {set.add (str [i]); }A primavera tem seis transações e cinco níveis de isolamento
Categoria 1: Intere curto int long
Categoria 2: Float Double
A terceira categoria: booleano lógico (possui apenas dois valores que podem ser considerados verdadeiros falsos)
Categoria 4: Char de personagem
Métodos na classe de modificação final
Função: pode ser herdado, mas não pode ser reescrito após a herança.
Classe de modificação final
Função: As classes não podem ser herdadas.
Ao modificar o tipo básico final, o valor permanece inalterado. O tipo de referência indica que o endereço permanece inalterado. Ou seja, quando novo, o endereço não pode ser transferido.
Você conhece o atributo de modificação final
A preparação é pré -compilada. Primeiro envie o SQL ao banco de dados para pré -processamento e depois coloque -o no cache. Da próxima vez que você achar que existe o mesmo, não precisa compilá -lo. A eficiência da execução é alta, existem avisos de sintaxe para facilitar a verificação e os parâmetros são dinâmicos, impedindo a injeção de SQL devido à verificação da sintaxe
Selecione * de tbname = 'zck' e passwd = 'ou' 1 '=' 1 ';
A declaração não está pré -compilada e requer verificação manual de erros de sintaxe, que é codificado
Hashmap permite nulo como uma chave ou valor de uma entrada, enquanto a hashtable não
Método de colocar
O hashmap executará processamento especial na tecla NULL Value, sempre a colocará na posição da tabela [0]. Coloque o processo é primeiro calcular o hash e calcular o valor do índice por meio de hash e tabela.length e, em seguida, colocar a chave na posição da tabela [índice]. Quando outros elementos já existem na tabela [índice], uma lista vinculada será formada na posição da tabela [índice] e os elementos recém -adicionados serão colocados na tabela [índice] e os elementos originais serão vinculados na próxima entrada. Dessa forma, o problema de conflito de hash é resolvido na forma de uma lista vinculada. Quando o número de elementos atinge o valor crítico (fator Capactiy*), a capacidade será expandida e o comprimento da matriz de tabela se torna tabela.Length*2
Obter método
Da mesma forma, quando a chave é nula, o processamento especial será realizado e o elemento com a chave é NULL é encontrado na lista vinculada da tabela [0].
O processo de get é primeiro calcular o hash e depois calcular o valor do índice por meio de hash e tabela.length, depois iterar através da lista vinculada na tabela [índice] até que a chave seja encontrada e, em seguida, retorne a implementação subjacente do HashMap e da hashtable são as implementações da estrutura da lista de matriz + Link para calcular o HASH primeiro. O índice, que é o subscrito da matriz de tabela, é calculado com base no hash e na tabela.length, é calculado e a operação correspondente é realizada.
A maioria dos índices é baseada na árvore B
Os problemas de segurança do encadeamento do servlet são causados principalmente por variáveis de instância; portanto, as variáveis de instância devem ser evitadas em servlets.
Se o design do aplicativo não puder evitar o uso de variáveis de instância, a sincronização será usada para proteger as variáveis de instância a serem usadas, mas, para o desempenho ideal do sistema, o caminho do código com disponibilidade mínima deve ser sincronizado.
Escreva um padrão de singleton
public static long -Recursive (int n) {if (n <= 0) retorna 0; if (n == 1) retornar 1; retornar recursivo (n - 1) + recursivo (n - 2);} public static Long LOOP (int n) {if (n <= 0) retornar 0; if (n == 1) retorno 1; i ++) {sum = fib1+fib2; fib1 = fib2; fib2 = sum;} retornar soma;} Hashtable é uma classe segura para threads. Ele usa sincronizado para bloquear toda a tabela de hash para atingir a segurança do encadeamento, ou seja, trava a tabela inteira toda vez e deixe o thread ocupá-lo. O ConcorrentHashMap permite que várias operações de modificação sejam executadas simultaneamente, e a chave é o uso da tecnologia de separação de bloqueio. Ele usa vários bloqueios para controlar modificações em diferentes partes da tabela de hash.
O concorrente usa segmentos (segmento) para representar essas diferentes partes. Cada segmento é na verdade uma pequena hashtable e eles têm suas próprias mechas. Desde que as operações de modificação múltiplas ocorram em diferentes segmentos, eles podem ser realizados simultaneamente.
Alguns métodos precisam cruzar segmentos, como size () e containsvalue (). Eles podem precisar travar a tabela inteira em vez de apenas um determinado segmento. Isso requer bloqueio de todos os segmentos em sequência. Após a conclusão da operação, os bloqueios de todos os segmentos são liberados em sequência. "Em ordem" é muito importante aqui, caso contrário, há uma alta possibilidade de impasse. No concorrente, a matriz do segmento é final e suas variáveis de membros são realmente finais. No entanto, simplesmente declarar a matriz como final não garante que os membros da matriz sejam finais, o que requer garantias de implementação.
Isso garante que não haja impasse, porque a ordem em que as bloqueios são obtidas é fixa
① Threadlocal ② Sincronizado () ③ Wait () e Notify () ④ Volátil
Threadlocal
O ThreadLocal garante que encadeamentos diferentes tenham instâncias diferentes e o mesmo thread deve ter a mesma instância, ou seja, cada encadeamento usando a variável fornece uma cópia do valor da variável. Cada encadeamento pode alterar independentemente sua própria cópia, em vez de conflitos com a cópia de outros threads.
Vantagens: fornece objetos compartilhados seguros para roscas
A diferença de outros mecanismos de sincronização: o mecanismo de sincronização é sincronizar o acesso simultâneo ao mesmo recurso por vários threads e se comunicar entre vários threads;
Threadlocal é um compartilhamento de dados isolado de vários threads e, fundamentalmente, não compartilha recursos entre vários threads. Isso certamente não exige que vários threads sejam sincronizados.
volátil
A variável de membro modificada volátil é forçada a reler o valor da variável de membro da memória compartilhada cada vez que for acessada por um thread. e,
Quando a variável do membro muda, o encadeamento é forçado a escrever o valor de mudança de volta à memória compartilhada.
Vantagens: Dessa maneira, a qualquer momento, dois threads diferentes sempre vêem o mesmo valor de uma determinada variável de membro.
Motivo: a especificação do idioma Java afirma que, para obter a melhor velocidade, os threads podem salvar cópias privadas de variáveis de membros compartilhados.
E é comparado apenas com o valor original da variável de membro compartilhado quando o encadeamento entra ou sai do bloco de código síncrono.
Dessa forma, quando vários threads interagem com um objeto ao mesmo tempo, é necessário prestar atenção para permitir que o thread obtenha alterações nas variáveis de membro compartilhado em tempo hábil.
A palavra -chave volátil solicita a VM: para esta variável de membro, ela não pode salvar sua cópia privada, mas deve interagir diretamente com a variável de membro compartilhado.
Dicas de uso: Use volátil em variáveis de membro acessadas por dois ou mais threads.
Não é necessário usar quando a variável a ser acessada já está no bloco de código sincronizado ou é uma constante.
Para melhorar a eficiência, um encadeamento copia uma variável de membro (como A) (como B), e o acesso a A no thread realmente acessa B. A sincronização de A e B é realizada apenas em determinadas ações, portanto, há uma situação em que A e B são inconsistentes. Volátil é usado para evitar essa situação.
A Volatile diz à JVM que as variáveis que ele modifica não retêm cópias e acessam diretamente as da memória principal (é melhor usar quando há muitas operações de leitura; a comunicação é necessária entre os threads, mas este artigo não pode fazê -lo)
Variáveis voláteis têm propriedades de visibilidade sincronizadas, mas não possuem propriedades atômicas.
Isso significa que o encadeamento pode descobrir automaticamente o valor mais recente da variável volátil. Variáveis voláteis podem ser usadas para fornecer segurança do encadeamento, mas só podem ser aplicadas a um conjunto muito limitado de casos de uso: não há restrição entre várias variáveis ou entre o valor atual de uma variável e o valor modificado.
Você só pode usar a variável volátil em vez de bloqueios em casos limitados. Para tornar a variável volátil segurança ideal, as duas condições a seguir devem ser atendidas ao mesmo tempo:
As operações de gravação para variáveis não dependem do valor atual; A variável não está incluída no invariante com outras variáveis.
sono () vs espera ()
O sono é uma classe de thread (encadeamento), que faz com que esse thread pause a execução por um tempo especificado e envie a oportunidade de execução para outros threads, mas o status de monitoramento permanece e será retomado automaticamente depois disso. Chamar o sono não soltará o bloqueio do objeto.
Espera é um método da classe de objeto. Chamar o método de espera neste objeto faz com que o thread desista do bloqueio do objeto e insira o pool de bloqueio de espera esperando por esse objeto. Somente após a emissão de um método Notify (ou NotifyAll) para esse objeto, este thread entra no pool de bloqueio do objeto e se prepara para obter o bloqueio do objeto e entra no estado em execução. (Se a variável for declarada como volátil, será consistente com a memória principal toda vez que for acessada; se a variável for acessada em um método síncrono ou bloco síncrono, a variável será sincronizada quando o bloqueio é obtido na entrada do método ou bloco e a trava é liberada quando o método ou o bloco exite.)
http://www.yjbys.com/news/202750.html
O programa do cliente precisa obter primeiro uma função de contêiner específica e, em seguida, obter uma função de iterador específica por meio da função de contêiner específica.
Iterator it = new ArrayList.iterator ();
1) Acesse o conteúdo de um objeto de contêiner sem expor sua representação interna.
2) Suporte a múltiplas travessias de objetos de contêiner.
3) Forneça uma interface unificada (iteração polimórfica) para atravessar diferentes estruturas de contêineres.
Use a nova palavra -chave} → o construtor foi chamado
Use o método de NewInstance da classe} → o construtor foi chamado
Use o método de NewInstance da classe construtora} → A função do construtor foi chamada
Usando o método clone} → nenhum construtor é chamado
Usando a deserialização} → nenhum construtor é chamado
Funcionário emp2 = (funcionário) classe.formaName ("com.employee"). NewInstance (); ou
Funcionário emp2 = funcionário.class.newInstance (); construtor construtor = funcionário.class.getConstructor (); Funcionário emp3 = construtor.newInstance ();
Usando o método do clone, precisamos primeiro implementar a interface cloneável e implementar o método clone definido por ele
Funcionário emp4 = (funcionário) emp3.clone ();
Quando o programa é iniciado, ele não carrega todos os arquivos de classe a serem usados pelo programa de uma só vez. Em vez disso, carrega dinamicamente um determinado arquivo de classe na memória através do mecanismo de carregamento da classe Java (ClassLoader) de acordo com as necessidades do programa. Portanto, somente depois que o arquivo de classe é carregado na memória, ele pode ser referenciado por outras classes. Portanto, o ClassLoader é usado para carregar dinamicamente os arquivos da classe na memória.
Bootstrap Classloader: é chamado de carregador de classe de inicialização, é o carregador de classe de nível superior na hierarquia de carregamento da classe Java, responsável pelo carregamento de bibliotecas de classes principais no JDK, como: rt.jar, rumores de rumos, all-jar, carregamento de carregamento de carregamento de carregamento de carregamento de carregamento de carregamento de carregamento de carregamento, liberting liberting jad, etc. Java_home/jre/lib/ext/por padrão.
App ClassLoader: é chamado de carregador de classe do sistema, responsável por carregar todos os frascos e arquivos de classe no diretório do Application ClassPath.
Como isso pode evitar o carregamento repetido, quando o pai carregar a classe, não há necessidade de o carregador de classe infantil carregá -lo novamente.
Considerando os fatores de segurança, vamos imaginar que, se não usarmos esse modo de delegado, podemos substituir dinamicamente os tipos definidos na API Java Core a qualquer momento, o que representará um risco de segurança muito grande. O método do delegado pai pode evitar essa situação, porque a sequência já está carregada pelo carregador de classe de inicialização (bootstrcp Classloader) na inicialização, para que o carregador de classe definido pelo usuário nunca possa carregar uma string escrita por si mesma, a menos que você altere o algoritmo padrão da classe de pesquisa de classe no JDK.
1. Solicitar solicitação do cliente Objeto, essa solicitação conterá parâmetros da solicitação GET/POST, e só pode entender as necessidades do cliente e depois responder.
2. Informações relevantes sobre o objeto de resposta respondem às solicitações dos clientes
3. Objeto de sessão refere -se a uma sessão entre o cliente e o servidor, começando de uma aplicação da web do cliente para o servidor até que o cliente esteja desconectado do servidor.
4. O objeto OUT é uma instância da classe JSPWriter e é um objeto comumente usado para produzir conteúdo para o cliente.
5. O objeto da página está apontando para a própria página JSP atual, que é um pouco como esse ponteiro da classe. É uma instância da classe Java.lang.Object
6. O objeto de aplicativo realiza o compartilhamento de dados entre os usuários e pode armazenar variáveis globais. Começa com a inicialização do servidor até que o servidor seja desligado
7. Objeto de exceção é um objeto de exceção. Quando ocorre uma exceção durante o processo em execução, esse objeto é gerado.
8. O objeto PageContext fornece acesso a todos os objetos e namespaces na página JSP
9. O objeto de configuração é usado pelo mecanismo JSP para transmitir informações quando um servlet é inicializado.
JS tem uma função isnan (val) // se for um número, retorna falsa
Existem XMLDOM Parsing, Sax Parsing e Stax Parsing
XMLDOM: (xmldocumentObjectModel) O desempenho se deteriora muito ao processar arquivos grandes. Esse problema é causado pela estrutura da árvore Dom, que ocupa muita memória, e o DOM deve carregar o documento inteiro na memória antes de analisar o arquivo, que é adequado para acesso aleatório ao XML;
SAX: (SimpleApiforxml) Ao contrário do DOM, o Sax é um método de análise XML acionado por eventos. Ele lê arquivos XML em sequência e não exige que o arquivo inteiro seja carregado de uma só vez. Ao encontrar um evento como o início de um arquivo, o final de um documento ou o início de uma tag e o final de uma tag, ele aciona um evento em que o usuário processa o arquivo XML escrevendo código de processamento em seu evento de retorno de chamada, adequado para acesso sequencial ao XML;
Stax: A diferença entre (StreamingApiforXML) e outros métodos é que os aplicativos podem lidar com XML como um fluxo de eventos, o que é melhor do que outros métodos em termos de desempenho e disponibilidade;
Thread.getState ()
O exposto acima são as perguntas da entrevista em Java compiladas pelo editor para você. Espero que eles sejam úteis para você. Se você tiver alguma dúvida, deixe -me uma mensagem. O editor responderá a você a tempo!