Qual é a diferença entre null
e 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.
b.equals(a)
- mas não use==
para comparação de strings como "não funcionará" de outras maneiras. Onull
valor (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:
"" é 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
NullPointerException
se você tentar invocar, diga:b.length()
Se a diferença que você está pensando é = = versus igual, é esta:
== compara referências, como se eu fosse
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, porqueequals
for 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.
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.fonte
intern
expirou. Você pode fazer referência a outro site para ler sobre isso: weblogs.java.net/blog/enicholas/archive/2006/06/...String a = null
e a anexo como uma Stringa+= "example"
, quando a imprimo, por que exibirnullexample
se null não é uma String?"num: " + 20
dá-lhe a corda"num: 20"
. Isso significa que20
é uma string? (não20
é , é um número). O mesmo casonull
: não é uma string, mas pode ser convertida em uma se você tentar adicioná-la.Você também pode entender a diferença entre uma string nula e uma vazia desta maneira:
Imagem original de R. Sato ( @raysato )
fonte
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
fonte
if (mp==null){do something}
.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:
"" 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á.
fonte
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 nulanull
é "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á umNullPointerException
em tempo de execução.fonte
aqui,
a is an Object
mas nãob(null)
é um objeto, é uma referência nulaaqui está a minha resposta semelhante
fonte
a
eb
sã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").null
valor e a diferença entre objetos e variáveis.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.
fonte
Em Java, um tipo de referência designado não
null
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ídanull
, significa que não há objeto subjacente de qualquer tipo, sequência ou outro.fonte
"" 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.
}
fonte
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
null
não tem nenhum objeto para apontar na pilha e, assim, você obterá umNullPointerException
.fonte
Do artigo da wikipedia sobre cadeia vazia .
fonte
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.
fonte
Uma sequência pode estar vazia ou ter um
null
valor. Se uma string énull
, não está se referindo a nada na memória. Tentes.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 comonull
. Considerando que, se você verificar o comprimento, ele sairá do loop.fonte
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
,null
etc. 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 à
null
string em java. O segundo exemplo é semelhante aempty
string.fonte
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ável
a
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
b
do 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.
fonte
Em termos simples,
"" é uma String vazia
null é uma variável de string vazia .
fonte
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.
fonte
Esta imagem pode ajudá-lo a entender as diferenças.
A imagem foi coletada do ProgrammerHumor
fonte
"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 ().
fonte
como curiosidade
fonte