Javaパズル:"test".length()の呼び出しで挙動が変わるのはナゼ?

Javalobbyで紹介されてたパズル
Thursday Code Puzzler: String Intern Puzzle in Java 7 and 6 | Javalobby


このコードをJava7で動かすと、true が表示されます。

String te = "te", st = "st";
// "test".length();
String username = te + st;
username.intern();
System.out.println(
  "String object the same is:" + (username == "test"));


Java6で動かした場合はfalseが表示されます。
ここで、Java7の場合でも、コメントアウトされた「"test".length()」をアンコメントすると、falseが表示されるようになります。

String te = "te", st = "st";
"test".length();
String username = te + st;
username.intern();
System.out.println(
  "String object the same is:" + (username == "test"));


仕様としてはJava7の挙動のほうが正しいと思われるのですが、ではそれはナゼでしょう?