una confusione sul pool di stringhe java String e sulla concatenazione di String

tutto, ho dovuto affrontare un problema quando scrivo il codice qui sotto

String hello = "Hello"; String str5 = "Hel" + "lo"; String str8 = "Hel"; String str9 = "lo"; String str10 = str8 + str9; System.out.println("str10==hello?" + (str10 == hello)); System.out.println("str5==hello?" + (str5 == hello)); System.out.println("str10==str5?" + (str10 == str5)); 

poi eseguo il mio codice e la console lo stampa

 str10 == hello ? false str5 == hello ? true str10 == str5 ? false 

questo mi ha confuso molto perchè la seconda stampa TRUE ma la prima stampa FALSE ?? nella mia comprensione del pool letterale String, quando viene definita una stringa e JVM controlla se il pool contiene quella stringa, in caso contrario inserisce la stringa nel pool.
nel mio codice, hello variabile esiste nel pool di stringhe, ” Helo ” e ” lo ” anche nel pool, la mia domanda è

  1. se il risultato della concatenazione di ” Helo ” e ” lo ” esiste nel pool.
  2. qual è la differenza tra la definizione di str5 e str10s ‘e perché non sono “==”? fa str5 e str10 si riferiscono al diffrent ” Hello ” che nel pool di stringhe? (“==” sembra significare che il riferimento è lo stesso object)

la mia versione jdk: 1.6.0_29
il mio IDE: Intellij Idea 11.2

qualcuno può indicarlo? Grazie mille