Call by Reference Problem

LL0rd

Erfahrenes Mitglied
Hallo Leute,

sorry, aber irgendwie bin ich gerade am verzweifeln, irgendwie funktionieren einige Sachen nicht so, wie ich es erwartet habe. Ich habe ein Event Counter geschrieben, der Code dazu sieht so aus:

Code:
Map<String,Integer> auswertung = new HashMap<String,Integer>();
...
...

					if(auswertung.containsKey(aktToken)){
						Integer i = auswertung.get(aktToken);
						i++;
						auswertung.remove(aktToken);
						auswertung.put(aktToken, i);
					}else{
						auswertung.put(aktToken, new Integer(1));
					}

Der Code funktioniert so, ich kann jedoch nicht verstehen, wieso ich die zwei Zeilen nach dem i++ brauche, in denen ich das Objekt rauswerfe und wieder einfüge.

Ich verstehe den Code so: Wenn der gesuchte String nicht in der Map enthalten ist, dann wird ein neues Integer Objekt mit dem Wert 1 erstellt. Dieses Objekt wird dann in die Map eingefügt mit dem String als Schlüssel.

So, nun tritt das gleiche Event ein. Ich lande nun im ersten Teil des IFs. Dann hole ich das Integer Objekt aus der Map und erstelle einen Pointer auf i. Anschließend wird das Objekt hinter i inkrementiert.

Meiner Meinung nach müsste hier ja schon Schluss sein, ist es aber nicht. Denn aus irgendeinem Grund wird anscheinend nicht das Objekt in der Map manipuliert. Aber wieso
 
Naja die Lösung ist recht einfach...

Der ++ Operator funktioniert nur für das Primitive int, nicht aber für ein Integer.

Also im Grunde steht bei dir nun:
Java:
Integer i = auswertung.get(aktToken);
int temp = i.intValue();
temp++;
i = new Integer(i);

Die Umwandlung von Integer in int und umgekehrt führt Java automatisch durch, das nennt sich Autoboxing/unboxing.

i ist danach also ein neues Objekt. Insbesondere ist Integer sowieso immutable (hat ja keinen Setter zum ändern des Wertes).

Was aber reichen würde ist das remove wegzulassen. Das put überschreibt den alten Wert sowieso.

Einfacher ist es mit Objekten die veränderbar sind:
Java:
Map<String, AtomicInteger> testMap = new HashMap<String, AtomicInteger>();
testMap.put("hi", new AtomicInteger(0));
for (int i = 0; i < 10; i++) {
	testMap.get("hi").incrementAndGet();
}
System.out.println(testMap.get("hi"));

Gibt wie gedacht 10 aus.
 
Hallo,

Der ++ Operator funktioniert nur für das Primitive int, nicht aber für ein Integer.
Ich denke das stimmt nicht.

Java:
        Integer i = 0;
        i++;
        System.out.println(i);

Dekompiliert:
Java:
    Integer i = Integer.valueOf(0);
    i = Integer.valueOf(i.intValue() + 1);
    System.out.println(i);

Btw. zum Thema ... in Java gibts nur Call by Value! Referenzen werden kopiert und auch by Value übergeben.

Gruß Tom
 
Zurück