Class Integer

7 respostas
dntalemao

Galera, surgiu uma dúvida aqui quando eu estava usando a class Integer, percebi que existem duas maneiras de armazenar um inteiro, na 1ª maneira utilizei o método static valueOf e não foi preciso adicionar o comando new, por que não é preciso? A variável id não é uma variável de referência?

Exemplo:

// 1ª maneira

Integer id= Integer.valueOf(10);

// 2ªmaneira

Integer id= new Integer(10);

Qual a diferença dos dois?

Obrigado!
Abraço,

7 Respostas

renanjp

O método estático valueOf serve para converter valores para Integer…

Se você olhar atentamente na documentação ou no próprio auto complete de sua IDE, vai perceber que este método tem varias sobrecargas…

Uma delas é a sobrecarga que é parametrizada por String’s

Integer i = Integer.valueOf("10");
Rodrigo_Sasaki

Acontece que a classe Integer tem um cache dos ints mais requisitados, e se você usar o método estático valueOf ele pode ou te retornar uma referência desse cache, ou instanciar uma nova, com um new.

Se você precisa garantir que seu Integer terá uma referência nova por algum motivo, use o construtor, mas se for indiferente, use o método estático, ele pode te dar uma performance melhor, por causa do cache.

Leia o que a documentação diz sobre o método.

CristianPalmaSola10

Olhei a documentação e la diz que este metodo executa esse codigo

new Integer(Integer.parseInt(s))

portanto como ja era de se imaginar o metodo faz o new para voce

link da documentacao

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html#valueOf(java.lang.String)

Rodrigo_Sasaki

CristianPalmaSola10:
Olhei a documentação e la diz que este metodo executa esse codigo

new Integer(Integer.parseInt(s))

portanto como ja era de se imaginar o metodo faz o new para voce

link da documentacao

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html#valueOf(java.lang.String)

É quase isso, a documentação diz que o valor retornado é igual ao código que você postou, mas não quis dizer que esse código será sempre executado.

Como eu disse, existe aquele cache.

Se você decompilar a classe Integer, vai ver melhor o que o código faz:public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10)); }

lina

Oi,

Tudo está relacionado a alocação de memoria. Quando você dá um NEW, você trabalha com memoria alocada. Já o valueOf, funciona exatamente igual a explicação de digaoneves.

/** * Returns a <tt>Integer</tt> instance representing the specified * <tt>int</tt> value. * If a new <tt>Integer</tt> instance is not required, this method * should generally be used in preference to the constructor * {@link #Integer(int)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * * @param i an <code>int</code> value. * @return a <tt>Integer</tt> instance representing <tt>i</tt>. * @since 1.5 */ public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }

Tchauzin!

renanjp

digaoneves:
Acontece que a classe Integer tem um cache dos ints mais requisitados, e se você usar o método estático valueOf ele pode ou te retornar uma referência desse cache, ou instanciar uma nova, com um new.

Se você precisa garantir que seu Integer terá uma referência nova por algum motivo, use o construtor, mas se for indiferente, use o método estático, ele pode te dar uma performance melhor, por causa do cache.

Leia o que a documentação diz sobre o método.

Poxa que legal, não sabia deste cache…

dntalemao

poxa bem legal a explicação de vcs, deu para entender legal. agradeço muito a ajuda!

Criado 19 de julho de 2012
Ultima resposta 19 de jul. de 2012
Respostas 7
Participantes 5