The Integer class keeps a cache of Integer instances representing values from -128 to 127. When references are made with values within this range, the corresponding cached instance is returned, so, for values within this range, == is returning true because the operands are in fact the same instance (from the cache). This is not the case with values outside the cached range. In those cases, the operands are different memory locations, and == evaluates to false.
Why couldn't it? My local telephone directory has 30 people whose last name is "Foo".
Marc, your last name can't be "Foo".
a real pain