Après la décompilation cette ligne
System.out.println("555" == "555" + "");
J'ai eu ce bytecode
LINENUMBER 8 L0
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ICONST_1
INVOKEVIRTUAL java/io/PrintStream.println(Z)V
...
ce qui est équivalent à
System.out.println(true);
que signifie l'expression "555" == "555" + ""
compile boolean true
.
Pour giveLiteralString() == giveLiteralString() + ""
javac construit ce bytecode
LINENUMBER 8 L0
INVOKESTATIC Test1.giveLiteralString()Ljava/lang/String;
NEW java/lang/StringBuilder
DUP
INVOKESTATIC Test1.giveLiteralString()Ljava/lang/String;
INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
IF_ACMPNE L1
...
ce qui est équivalent à
if (giveLiteralString() == new StringBuilder(giveLiteralString()).append("").toString()) {
...
qui sera toujours produire des faux car ici nous sommes en comparant 2 disctinct objets.