public boolean equals(Object obj)
Indicates whether some other object is "equal to" this one.
The equals method implements an equivalence relation on non-null object references:
It is reflexive: for any non-null reference value x, x.equals(x) should return true.
It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
For any non-null reference value x, x.equals(null) should return false.
If String1 == String2, than those are two references of the same object, so you're in the x.equals(x) situation -- which is true "by contract".
Note that quote also hints at the one exception to Faraz' statement: if string1 and string2 are both null, then statement A is true, but B will throw a NullPointerException.
Oh, and also A talks about String1 and String2, while B talks about string1 and string2, which are, as far as the Java compiler is concerned, completely unrelated things. Capitalization matters, so please pay attention to it.