Inicialização de String em Java

Inicialização de String em Java

1. Introdução

JavaString é uma das classes mais importantes e já cobrimos muitos de seus aspectos em nossoString-related series of tutorials.

Neste tutorial, vamos nos concentrar na inicialização deString em Java.

2. Criação

Em primeiro lugar, devemos lembrar comoStrings são criados em Java.

Podemos usar a palavra-chavenew ou a sintaxe literal:

String usingNew = new String("example");
String usingLiteral = "example";

E também é importante que entendamos comoStrings are managed in a specialized pool.

3. String declaração apenas

Primeiro, vamos apenasdeclare a String, sem atribuir um valor explicitamente.

Podemos fazer isso localmente ou como uma variável de membro:

public class StringInitialization {

    String fieldString;

    void printDeclaredOnlyString() {
        String localVarString;

        // System.out.println(localVarString); -> compilation error
        System.out.println(fieldString);
    }
}

Como podemos ver, se tentarmos usarlocalVarString antes de atribuir um valor a ele, obteremos um erro de compilação. Por outro lado, o console mostrará “null” para o valor defieldString.

Veja,member variables are initialized with a default value quando a classe é construída,null no caso deString. Mas,we have to initialize local variables ourselves.

Se dermos alocalVarString um valor denull, veremos que os dois são, de fato, agora iguais:

String localVarString = null;
assertEquals(fieldString, localVarString);

4. String Inicialização usando literais

Vamos agora criar doisStrings usando o mesmo literal:

String literalOne = "example";
String literalTwo = "example";

Vamos confirmar que apenas um objeto é criado comparando as referências:

assertTrue(literalOne == literalTwo);

A razão para isso remonta ao fato de queStrings are stored in a pool. literalOne adds the String “example” to the pool, and literalTwo reuses it.

5. String Inicialização usandonew

Veremos alguns comportamentos diferentes, no entanto, se usarmos a palavra-chavenew.

String newStringOne = new String("example");
String newStringTwo = new String("example");

Embora o valor deStrings seja o mesmo de antes, teremos objetos diferentes desta vez:

assertFalse(newStringOne == newStringTwo);

6. VazioStrings

Vamos agora criar trêsStrings vazios:

String emptyLiteral = "";
String emptyNewString = new String("");
String emptyNewStringTwo = new String();

Como já sabemos,the emptyLiteral will be added to the String pool, while the other two go directly onto the heap.

assertFalse(emptyLiteral == emptyNewString)
assertFalse(emptyLiteral == emptyNewStringTwo)
assertFalse(emptyNewString == emptyNewStringTwo)
assertEquals(emptyLiteral, emptyNewString);
assertEquals(emptyNewString, emptyNewStringTwo);

7. Valoresnull

Finalmente, vamos ver como nullStrings se comporta.

Vamos declarar e inicializar umString nulo:

String nullValue = null;

Se imprimirmosnullValue, veríamos a palavra “nulo”, como vimos anteriormente. E, se tentássemos invocar qualquer método emnullValue,, obteríamos umNullPointerException, conforme o esperado.

Mas,why does “null” is being printed? What is null actually?

Bem, oJVM specification diz quenull é o valor padrão para todas as referências, portanto, não está especificamente vinculado aString. E, na verdade, a especificação não exige nenhuma codificação de valor concreto paranull.

Então, de onde vem "nulo" para imprimir umString?

Se dermos uma olhada na implementação dePrintStream#println, veremos que ela chamaString#valueOf:

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}

E,if we look at String#valueOf, we get our answer:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

E, obviamente, esse é o motivo de "nulo".

8. Conclusão

Neste artigo, exploramos a inicialização deString. Explicamos a diferença entre declaração e inicialização. Também mencionamos o uso denewe a sintaxe literal.

Finalmente, demos uma olhada no que significa atribuir um valornull aString, como o valornull é representado na memória e como fica quando o imprimimos.

Todos os exemplos de código usados ​​no artigo estão disponíveisover on Github.