Search code examples
javaprimitiveprimitive-typesautoboxingjava-5

Why do people still use primitive types in Java?


Since Java 5, we've had boxing/unboxing of primitive types so that int is wrapped to be java.lang.Integer, and so and and so forth.

I see a lot of new Java projects lately (that definitely require a JRE of at least version 5, if not 6) that are using int rather than java.lang.Integer, though it's much more convenient to use the latter, as it has a few helper methods for converting to long values et al.

Why do some still use primitive types in Java? Is there any tangible benefit?


Solution

  • In Joshua Bloch's Effective Java, Item 5: "Avoid creating unnecessary objects", he posts the following code example:

    public static void main(String[] args) {
        Long sum = 0L; // uses Long, not long
        for (long i = 0; i <= Integer.MAX_VALUE; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
    

    and it takes 43 seconds to run. Taking the Long into the primitive brings it down to 6.8 seconds... If that's any indication why we use primitives.

    The lack of native value equality is also a concern (.equals() is fairly verbose compared to ==)

    for biziclop:

    class Biziclop {
    
        public static void main(String[] args) {
            System.out.println(new Integer(5) == new Integer(5));
            System.out.println(new Integer(500) == new Integer(500));
    
            System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
            System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
        }
    }
    

    Results in:

    false
    false
    true
    false
    

    EDIT Why does (3) return true and (4) return false?

    Because they are two different objects. The 256 integers closest to zero [-128; 127] are cached by the JVM, so they return the same object for those. Beyond that range, though, they aren't cached, so a new object is created. To make things more complicated, the JLS demands that at least 256 flyweights be cached. JVM implementers may add more if they desire, meaning this could run on a system where the nearest 1024 are cached and all of them return true... #awkward