Diferença entre String Java nula e vazia (“”)

151

Qual é a diferença entre nulle a ""(string vazia)?

Eu escrevi um código simples:

String a = "";
String b = null;

System.out.println(a == b); // false
System.out.println(a.equals(b)); // false

As duas instruções retornam false. Parece que não consigo encontrar qual é a diferença real entre eles.

Vikas Patidar
fonte
6
Compare com b.equals(a)- mas não use ==para comparação de strings como "não funcionará" de outras maneiras. O nullvalor (que é diferente de uma string vazia "", uma instância String válida) nunca pode ter um método invocado nela. Colocar o "não nulo conhecido" (geralmente um valor constante ou literal) no lado esquerdo da igualdade é "condicionais Yoda" ou algo parecido.

Respostas:

220

"" é uma string real, embora vazia.

null, no entanto, significa que a variável String não aponta para nada.

a==b retorna false porque "" e null não ocupam o mesmo espaço na memória - em outras palavras, suas variáveis ​​não apontam para os mesmos objetos.

a.equals(b) retorna false porque "" não é igual a nulo, obviamente.

A diferença é que, como "" é uma string real, você ainda pode chamar métodos ou funções nela, como

a.length()

a.substring(0, 1)

e assim por diante.

Se a String for igual a nulo, como b, o Java lançaria a NullPointerExceptionse você tentar invocar, diga:

b.length()


Se a diferença que você está pensando é = = versus igual, é esta:

== compara referências, como se eu fosse

String a = new String("");
String b = new String("");
System.out.println(a==b);

Isso resultaria falso porque aloquei dois objetos diferentes, e a e b apontam para objetos diferentes.

No entanto, a.equals(b)nesse caso, retornaria true, porque equalsfor Strings retornará true se e somente se o argumento String não for nulo e representar a mesma sequência de caracteres.

Esteja avisado, porém, que o Java tem um caso especial para Strings.

String a = "abc";
String b = "abc";
System.out.println(a==b);

Você pensaria que a saída seria false, uma vez que deveria alocar duas Strings diferentes. Na verdade, Java internará Strings literais (aquelas que são inicializadas como aeb no nosso exemplo). Portanto, tenha cuidado, pois isso pode dar alguns falsos positivos sobre como == funciona.

Zach L
fonte
Isso também se aplica ao c #? Como na matriz de "" é {'\ 0'}, um valor nulo
Cole Johnson
3
O link sobre internexpirou. Você pode fazer referência a outro site para ler sobre isso: weblogs.java.net/blog/enicholas/archive/2006/06/...
Alston
Portanto, se eu tenho uma String nula String a = nulle a anexo como uma String a+= "example", quando a imprimo, por que exibir nullexamplese null não é uma String?
cpinamtz
O JavaScript do @PinaGamer permite adicionar não-strings a strings. "num: " + 20dá-lhe a corda "num: 20". Isso significa que 20é uma string? (não 20é , é um número). O mesmo caso null: não é uma string, mas pode ser convertida em uma se você tentar adicioná-la.
daboross
@Zach L: quando String s = nulo + "a"; fornece saída nulla, mas null.concat ("a") fornece exceção para o ponteiro nulo. qual é a razão no meu primeiro caso null + "a"; está funcionando.
Ved Prakash
249

Você também pode entender a diferença entre uma string nula e uma vazia desta maneira:

Diferença entre nulo e 0 / sequência vazia

Imagem original de R. Sato ( @raysato )

mikiqex
fonte
7
Isso é ótimo! Eu estava explicando nulo vs vazio para alguém e aconteceu com a sua resposta. O conceito clicou imediatamente para eles.
matt.fc
14

String é um objeto e pode ser nulo

null significa que o objeto String não foi instanciado

"" é um valor real da String de objeto instanciada como "aaa"

Aqui está um link que pode esclarecer esse ponto http://download.oracle.com/javase/tutorial/java/concepts/object.html

