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.