Very simply put, because they are two distinct instances of
String - two completely seperate Objects in the heap.
When you use the == operator to compare two Objects, you are comparing them by their reference.
In this case the two references point to different Objects, so the result is
false.
An Object's hashCode() value is not the same as an Object's reference - it is caluculated in a way specific to the Object's class.
The String class caluculates the hashCode() value based on the internal char array, which is identical for both String instances.
The hashCode() values are therefore identical, even if the Object references are not.