Diferença entre long e Long

Olá pessoal, td bem?

Dúvida que me apareceu depois de ver alguns trabalhos de colegas…

Qual a diferença de long para Long??? E qual o mais recomendado?

Abs.

depende o q vc vai usar se foe representar um dado seria long ou se for representar um classe seria Long

long = dado primitivo para indentificar um dado de 64 bit
Long = seria a classe Wrapper ( que encapsula valor de um objeto)

vlw
weliton jose

[quote=welitonjose]depende o q vc vai usar se foe representar um dado seria long ou se for representar um classe seria Long

long = dado primitivo para indentificar um dado de 64 bit
Long = seria a classe Wrapper ( que encapsula valor de um objeto)

vlw
weliton jose[/quote]

blz, mas no caso prático de vc fazer:

private Long cod_chs; //ou private long cod_chs;

qual seria a diferença??

[quote=Kleber-rr][quote=welitonjose]depende o q vc vai usar se foe representar um dado seria long ou se for representar um classe seria Long

long = dado primitivo para indentificar um dado de 64 bit
Long = seria a classe Wrapper ( que encapsula valor de um objeto)

vlw
weliton jose[/quote]

blz, mas no caso prático de vc fazer:

private Long cod_chs; //ou private long cod_chs;

qual seria a diferença??[/quote]

Trabalhar com long é mais rápido, pois ele é primitivo, ou seja baixo nivel. Existe o problema dele sempre comçar inicializado com por exemplo 0L.
o Wrapper Long, é mais lendo, porém pode ser definido quando o GC vai coletar a variavel setando ela pra null.

Eu adoto sempre o Long. Mas no fim eles são a mesma coisa. Não existem grandes diferenças quando a isso.

Long (ou java.lang.Long) é um objeto e “long” um tipo primitivo.

Evite usar “Long” a menos que estritamente necessário, já que é preciso um monte de operações intermediárias para fazer cálculos com “Long” em vez de “long”.

O mais recomendado é usar long, minúsculo. Inclusive, nos artigos de AutoBoxing da sun, há um alerta bem explícito sobre a baixa performance do Long.

Primeiro, é bom entender a diferença. long é um tipo primitivo, e mutável. O java também só faz calculos usando o long, não o Long. Finalmente, uma variável local long será gerada no stack, que é um local de rapidíssimo acesso, enquanto um tipo Long será sempre gerado no heap.

Você pode alterar o valor da variável tranquilamente. Uma operação como essa:

long x = 10; long y = 2; x += y+2;
Gera pouquíssimas instruções de processador.

A classe Long é uma classe imutável. Simplesmente uma classe que contém um long dentro. De forma rudimentar, algo mais ou menos assim:

public class Long extends Number { private long value; public Long(long value) { this.value = value; } public long longValue() { return value; } }

Note que não existem setters. Portanto, isso aqui:

Long x = 10; Long y = 2; x += y+2;
Fica traduzido, após a compilação para isso aqui:

Long x = new Long(10); Long y = new Long(2); x = new Long(x.getValue() + new Long(y.getValue() + 2).getValue());

Antes do Java 5, era aquele código que o programador deveria escrever.

Note que nesse exemplo, foram instanciados 4 objetos. Expressões mais complexas podem gerar resultados ainda mais escabrosos. Por isso, o Long não é recomendado em nenhuma computação ligeiramente mais matemática.

Quando você deve usar Long? Quando não puder escapar dele:
a) Em classes que exijam como parâmetro de entrada um objeto (List, Set, Map, etc);
b) Quando você precisa da representação do valor null (embora muitas vezes isso possa ser contornado com um valor que representa o null, como -1);

Essa é a questão pessoal… estou desenvolvendo uma aplicação usando Long ao invés de long. Só que cheguei em determinada etapa da minha aplicação, e estou tendo problemas em pegar o valor de uma HtmlSelectOneMenu, que apesar de existir, a aplicação a reconhece como null… Quem puder dar uma olhada e comentar entre no link:
http://www.guj.com.br/posts/list/45/131782.java#805192

Agradeço.

[quote]Trabalhar com long é mais rápido, pois ele é primitivo, ou seja baixo nivel. Existe o problema dele sempre comçar inicializado com por exemplo 0L.
o Wrapper Long, é mais lendo, porém pode ser definido quando o GC vai coletar a variavel setando ela pra null.

Eu adoto sempre o Long. Mas no fim eles são a mesma coisa. Não existem grandes diferenças quando a isso.
[/quote]

long para dados e alguritimos de pequeno porte vc quiz disser

Se você já trabalhou com C#, o Long seria mais ou menos o equivalente ao “long?” que existe no C#. O “long?” é algo que pode assumir um valor numérico, ou então o valor “null”.

// C#
long? x = null;
x = 10000;
java.lang.Long x = null;
x = 10000; // é a mesma coisa que "x = Long.valueOf (10000)", que equivale a "x = new Long (10000)"

Só um adendo. O java também não é tão bobo e não dá new o tempo todo. Ao invés de new Long, ele também usa o método valueOf. Omiti esse detalhe pois achei que ele somava pouco à explicação e daquela forma ficava mais didático.

O método valueOf simplesmente testa se o Long está num cache, e o retorna caso esteja.

public Long valueOf(long value) { return cache.contains(value) ? cache.get(value) : new Long(value); }

O cache não é ampliado caso o Long não esteja lá. Isso evita que longs no invalo de -127 até 128 sejam constantemente recriados.
E esse cache está presente em todos os wrappers. Em futuras versões do java, o tamanho desse cache será configurável (isso se já não for).

Vale lembrar, também, que quando se usa web services, por exemplo, costuma dar m*%& usar long (minúsculo).