Permalänk
Medlem

skummheter i java

Integer x = 128;
Integer y = 128;
Integer z = x;
System.out.println(x == y ? "true": "false");
System.out.println(y == z ? "true": "false");
System.out.println(x == z ? "true": "false");

varför blir de två första false?
sätter man x och y till ett tal lägre än 128 så blir det true...

Visa signatur

LAN i stockholmv9
http://www.hazard.nu

Permalänk

Därför att x och y är två olika objekt och '==' jämför objekt inte innehåll.

Och dessutom så kan man inte deklarera en Integer på det sättet eftersom det är objekt...

Integer x = new Integer(128);
Integer y = new Integer(128);

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av lindefors
Därför att x och y är två olika objekt och '==' jämför objekt inte innehåll.

de är fortfarande objekt när x har värdet 127 eller lägre? men då blir det true...

Visa signatur

LAN i stockholmv9
http://www.hazard.nu

Permalänk

Det blir inte true när man har värdet 127 och lägre...

Ser gärna på hela din kod...

Permalänk
Medlem

public class Main{ public static void main(String... args){ System.out.println("\n\n\n"); System.out.println("try to compare with 127 instead of 128!"); Integer x = 127; Integer y = 127; Integer z = x; System.out.println(x == y ? "true": "false"); System.out.println(y == z ? "true": "false"); System.out.println(x == z ? "true": "false"); System.out.println(x.equals(y) ? "true": "false"); System.out.println(y.equals(z) ? "true": "false"); System.out.println(x.equals(z) ? "true": "false"); } }

blir det visst. prova själv

Visa signatur

LAN i stockholmv9
http://www.hazard.nu

Permalänk

Du den där koden kompilerar inte överhuvudtaget...

testa detta istället;

<code>
public class test {
public static void main(String[] args) {
Integer x = new Integer(10);
Integer y = new Integer(10);
Integer z = x;
System.out.println(x == y ? "true": "false");
System.out.println(y == z ? "true": "false");
System.out.println(x == z ? "true": "false");
}
}
</code>

Permalänk
Medlem

den kompilerade för mig, har du java<1.5 kanske?
sättet du gör är inte samma. jag har förövrigt hittat varför det blir som det blir
http://www.jensgustavsson.se/autoboxing.html
förklarar det bra.

men kort sagt så garanterar inte java att objekten blir olika om talen är små (-128 till 127) och således blir det true om man använder autoboxing.
gör man som du skrev blir det troligen olika objekt eftersom autobixing inte används.

Visa signatur

LAN i stockholmv9
http://www.hazard.nu

Permalänk

Hmmm, jag körde eclipse och standarden var satt till 1.4... mitt fel autoboxing-artikeln förklarar det bra!

Permalänk
Medlem

Han som skrev det där om autoboxing, han tänker inte på storleken wrapperklasser tar gentemot primitiva variabler. (när det gäller hans slutsats)
( Ja, jag tycker han är galen )

Han kan köra python/ruby om han vill ha den funktionen (jag tror dom kör så / iaf ut mot användaren) eller göra som han skrev, använda wrapper hela tiden.

Permalänk
Medlem

Varför inte använda vanliga int istället för Integer? Jag vet att java är jätte-objektorienterat (vilket är trevligt), men just char, int, long, double, float mf finns ju som vanliga variabler, och det underlättar faktiskt en hel del att använda dem, tycker jag iaf.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Torandi
Varför inte använda vanliga int istället för Integer? Jag vet att java är jätte-objektorienterat (vilket är trevligt), men just char, int, long, double, float mf finns ju som vanliga variabler, och det underlättar faktiskt en hel del att använda dem, tycker jag iaf.

Det handlade mest om förståelse varför det blev som det blev. Det kan man inte lösa genom att använda primitiva variablerna

Visa signatur

LAN i stockholmv9
http://www.hazard.nu