This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.
When you want to compare the actual content of an object for equivalence you should use the method equals(). This is because although the contents of your Strings are the same, == checks that the object references are equivalent. Which is not the case in all three of your examples.
Here, you're asking "replace" to perform a null operation -- i.e., a replacement that wouldn't change the String. The standard implementation of replace() optimizes this case and simply returns the original String. Two identical literals always refer to the same object, so this will print "Equal".
Each call to replace() will create a new String. These two new Strings will have the same contents, but won't be the same physical object, so this will print "Not Equal".
if(" String ".trim() == "String")
The call to trim() will return a new String, which won't be the same object as the literal "String", so this is another "Not Equal".
As a previous poster noted, "==" tells you if two Strings are the same physical object in memory, while the equals() methods compares the contents and returns true as long as the two Strings contain the same characters in the same order.