diferença entre primitivo e wrapper classes?

Olá pessoal estou aqui estudando, e não entendi qual a diferença entre:

1 - int x = 1;

2 - Integer x = new Integer(1);

Qual é a diferença de criar uma variável da primeira forma e da segunda?
Quando usar uma e quando usar a outra?

A primeira é a definição de uma variável de um tipo primitivo (int), que foi preenchida com um valor (1).

A segunda é a definição de uma variável de tipo “referência para um objeto da classe java.lang.Integer”, que foi inicializada para apontar para um objeto que pertence à classe java.lang.Integer cujo construtor recebeu o valor 1.

[quote=thingol]A primeira é a definição de uma variável de um tipo primitivo (int), que foi preenchida com um valor (1).

A segunda é a definição de uma variável de tipo “referência para um objeto da classe java.lang.Integer”, que foi inicializada para apontar para um objeto que pertence à classe java.lang.Integer cujo construtor recebeu o valor 1.
[/quote]

Hun… tá… desculpe mas não entendi rs eu posso usar as duas para fazer a mesma coisa? ou posso fazer algo com uma q nao pode ser feito com a outra?

1 curtida

São bem diferentes.

As classes wrapper são objetos e são mantidas no heap enquanto que as variáveis locais preservadas na pilha.

As variáveis primitivas são mais rapidas e consomem menos memória os objetos permitem operações mais complexas como conversão de tipo, “key” em HashMap etc.

O java já foi bastante criticado por ter primitivos, mas eles são muito eficientes em laços e expressões.

Quando usar um e quando usar outro?

em propriedades das classes de preferência a objetos, em métodos locais de preferência para primitivos. É um começo até você compreender outro conceito correlato: passagem de parâmetro.

Em java primitivos são passados por valor e objetos por referência (apenas para simplificar o entendimento).

certo?

:lol:

1 curtida

então:

class Teste {

 int x;
 int y

 void metodo(){
     int z=0;
 }

}

deveria ser:

 Integer x = new Integer();
 Integer y = new Integer();
 int z = 0;

???

Recomendaria um pouco diferente essa sua inicialização

Integer x = Integer.valueOf(1);

ué então pq em os professores não ensinam assim?? e pq nos livros também não está assim? esta normal… sem essa de new…???

Talvez os professores não saibam o funcionamento interno de cada um desses “métodos”

Quando voce usa Integer.valueOf, a VM usa um cache para retornar o valor do inteiro, o que resulta em melhor performance pois os valores mais usados são mantidos nesse cache…

pow! gostei então… eu estudo a um ano na facu java, fiz um curso basicozinho e em nenhum lugar… nem aqui no trampo vejo declarar valueOf()… pra falar a verdade vi esse método aki no livro da kathy! então variável de classe sempre assim é melhor né?

Sempre melhor não… No caso de objetos Double nao existe diferença entre criar um novo objeto e usar valueOf já que seria impraticavel fazer cache de double… Se nao me engano Integer tambem só aplica cache em determinada faixa, acho que de -128 até +127 (posso estar errado)… Mas é boa pratica sim ao inves de construir um novo objeto usar esse valueOf no caso de classes wrappers… Mas tem casos como num loop for que voce deve utilizar tipos primitivos, nem sempre classes wrappers irá ser uma boa ideia!!!

ah claro… em métodos sempre primitivos! isso de 127± é se for do tipo byte então…

É isso aí meu guri… o método valueOf da classe Integer só retorna valores cacheados se estiverem na faixa de números byte!!!

A VM da Sun normalmente retorna os valores cacheados. Mas isso não é uma regra, não é prometido em lugar nenhum. Outras VMs podem retornar objetos diferentes e a própria Sun pode decidir aumentar ou diminuir o cache no futuro.

Bem, acho que a diferença mais básica, só resumindo o que já foi respondido, é que Integer é um objeto e pode ser serializável.

Quanto ao valueOf(int), é um método que foi inserido no java 5, por isso você não encontra nos livros mais antigos (para certificação java 1.4, por exemplo). Mas desconhecia que ganha em performace, porém, já que estou utilizando java 5, prefiro utilizar o autoboxing:

Integer x = 1;

Vivendo e aprendendo =) Pra frente e avante

eu tb me confudo com com a class wrapper e tipos primitivos hehe acho q vou voltar o cap da kathy :smiley:

E ao fazer Integer x = 1 a VM pega o valor de um cache tb?
Só por curiosidade mesmo! Pq, independentemente da resposta, continuarei usando essa forma. Não creio q a performance, nesse caso, compense deixar o código um pouco mais feio!