Різниця між нульовою та порожньою ("") рядком Java


151

Яка різниця між nullі ""(порожній рядок)?

Я написав простий код:

String a = "";
String b = null;

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

Обидва твердження повертаються false. Здається, я не в змозі знайти, в чому полягає фактична різниця між ними.


6
Порівняйте з b.equals(a)- але не використовуйте ==для порівняння рядків, оскільки "це не працюватиме" іншими способами. nullЗначення (яке відрізняється від порожнього рядка "", правильний екземпляр String) не може і НЕ мати метод викликається на нього. Розміщення "відомого ненульового" (як правило, постійного значення чи буквального) в ліву частину рівності - "Yoda conditionals" або якесь таке.

Відповіді:


220

"" - це фактичний рядок, хоча і порожній.

null, однак, означає, що змінна String вказує ні на що.

a==b повертає false, оскільки "" та null не займають однакового простору в пам'яті - іншими словами, їх змінні не вказують на однакові об'єкти.

a.equals(b) повертає false, тому що "" очевидно не дорівнює нулю.

Різниця полягає в тому, що оскільки "" є фактичним рядком, ви все одно можете викликати методи або функції на ньому

a.length()

a.substring(0, 1)

і так далі.

Якщо рядок дорівнює нулю, як b, Java викине a, NullPointerExceptionякщо ви спробуєте викликати, скажіть:

b.length()


Якщо різниця, про яку ви задаєтесь питанням, == проти рівної, це така:

== порівнює посилання, як би я пішов

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

Це виводитиметься помилково, оскільки я виділив два різні об’єкти, а а і b вказують на різні об'єкти.

Однак a.equals(b)у цьому випадку повернеться true, тому що equalsдля Strings повернеться true і тоді, і лише тоді, коли аргумент String не буде нульовим і являє собою ту саму послідовність символів.

Попереджуйте, що у Java є особливий випадок для Strings.

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

Ви можете подумати, що результат буде false, оскільки він повинен виділити дві різні рядки. Насправді, Java буде інтернувати буквальні рядки (ті, які ініціалізуються як a і b у нашому прикладі). Тож будьте обережні, бо це може дати помилкові позитиви щодо того, як == працює.


Чи стосується це також і C #? Як і в масиві "", це {'\ 0'}, нуль
Коул Джонсон

3
Посилання про internтечію минуло. Ви можете посилатися на інший сайт, щоб прочитати про нього: weblogs.java.net/blog/enicholas/archive/2006/06/…
Альстон,

Отже, якщо у мене є нульова строка, String a = nullа потім я додаю її як рядок a+= "example", коли я друкую її, чому відображається, nullexampleякщо null не є String?
cpinamtz

@PinaGamer JavaScript дозволяє додавати рядки до рядків. "num: " + 20дає вам рядок "num: 20". Чи означає це, що 20це рядок? (це не так, 20це число). Той самий випадок null: це не рядок, але його можна перетворити на один, якщо спробувати додати його.
даборосс

@Zach L: коли String s = null + "a"; він дає nulla виводу, але null.concat ("a") дає виключення з null pointer. яка причина в моєму першому випадку null + "a"; працює.
Вед Пракаш

249

Ви також можете зрозуміти різницю між нульовою та порожньою рядком таким чином:

Різниця між нульовим і 0 / порожнім рядком

Оригінальне зображення Р. Сато ( @raysato )


7
Це чудово! Я комусь пояснював нульове проти порожнього, і сталося після вашої відповіді. Концепція відразу ж натиснула на них.
matt.fc

14

Рядок є об'єктом і може бути нульовим

null означає, що String Object не був створений

"" - це фактичне значення створеного об'єктового рядка типу "aaa"

Ось посилання, яке може уточнити цю точку http://download.oracle.com/javase/tutorial/java/concepts/object.html


"null означає, що об'єкт String не був створений" - дякую! це допомагає мені багато чого зрозуміти. я зміг використати оператор if на об’єкті MediaPlayer один раз, і він працював, щоб використовувати null, щоб перевірити, працює він чи ні (з методом виконання, якщо він був), але я ніколи не розумів, чому він працює, але тепер Я бачу, про що йдеться, я перевіряв, чи був MediaPlayer ініційований чи ні, використовуючи null ... напр if (mp==null){do something}.
Azurespot

12

Те, що ваші твердження говорять вам, просто те, що "" не те саме, що "null" - це правда. "" - порожній рядок; null означає, що жодне значення не призначено.

Спробуйте спробувати більше:

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

"" все ще є рядком, тобто ви можете викликати його методи та отримувати змістовну інформацію. null - порожня змінна - там буквально нічого немає.


9

Існує досить значна різниця між ними. Порожній рядок ""- це "рядок, в якій немає символів". Це фактична струна, яка має чітко визначену довжину. Усі стандартні рядкові операції чітко визначені в порожній рядку - ви можете перетворити її в малі регістри, шукати в ній індекс якогось символу і т. Д. Нульовий рядок null- "зовсім не рядок". Він не має довжини, оскільки це зовсім не рядок. Спроба застосувати будь-яку стандартну операцію з рядком до нульового рядка призведе до NullPointerExceptionчасу виконання.


9

сюди , a is an Objectале b(null)це НЕ об'єктно це посилання нульовий

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

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

ось моя схожа відповідь


1
І те, aі інше bє посиланнями. aє посиланням на об'єкт, який інстанціюється. bє посиланням без об'єкта, що створюється, (звідси термін "нульова посилання").
ДАЙТЕ МОЕ правильне ДУМКА

