Vamos dar uma olhada em um pedaço de código:
classe pública principal {public static void main (string [] args) {integer num1 = 100; Inteiro num2 = 100; Inteiro num3 = 200; Inteiro num4 = 200; '' '// resultado de saída' '' System.out.println (num1 == num2); System.out.println (num3 == num4); }} Adivinha qual é o resultado?
Muitas pessoas pensam que o resultado é verdadeiro, mas o resultado não é assim.
verdadeiro
falso
Por que esse resultado é? Se o resultado for explicado pela memória, num1 e num2 apontam para o mesmo objeto, enquanto o num3 e o num4 apontam para diferentes objetos. Em seguida, vamos lhe dizer o porquê, dê uma olhada no código -fonte do método ValueOf Dype Integer:
public static integer valueof (int i) {assert integercache.high> = 127; if (i> = Integercache.low && i <= Integercache.high) retorna Integercache.cache [i + 128]; devolver novo número inteiro (i); }A implementação do Integercache:
'' '// integercache, uma classe interna, observe que suas propriedades são definidas como final estático' '' private estática Integercache {estática final int alta; '' '// Cache Limite superior, temporariamente nulo' '' Cache inteiro final estático []; '' '// Array inteiro de cache' '' '' // Bloco, por que é definido como bloco '' estático {final int low = -128; '' '// Cache o limite inferior, imutável. Somente o limite superior pode alterar '' '' '' // Alto valor pode ser configurado por propriedade '' '' '// h, que pode ser ajustado definindo o parâmetro AutoBoxCachemax do JDK (há uma explicação abaixo) e o intervalo de cache automático é definido como [-128, n]. Observe que o limite inferior do intervalo é fixo int h = 127; if (integercachehighpropvalue! = null) {'' '// use long.decode aqui para evitar a invocação de métodos que' '' '' '' // exigem o cache de auto -bóxido do número inteiro para ser inicializado '' '//, decodificando o integro -altere Long.Decode (IntegerCacheHighPropValue) .IntValue (); '' '// pega o maior como o limite superior, mas não pode ser maior que o limite do número inteiro max_value' '' i = math.max (i, 127); '' '// O tamanho máximo da matriz é inteiro.max_value' '' h = math.min (i, integer.max_value - -low); } alta = h; '' '// O limite superior é determinado' '' '' '// Você pode criar um bloco de cache, prestar atenção ao tamanho da matriz de cache' '' cache = novo número inteiro [(alto - baixo) + 1]; // int j = baixo; for (int k = 0; k <cache.length; k ++) cache [k] = novo número inteiro (j ++); '' '// -128 a valores altos são alocados para cache a matriz um por um' ''} private integercache () {}}Através dessas duas peças de código, pode-se observar que, ao criar um objeto de tipo inteiro através do método ValueOf, o intervalo de valor é [-128, 127]. Nesse intervalo, o ponteiro aponta para uma referência de objeto já existia no Integercache.cache. Quando o valor exceder esse intervalo, um novo objeto será criado.
Uma coisa a observar é que nem todos os tipos estão nesse intervalo, observe o tipo duplo:
classe pública principal {public static void main (string [] args) {duplo i1 = 100.0; Duplo i2 = 100,0; Duplo i3 = 200,0; Duplo i4 = 200,0; System.out.println (i1 == i2); System.out.println (i3 == i4); }}Resultado da saída final:
falso
falso
Pelo motivo específico pelo qual esse é o resultado, você pode verificar a implementação do método duplo ValueOf no código -fonte. É diferente do método inteiro do método porque o número de valores inteiros em um determinado intervalo é limitado, mas os números de ponto flutuante não são.
Observe que a implementação dos métodos Valueof de número inteiro, curto, byte, caráter e longo é semelhante.
A implementação do método ValueOf de dupla e flutuação é semelhante.
Puxe um para baixo, e os resultados do tipo booleano têm dois verdadeiros ou falsos. Olhe diretamente para o código -fonte:
public static boolean valueof (booleano b) {return (b? true: false); }Os verdadeiros e falsos são definidos da seguinte maneira:
public estático final booleano true = novo booleano (true); '' '/**' '' '' '** o objeto <code> boolean </code> correspondente ao primitivo' '' '' ''* valor <Code> false </code>. '' '' '' '**/' '' '' '' '' '' public static final boolean false = new boolean (false);
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.