hum… supostamente o resultado dos dois trechos devia ser FALSE uma vez que se tratam de tipos de dados referênciados (array e objecto). Sendo tipos de dados referênciados, o operador relacional “==” torna-se inadequado para o caso pois o que este faz é verificar o ENDEREÇO(referência) e não o conteúdo. Portanto, ao fazeres isto:
int []a = {1,2,3};
int []b = {1,2,3};
Estás a criar dois arrays diferentes MAS com o mesmo conteúdo. O operador “==” não verifica o conteúdo.
No segundo trecho é a mesma coisa:
String a = "abc";
String b = "abc";
Isto são duas Strings diferentes mas com o mesmo conteúdo e por isso a operação “a==b” deveria originar false pois o conteúdo não é verificado mas sim a referência.
Agora, caso tenhas uma terceira String abc:
String abc = "string";
String x = abc; //repara que não tem aspas, ou seja, estou a igualar à String abc.
String y = abc;
O que acontece aqui é que a REFERÊNCIA da String abc é copiada para as Strings x e y, ou seja, as 3 Strings vão armazenar o mesmo endereço e assim estão todas a apontar para exactamente o mesmo conteúdo. Neste caso é legítimo que o trecho 2 imprima true, uma vez que se comparam as referências e estas são iguais.
Espero ter sido útil, apesar de não responder directamente à questão, a resposta está implicita.
PS: Da proxima vez que postares código usa formatação BB assim não ocorrem erros como tens no trecho 2 na declaração das Strings.