Skip to main content

Wrapper Classes

Java is an object-oriented programming language, which means everything should theoretically be an object. However, for performance reasons, Java provides eight primitive data types (int, char, double, boolean, etc.) that are not objects.

A Wrapper class in Java provides the mechanism to convert these primitive data types into object equivalents. These wrapper classes are part of the java.lang package.


The Eight Wrapper Classes

Here is the mapping of primitive types to their corresponding Wrapper classes:

Primitive TypeWrapper Class
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

Why Do We Need Wrapper Classes?

  1. Collections Framework: Java's Collection framework (like ArrayList, HashMap, HashSet) strictly works with Objects. You cannot store primitive types like int inside an ArrayList. You must use the Integer wrapper class.
  2. Utility Methods: Wrapper classes provide helpful constants (like Integer.MAX_VALUE) and utility methods (like Integer.parseInt(String)) to manipulate primitive data.
  3. Synchronization: Multithreading synchronization requires an object lock. Primitives cannot be used for locks.

Autoboxing and Unboxing

Before Java 5, developers had to manually convert primitives to wrapper objects and vice-versa. Java 5 introduced Autoboxing and Unboxing to make this process automatic and seamless.

1. Autoboxing

The automatic conversion of a primitive data type into its corresponding Wrapper class object by the Java compiler is known as Autoboxing.

public class LabWrapper1 {

public static void main(String args[]) {
int primitiveInt = 50;

// Manual boxing (Prior to Java 5)
Integer obj1 = Integer.valueOf(primitiveInt);

// Autoboxing (Java 5 and later)
Integer obj2 = primitiveInt;

System.out.println("Primitive: " + primitiveInt);
System.out.println("Autoboxed Object: " + obj2);
}
}

2. Unboxing

The automatic conversion of a Wrapper class object back into its corresponding primitive data type is known as Unboxing.

public class LabWrapper2 {

public static void main(String args[]) {
Integer obj = new Integer(100);

// Manual unboxing
int primitive1 = obj.intValue();

// Unboxing (Automatic)
int primitive2 = obj;

System.out.println("Object: " + obj);
System.out.println("Unboxed Primitive: " + primitive2);
}
}

[!NOTE] Even though Autoboxing and Unboxing happen automatically, they still consume CPU cycles under the hood. Avoid unnecessary boxing/unboxing in tight loops for high-performance applications!