wrote:
> import java.util.HashMap;
> import java.lang.System;;
>
> public class HashMapTest
> {
> public static void main(String args[])
> {
> HashMap<String,Integer> hm = new HashMap<String,Integer>();
>
> hm.put("test1",0);
>
> hm.get("test1").intValue() += 5;
> //Error:The left-hand side of an assignment must be a variable
>
> System.out.println(hm.get("test1"));
> }
>
> }
>
> I want to update a Value in a HashMap. I know the Key. I would have
> assumed the above code would work. Instead, I am given an error, "The
> left-hand side of an assignment must be a variable".
>
> Does this mean that the value returned is the literal value? In this
> case 0.
hm.get returns the Integer, but then you've done intValue of that, and
that's a plain int.
> I would have assume a reference to the object would have been
> returned and calling += would have unboxed the Integer and aggregated
> the value.
Before you called intValue, you had a reference to the original Integer,
but Integer objects (just like Boolean, Byte, Short, Character, Long,
Float, Double, and String) are immutable. But after intValue, you had a
plain int, and you can't have a reference to a boolean, byte, short,
char, long, float, or double -- only objects.
> Could someone explain to me what is going on? Also, what is the best
> way to accomplish updating this value?
Since the Integer is immutable, you have to replace it with a new one.
hm.put("test1", hm.get("test1") + 5);
Autoboxing and unboxing translates this, in effect, to
hm.put("test1", new Integer(hm.get("test1").intValue + 5));
If the case were different -- say you were using an imaginary type
called "MutableInteger" -- you could do something like this:
hm.put("test1", new MutableInteger(0));
hm.get("test1").MutableInteger.add(5));
--
John W. Kennedy
"The grand art mastered the thudding hammer of Thor
And the heart of our lord Taliessin determined the war."
-- Charles Williams. "Mount Badon"