Aba Dov
fonte
"null significa que o objeto String não foi instanciado" - obrigado! isso me ajuda a entender bastante as coisas. Eu era capaz de usar uma instrução if em um objeto MediaPlayer uma vez e funcionou para usar null, para verificar se estava em execução ou não (com um método para executar, se estivesse), mas nunca entendi por que funcionava, mas agora Entendi o que estava dizendo, estava verificando se o MediaPlayer havia sido instanciado ou não, usando null ... por exemplo if (mp==null){do something}.
Azurespot
12

O que suas declarações estão dizendo é que "" não é o mesmo que nulo - o que é verdade. "" é uma string vazia; null significa que nenhum valor foi atribuído.

Pode ser mais esclarecedor tentar:

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object

"" ainda é uma string, o que significa que você pode chamar seus métodos e obter informações significativas. null é uma variável vazia - não há literalmente nada lá.

Arkaaito
fonte
9

Há uma diferença bastante significativa entre os dois. A cadeia vazia ""é "a cadeia que não possui caracteres". É uma string real que tem um comprimento bem definido. Todas as operações padrão de sequência são bem definidas na sequência vazia - você pode convertê-la para minúsculas, procurar o índice de algum caractere etc. A sequência nula nullé "nenhuma sequência". Ele não tem um comprimento porque não é uma string. Tentar aplicar qualquer operação de cadeia padrão à cadeia nula causará um NullPointerExceptionem tempo de execução.

templatetypedef
fonte
9

aqui, a is an Objectmas nãob(null) é um objeto, é uma referência nula

System.out.println(a instanceof Object); // true

System.out.println(b instanceof Object); // false

aqui está a minha resposta semelhante

Comunidade
fonte
1
Ambos ae bsão referências. aé uma referência com um objeto instanciado. bé uma referência sem um objeto instanciado (daí o termo "referência nula").
APENAS MINHA OPINIÃO correta
Eu contrariei o -1 ;-) Mas ajudaria a esclarecer essa resposta e discutir a diferença entre "um objeto" e o nullvalor e a diferença entre objetos e variáveis.
@ pst thanks :) Eu respondi de cor, porque aqui está a minha outra resposta semelhante a esta pergunta stackoverflow.com/questions/4459623/…
8

null significa que o nome não está fazendo referência a nenhum objeto instanciado. "" significa uma string vazia.

Aqui a está referenciando algum objeto que passa a ser uma string vazia. b não está fazendo referência a nenhum objeto, pois é nulo.

Shamim Hafiz
fonte
5

Em Java, um tipo de referência designado nãonull tem nenhum valor . Uma sequência atribuída ""tem um valor: uma sequência vazia, ou seja, uma sequência sem caracteres. Quando uma variável é atribuída null, significa que não há objeto subjacente de qualquer tipo, sequência ou outro.

APENAS MINHA OPINIÃO correta
fonte
4

"" e null ambos são diferentes. o primeiro significa, como parte da declaração da variável de cadeia, que a constante de cadeia foi criada no conjunto de cadeias e alguma memória foi atribuída à mesma.

Mas quando o declaramos com nulo , ele acabou de ser instanciado jvm, mas nenhuma memória foi alocada para ele. portanto, se você estiver tentando acessar esse objeto, marcando-o com a variável em branco "" , não será possível impedir a exceção de nulopointer. Encontre abaixo um caso de uso.

public class StringCheck {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String s1 = "siddhartha";
    String s2 = "";
    String s3 = null;

    System.out.println("length s1 ="+s1.length());
    System.out.println("length s2 ="+s2.length());

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){
        System.out.println("length s3 ="+s3.length());
    }
}

}

Sidarta
fonte
4
String s = "";
s.length();

String s = null;
s.length();

Uma referência a uma cadeia vazia ""aponta para um objeto na pilha - para que você possa chamar métodos nela.

Mas uma referência apontando para nullnão tem nenhum objeto para apontar na pilha e, assim, você obterá um NullPointerException.

Mukesh Kumar
fonte
1

A string vazia é distinta de uma referência nula, pois em uma linguagem de programação orientada a objetos, uma referência nula a um tipo de string não aponta para um objeto de string e causará um erro se alguém tentar executar qualquer operação nele. A cadeia vazia ainda é uma cadeia na qual as operações de cadeia podem ser tentadas.

