dúvida sobre operador "=="

Pessoal o que acontece com esse código, pq o operador == verifica endereço de memória
certo? porém nesse código quando é feito o teste se s1 == s2 acaba entrando nessa condição
alguém pode me explicar esse código?

    public static void main(String args[]) { 
    String s1 = "abc";
    String s2 = "abc";

    if(s1 == s2)
        System.out.println(1);
    else
        System.out.println(2);
    if(s1.equals(s2))
        System.out.println(3);
    else
        System.out.println(4);
    }

As Strings fazem parte de um pool de Strings para economizar memória.

Nesse caso veja que ele não entra no if.

    public static void main(String args[]) { 
    String s1 = "abc";
    String s2 = new String("abc");

    if(s1 == s2)
        System.out.println(1);
    else
        System.out.println(2);
    if(s1.equals(s2))
        System.out.println(3);
    else
        System.out.println(4);
    }

O que vem a ser esse “pool de String”? :?: :?:

é uma maneira do java consumir menos recurso na criação de strings.

é uma forma do compilador/maquina virtual otimizar o uso de memoria.

se vc faz

String s1 = "oi"; String s2 = "oi";
As variaveis s1 e s2 apontam para a mesma referência de “oi”. Isto também acontece com Wrappers de inteiros até 127 se não me engano.

Se vc quer garantir que são objetos distintos use new:

String s1 = new String("oi"); String s2 = new String("oi");

Como String, Long, Integer, são objetos imutaveis, se eles apontam para o mesmo objeto ou não é “irrelevante”.

Estude o padrão Flyweight.

valeu pessoal, um grande abraço a todos. :smiley: :smiley: :smiley: :smiley: