Инициализация на низове в Java

1. Въведение

Java String е един от най-важните класове и вече сме обхванали много от неговите аспекти в нашата серия уроци, свързани със String .

В този урок ще се съсредоточим върху инициализирането на низове в Java.

2. Създаване

На първо място, трябва да си спомним как String s се създават в Java.

Можем да използваме новата ключова дума или буквалния синтаксис:

String usingNew = new String("baeldung"); String usingLiteral = "baeldung";

И също така е важно да разберем как се управляват String в специализиран пул.

3. Само декларация на низове

Първо, нека просто декларираме String , без да присвояваме стойност изрично.

Можем да направим това локално или като променлива член:

public class StringInitialization { String fieldString; void printDeclaredOnlyString() { String localVarString; // System.out.println(localVarString); -> compilation error System.out.println(fieldString); } }

Както виждаме, ако се опитаме да използваме localVarString, преди да му дадем стойност, ще получим грешка при компилацията. От друга страна, конзолата ще покаже “ null” за стойността на fieldString .

Вижте, членовите променливи се инициализират със стойност по подразбиране, когато класът е конструиран, нула в случая на String . Но ние сами трябва да инициализираме локални променливи.

Ако дадем на localVarString стойност null , ще видим, че двете наистина са равни:

String localVarString = null; assertEquals(fieldString, localVarString);

4. Инициализация на низове с помощта на литерали

Нека сега създадем два String s, използвайки един и същ литерал:

String literalOne = "Baeldung"; String literalTwo = "Baeldung";

Ще потвърдим, че е създаден само един обект, като сравним препратките:

assertTrue(literalOne == literalTwo);

Причината за това се връща към факта, че String s се съхраняват в пул. literalOne добавя String “baeldung” към басейна и literalTwo го използва повторно.

5. Инициализиране на низове с помощта на нов

Ще видим различно поведение обаче, ако използваме новата ключова дума.

String newStringOne = new String("Baeldung"); String newStringTwo = new String("Baeldung");

Въпреки че стойността на двете String s ще бъде същата като по-рано, този път ще трябва да използваме различни обекти:

assertFalse(newStringOne == newStringTwo);

6. Празен низ s

Нека сега създадем три празни String s:

String emptyLiteral = ""; String emptyNewString = new String(""); String emptyNewStringTwo = new String();

Както знаем от сега, за emptyLiteral ще бъде добавен към String басейна, а другите двама отидете директно върху купчината.

Въпреки че това няма да са едни и същи обекти, всички те ще имат една и съща стойност:

assertFalse(emptyLiteral == emptyNewString) assertFalse(emptyLiteral == emptyNewStringTwo) assertFalse(emptyNewString == emptyNewStringTwo) assertEquals(emptyLiteral, emptyNewString); assertEquals(emptyNewString, emptyNewStringTwo);

7. null Стойности

И накрая, нека видим как се държат null String .

Нека декларираме и инициализираме нулев низ :

String nullValue = null;

Ако отпечатаме nullValue , ще видим думата „null“, както видяхме преди. И ако се опитахме да извикаме някакви методи на nullValue, щяхме да получим NullPointerException , както се очакваше.

Но защо се отпечатва „null“? Какво всъщност е null ?

Е, JVM спецификацията казва, че null е стойността по подразбиране за всички препратки, така че не е конкретно обвързана със String . И всъщност спецификацията не изисква никакво конкретно кодиране на стойност за нула .

И така, откъде идва „null“ за отпечатване на низ тогава?

Ако разгледаме изпълнението на PrintStream # println , ще видим, че извиква String # valueOf :

public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }

И ако разгледаме String # valueOf, получаваме отговора си:

public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }

И, очевидно, това е причината за „null“.

8. Заключение

В тази статия разгледахме инициализация на String . Обяснихме разликата между декларация и инициализация. Освен това се спряхме на използването на нов и използването на буквалния синтаксис.

Накрая разгледахме какво означава присвояване на нулева стойност на String , как нулевата стойност е представена в паметта и как изглежда, когато я отпечатаме.

Всички примерни кодове, използвани в статията, са достъпни в Github.