Found the following in my notes, but I am unable to make sense of it:
Primitive type wrapper classes implement caching for a limited number of values.
This guarantees that a limited number of deeply equal wrapper objects are also shallowly equal: Ifo1.equals( o2 )
theno1 == o2
.
For example,new Integer( 0 ) == new Integer( 0 )
.
In general this does not always work.
For example, new Integer( 666 ) == new Integer( 666 )
may not hold.
The reason for caching is that it saves memory.
In general caching works for “small” primitive values.
I don't understand what is meant by this, or what the difference is between a deep (.equals()) and shallow(==) equals. I know in practice, .equals must be used to objects and == for Integral values, but the actual reasoning for this alludes me.
I assume by the names that shallow maybe just checks that both the values are of the same type and name, which deep checks that both variables point to the same object? I don't see how the caching would come into play here though, or why it would be useful.
When you do ==
you are comparing the references for equality. This means you're saying "is the address in memory the same for both Objects?"
When you do .equals()
you are comparing the Objects themselves for equality. This means you're saying "do these two Objects consider themselves equal?"
The example that was given was poor. The only caching done for these numbers that's mandated by the JLS is the .valueOf()
method. The constructor is not cached.
Furthermore, the JLS only specifies the minimum you must cache [-128:127]. JVM implementations may cache more if they so choose. This means Integer.valueOf(500) == Integer.valueOf(500)
may be false
on some machines, but true
on others.
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:
C:\Documents and Settings\glow\My Documents>java biziclop
false
false
true
false
C:\Documents and Settings\glow\My Documents>
See a more detailed answer here (the comments are a gem!): Why do people still use primitive types in Java?