Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are all primitive wrapper classes immutable objects?

Tags:

Are all primitive wrapper classes in Java immutable objects? String is immutable. What are the other immutable objects?

like image 309
Jothi Avatar asked May 29 '11 06:05

Jothi


People also ask

Are all primitive types immutable?

All primitives are immutable; that is, they cannot be altered. It is important not to confuse a primitive itself with a variable assigned a primitive value. The variable may be reassigned to a new value, but the existing value can not be changed in the ways that objects, arrays, and functions can be altered.

Are primitives immutable in Java?

Yes, they are immutable.

What all classes are immutable in Java?

Immutable class in java means that once an object is created, we cannot change its content. In Java, all the wrapper classes (like Integer, Boolean, Byte, Short) and String class is immutable. We can create our own immutable class as well.

Does every primitive type have a wrapper class?

Each Java primitive has a corresponding wrapper: boolean, byte, short, char, int, long, float, double. Boolean, Byte, Short, Character, Integer, Long, Float, Double.


2 Answers

Any type which doesn't give you any means to change the data within it is immutable - it's as simple as that. Yes, all the primitive wrapper types are immutable1, as is String. UUID, URL and URI are other examples.

Although Calendar and Date in the built-in Java API are mutable, many of the types within Joda Time are immutable - and to my mind, this is one reason why Joda Time is easier to work with. If an object is immutable, you can keep a reference to it somewhere else in your code and not have to worry about whether or not some other piece of code is going to make changes - it's easier to reason about your code.


1 by which I mean java.lang.Integer etc. As noted elsewhere, the Atomic* classes are mutable, and indeed have to be in order to serve their purpose. There's a difference in my mind between "the standard set of primitive wrapper classes" and "the set of classes which wrap primitive values".

You can write your own mutable wrapper class very easily:

public class MutableInteger {     private int value;      public MutableInteger(int value)      {          this.value = value;     }      public int getValue()     {         return value;     }      public void setValue(int value)     {         this.value = value;     } } 

So as you can see, there's nothing inherently immutable about wrapper classes - it's just that the standard ones were designed to be immutable, by virtue of not providing any way to change the wrapped value.

Note that this allows for the same object to be used repeatedly when boxing, for common values:

Integer x = 100; Integer y = 100; // x and y are actually guaranteed to refer to the same object  Integer a = 1000; Integer b = 1000; // a and b *could* refer to the same object, but probably won't 
like image 127
Jon Skeet Avatar answered Sep 19 '22 06:09

Jon Skeet


Before Java 5, all the primitive wrapper classes were immutable.

However, the atomic wrapper classes introduced in Java 5 (AtomicInteger, AtomicLong, AtomicBoolean and AtomicReference<V>) are mutable.

like image 40
Frédéric Hamidi Avatar answered Sep 22 '22 06:09

Frédéric Hamidi