Do artigo da wikipedia sobre cadeia vazia .

weltraumpirat
fonte
1

String s=null;

String não é inicializada para null. se alguma operação de cadeia tentou, ela pode lançar uma exceção de ponteiro nulo

String t="null";

É uma literal de cadeia com a cadeia de valor "nula", igual a t = "xyz". Não lançará ponteiro nulo.

String u="";

É como uma string vazia, não lançará ponteiro nulo.

Bharat Kasodariya
fonte
0

Uma sequência pode estar vazia ou ter um nullvalor. Se uma string é null, não está se referindo a nada na memória. Tente s.length()>0. Isso ocorre porque, se uma string estiver vazia, ela ainda retornará um comprimento igual a 0. Portanto, se você não inserir nada para a mesma, continuará repetindo o loop, pois não registra a string como null. Considerando que, se você verificar o comprimento, ele sairá do loop.

Bibiana
fonte
0

Este conceito pode ser melhor compreendido da matemática. Você já tentou dividir um número (não zero) por 0 usando uma calculadora, por exemplo, 7/0? Você vai obter um resultado que parece algo esta: undefined, not a number, nulletc. Isto significa que a operação é impossível, por algumas razões (vamos deixar essas razões a serem discutidas outro dia).

Agora, faça o seguinte: 0/7. Você obterá a saída 0. Isso significa que a operação é possível e pode ser executada, mas a resposta é apenas 0, porque nada resta após a divisão. Há uma saída válida e essa saída é zero.

No primeiro exemplo, não apenas a saída foi inválida, como a operação não foi possível de ser executada. Isso é semelhante à nullstring em java. O segundo exemplo é semelhante a emptystring.


fonte
0

Quando você escreve

String a = "";

Isso significa que existe uma variável 'a' do tipo string que aponta para uma referência de objeto no pool de strings que possui um valor "". Como variávela está mantendo uma referência de objeto de string válida, todos os métodos de string podem ser aplicados aqui.

Considerando que quando você escreve

String b = null;

Isso significa que existe uma variável bdo tipo string que aponta para uma referência desconhecida . E qualquer operação em referência desconhecida resultará emNullPointerException .

Agora, vamos avaliar as expressões abaixo.

System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed
Neeraj Singh
fonte
0

Em termos simples,

  • "" é uma String vazia

  • null é uma variável de string vazia .

RoboAlex
fonte
0

Diferença entre cadeia nula e vazia. Por exemplo: você tem uma variável chamada x. Se você escreve em JS,

var x = "";

isso significa que você atribuiu um valor que é uma sequência vazia (o comprimento é 0). Na verdade, isso é como algo, mas que não parece nada :) Por outro lado,

var y = null;

isso significa que você não atribuiu um valor a y que foi claramente dito escrevendo nulo a y no momento da declaração. Se você escrever y.length; emite um erro que indica que nenhum valor atribuído a ye, como resultado, não pode ler o comprimento de y.

RashedRahat
fonte
A pergunta é para Java
Vega
0

insira a descrição da imagem aqui

Esta imagem pode ajudá-lo a entender as diferenças.

A imagem foi coletada do ProgrammerHumor

Sazzad Hissain Khan
fonte
0

"Eu chamo de erro do meu bilhão de dólares. Foi a invenção da referência nula em 1965" - https://en.wikipedia.org/wiki/Tony_Hoare

Com relação ao mundo real, ambos podem ser considerados iguais. É apenas uma sintaxe de uma linguagem de programação que cria uma diferença entre dois, conforme explicado por outros aqui. Isso simplesmente cria sobrecarga, como ao verificar / comparar se a variável de string possui algo, você deve primeiro verificar se não é nulo e, em seguida, comparar a string real, ou seja, duas comparações. Isso é um desperdício de poder de processamento para todas as comparações de strings.

Objects.equals () verifica nulo antes de chamar .equals ().

Shivakumar
fonte
0

como curiosidade

    String s1 = null;
    String s2 = "hello";

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
Duracell De Monaco
fonte