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.


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.


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 )


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


"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á.


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.


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


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.


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.


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());
    }
}

}


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.


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 .


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.


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.


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.


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

0

Em termos simples,

  • "" é uma String vazia

  • null é uma variável de string vazia .


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.


A pergunta é para Java
Vega


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 ().


0

como curiosidade

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

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.