Я протидіяв -1 ;-) Але це допомогло б уточнити цю відповідь та обговорити різницю між "об'єктом" та nullзначенням та різницею між об'єктами та змінними.

@pst спасибі :) Я відповів на серце , тому що тут мій інший відповідь , який схожий на це питання stackoverflow.com/questions/4459623 / ...

8

null означає, що ім'я не посилається ні на який об'єкт, що створюється. "" означає порожній рядок.

Тут a - це посилання на якийсь об'єкт, який, можливо, є порожнім рядком. b не посилається ні на який об’єкт як на нуль.


5

У Java призначений тип посилання nullвзагалі не має значення . Присвоєний рядок ""має значення: порожній рядок, тобто строк, в якому немає символів. Якщо присвоєна змінна, nullце означає, що не існує базового об'єкта будь-якого виду, рядка чи іншого.


4

"" і null обидва різні. перший означає, що як частина оголошення змінної рядка, константа рядка була створена в пулі рядків і деяка пам'ять була призначена для того ж.

Але коли ми оголошуємо його нульовим, тоді він просто був створений jvm, але пам'яті для нього не виділено. тому, якщо ви намагаєтесь отримати доступ до цього об'єкта, перевіривши його за допомогою "" - порожньої змінної, це не може запобігти nullpointerexception. Нижче наведено один приклад використання.

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

Посилання на порожній рядок ""вказує на об'єкт у купі - тому ви можете викликати методи на ньому.

Але посилання, що вказує на те, що nullне має об'єкта вказувати в купі, і, таким чином, ви отримаєте NullPointerException.


1

Порожня рядок відрізняється від нульової посилання тим, що в об'єктно-орієнтованій мові програмування нульова посилання на тип рядка не вказує на об'єкт рядка, і це призведе до помилки, яка намагалася виконати будь-яку операцію над ним. Порожній рядок все ще є рядком, над яким можуть бути зроблені операції з рядком.

З статті вікіпедії на порожній рядок .


1

String s=null;

Рядок не ініціалізується для null. якщо будь-яка строкова операція випробувана, вона може кинути нульовий виняток вказівника

String t="null";

Це рядковий літерал зі значенням string "null", як t = "xyz". Він не кине нульовий покажчик.

String u="";

Це як порожній рядок, він не кине нульовий покажчик.


0

Рядок може бути порожнім або мати nullзначення. Якщо рядок є null, він не посилається ні на що в пам'яті. Спробуйте s.length()>0. Це тому, що якщо рядок порожній, він все одно повертає довжину 0. Отже, якщо ви нічого не введете для того ж, він продовжить циклічно, оскільки він не реєструє рядок як null. Якщо ви перевірите довжину, то вона вийде з її циклу.


0

Це поняття можна краще зрозуміти з математики. Ви коли-небудь намагалися розділити число (не нуль) на 0 за допомогою калькулятора, наприклад 7/0? Ви отримаєте результат, який виглядає приблизно так: undefined,, not a numberі nullт. Д. Це означає, що операція з якихось причин неможлива (залишимо ці причини обговорювати в інший день).

Тепер виконайте це: 0/7. Ви отримаєте вихід, 0. Це означає, що операція можлива і може бути виконана, але у вас відповідь лише 0, оскільки після поділу нічого не залишається. Є дійсний вихід і цей вихід дорівнює нулю.

У першому прикладі не тільки недійсний вихід, операцію було неможливо виконати. Це схоже на nullструну в Java. Другий приклад - це схожий на emptyрядок.


0

Коли пишеш

String a = "";

Це означає, що існує змінна строка типу "a", яка вказує на посилання на об'єкт у пулі рядків, який має значення "". Оскільки змінна aмістить дійсну посилання на об'єкт рядка, тут можуть бути застосовані всі методи рядка.

Коли ви пишете

String b = null;

Це означає, що існує змінна bстрока типу, яка вказує на невідому посилання . І будь-яка операція з невідомої посилання призведе до NullPointerException.

Тепер давайте оцінимо наведені нижче вирази.

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

Простіше кажучи,

  • "" - порожня рядок

  • null - порожній рядковий змінний .


0

Різниця між нульовим та порожнім рядком. Наприклад: у вас є змінна назва x. Якщо ви пишете в JS,

var x = "";

це означає, що ви призначили значення, яке є порожнім рядком (довжина дорівнює 0). Насправді це схоже на щось, але почуття нічого :) З іншого боку,

var y = null;

це означає, що ви не призначили значення y, яке чітко сказано, написавши null до y під час декларації. Якщо ви пишете y.length; вона видасть помилку, яка вказує на те, що жодне значення, присвоєне y, і як результат, не може прочитати довжину y.


Питання для Java
Vega


0

"Я називаю це моєю помилкою в мільярд доларів. Це був винахід нульової посилання в 1965 році" - https://en.wikipedia.org/wiki/Tony_Hoare

Стосовно реального світу обидва можна вважати однаковими. Це просто синтаксис мови програмування, який створює різницю між двома, як пояснено іншими тут. Це просто створює накладні витрати, як, наприклад, при перевірці / порівнянні того, чи є в рядковій змінній щось, то спочатку потрібно перевірити, чи вона не є нульовою, а потім фактичним порівнянням рядків, тобто двома порівняннями. Це марно витрачається на обробку енергії для кожного порівняння струн.

Predcts.equals () перевіряє на null перед викликом .equals ().


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.