Vamos ver um resultado de teste primeiro:
/*public static void main (string [] args) {inteiro a = 128, b = 128; Número inteiro c = 127, d = 127; System.out.println (a == b); // false System.out.println (c == d); // true}*//*public static void main (string [] args) {integer int1 = integer.valueof ("100"); Inteiro int2 = Integer.ValueOf ("100"); System.out.println (int1 == int2); // true}*/public static void main (string [] args) {integer int1 = integer.valueof ("300"); Inteiro int2 = Integer.ValueOf ("300"); System.out.println (int1 == int2); // false}O código -fonte do JDK é o seguinte:
Public estático Inteiro Valorof (strings S) lança NumberFormatexception {return integer.valueof (parseint (s, 10)); } public static integer valueof (int i) {if (i> = Integercache.low && i <= Integercache.high) Retorne Integercache.cache [i + (-Integercache.low)]; devolver novo número inteiro (i); }Descobri que havia outro mistério por dentro, e havia uma classe Integercache:
classe estática privada integercache {estático final int baixo = -128; estático final int alto; Cache inteiro final estático []; estático {// Alto valor pode ser configurado pela propriedade int h = 127; String integegercacheHighPropValue = Sun.misc.vm.getSavedProperty ("java.lang.integer.integercache.high"); if (integercacheHighPropValue! = null) {try {int i = parseInt (integercacheHighPropValue); i = math.max (i, 127); // O tamanho máximo da matriz é inteiro.max_value h = math.min (i, integer.max_value -(-low) -1); } catch (númeroFormatexception nfe) {// Se a propriedade não puder ser analisada em um int, ignore -o. }} alta = h; 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 ++); // intervalo [-128, 127] deve ser internalizado (JLS7 5.1.7) assert integercache.high> = 127; } private integercache () {}}Acontece que o número inteiro instancia todos os números inteiros de -128 a 127 (ajustável).
Isso explica a resposta. Acontece que, não importa quantos números inteiros você crie nesse intervalo, todos eles usam o ValueOF para produzir o mesmo objeto.
Mas por que o JDK tem que fazer tanto dessa maneira? Vamos pensar sobre isso com cuidado. A maioria dos produtos da Taobao tem preços abaixo de 100 yuan. Quantos números inteiros serão usados no servidor de back -end em um dia? Usando o IntegerCache, reduz o tempo para obter novos e melhora a eficiência. Ao mesmo tempo, o JDK também fornece cache de alto valor configurável.
Isso, sem dúvida, melhora a flexibilidade e facilita a otimização da JVM.
Resumir
O exposto acima é todo o conteúdo deste artigo sobre a leitura do código -fonte inteiro inteiro, espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!