Qual a diferença entre uma variável int e Integer e suas vantagens e desvantagens?

Não consigo enteder a diferença entre int e Integer, as vezes uso um as vezes outro, quando eu crio uma variável devo sempre criar uma int ou uma Integer?

Use int, não Integer, a menos que seu problema peça alguma das seguintes coisas:

a) Você precisa de um valor que possa assumir não somente valores como 0, 1, 2, -1, etc. mas também o valor null (ou seja, o equivalente do C# a “int?” ou “Nullable”). Isso não é tão incomum quanto parece; pode ocorrer quando se usam bancos de dados e colunas que podem ser null.
b) Você precise de um objeto de verdade.

1 curtida

Um wrapper é um objeto, portanto, ele pode ou não assumir uma referência, uma posição em memória.

Integer i = 10;

Pronto, já tens algo em memória. Assim:

Integer i = null;

E agora ? Nada.
E o int ? Todos os tipos primitivos tem valores default´s que são alocados em memória.

int i = null;

Impossível !!! Não é um Objeto, portanto, é obrigatório sua alocação em memória, ou se preferir, atribuir um valor a ele que não seja nulo !
Essa diferença é bastante utilizando na camada DAO, onde se persisti objetos em banco de dados. Mas pode ser utilizada também para calculo entre outros.
Se existe a possibilidade de tu não utilizar o valor, use um Integer, recomendo, afinal, ele pode ser nulo em algum momento e tu não precisa ocupar memória de graça, mas, se o valor sempre vai existir, porque não usar um primitivo certo ?

Fora isso, é que o Wrapper também te oferece métodos, portanto, da uma lida no javadoc do Integer. Estes métodos lhe serão úteis ? Excelente, use um Integer.
Entendeu mais ou menos ?

É questão de avaliação.

Uma coisa que não foi falada, porém é importante. É que o Integer, por se um objeto, é que ele ao passa-lo como parâmetro para outro objeto eu não “aloco” mais memória, pois eles compartilham a mesma referencia. Eu só vou alocar mais memória ao definir para um dos objetos que recebi um novo valor. Isso é importante quando se utiliza muitos valores numéricos que são compartilhados por diversos objetos.

Não sei se entendi mas o Integer é um objeto que pode ser nulo e tem métodos como o String tem o equals e o int sempre precisa de algum valor. correto?

Então se eu fizer um array devo então usar o Integer já que algumas posições do array podem ficar nulas?

Depende, porque você pode ter um problema onde você sabe o tamanho certo do array (por exemplo, usando uma outra variável que contém o tamanho “certo” do seu array) e uma posição que não foi inicializada tem de ser zero mesmo.

[quote=Shatemui]Não sei se entendi mas o Integer é um objeto que pode ser nulo e tem métodos como o String tem o equals e o int sempre precisa de algum valor. correto?

Então se eu fizer um array devo então usar o Integer já que algumas posições do array podem ficar nulas?[/quote]

Além do que o entanglement disse, você está falando em um array, se falar em Objetos que representam arrays, os mesmo só aceitam Objetos, portanto, nunca terão primitivos. Exemplo:

List<Integer> listaDeInteiros = new ArrayList<Integer>();

Só para ter uma ideia de possibilidades: Collection.

como em java tudo é objeto, então um Integer é um objeto, int é um dado primitivo

dentro da classe Integer existe um int.

[code]class Integer{ //Wrapper

int i;

Integer(int i){
this.i = i;
}

setInt(int i){
this.i = i;
}

getInt(){
return i;
}

}[/code]

[code]//quando você faz:
Integer numero = 1;
// o java entende você fazendo isso:
Integer numero = new Integer(1);

//quando você faz isso:
numero = 5;
// o java entende você fazendo isso:
numero.setInt(5);

//quando faz isso:
println(numero);
// o java entende você fazendo isso:
println(numero.getInt());[/code]

ele encapsula tudo isso de você

1 curtida

faz assim:

Integer integer = 5; int Int = 5; integer. Int.

coloque o cursor na frente do " . " do integer aperte Ctrl+Espaço e veja a quantidade de métodos.

agora faça o mesmo no Int…não tem nenhum…

são outras utilidades…

Integer “torra” mais memória que int…tbm

int, char, boolean, long, float são resquicios da origem C que o java possui.
Java não é uma linguagem 100% orientada a objetos pois possui tipos primitivos.
As classes Integer, Character, Boolean, Long e Float são algumas das classes Wrappers, cuja função é permitir operações com objetos que sintetizem o que tipos primitivos representam.

Logo, se o teu projeto é orientado a objetos, o mais adequado seria utilizar as classes Wrapper, pois você manteria a integridade do mesmo.

Motivos de se preferir Integer a int já foram citados, mas até eu achei confuso.

Tipos primitivos não são objetos, logo, não possuem métodos nem atributos. Eles apenas representam um valor específico.

Classes Wrapper, assim como todas as classes, representam grupos de objetos com atributos e operações comuns. Os numerais 1, 2, 4, 30, 120 são objetos. Eles possuem atributos (valor) e métodos (getValorAbsoluto), portanto, podem ser interpretados como tal.
Como um objeto da classe Integer pode representar qualquer número que exista ou não, desde que seja inteiro (não fracionário), é possível utilizar a sintaxe

Integer val = null;

Portanto, a não ser em casos bem específicos (como utilizar a variável num laço for), prefira a classe Integer e todas as Wrappers.

1 curtida

[quote=douglaskd]como em java tudo é objeto, então um Integer é um objeto, int é um dado primitivo…

[/quote]

Em Java existem tipos primitivos que não são objetos, portanto em Java nem tudo é objeto. É isso ou estou enganado?

EDIT:drsmachado já explicou tudo :smiley: .

[quote=Markus Alemao][quote=douglaskd]como em java tudo é objeto, então um Integer é um objeto, int é um dado primitivo…

[/quote]

Em Java existem tipos primitivos que não são objetos, portanto em Java nem tudo é objeto. É isso ou estou enganado?
[/quote]
Para a decepção de muitos fanboys, java não é 100% orientada a objetos.
Portanto, o nosso camarada foi infeliz no que escreveu.
Eu entendo que o objetivo dele era dizer que int não é um objeto, mas um tipo primitivo.

Enfim, nem tudo em java é objeto.

me expressei mal…

java não é 100% objetos…ela tenta fazer com que utilizemos somente objetos…

por isso…existe:
String : char[]
Integer : int
ArrayList : Array[]

java te dá a possibilidade de se usar apenas objetos com métodos prontos…maior facilidade etc…

mas deixa você usar int…bool…eu creio que deva existir por questões de performance e/ou compatibilidade