Това са струнни неща ;)

След като прочетох ръководството за програмиране на OCP за Java SE 7, мисля, че това са всички малки, но важни ключови моменти, които всеки Java разработчици трябва да знаят за клас String

String е клас, така че можете да създадете string обект чрез new String();
Във всеки String всеки знак е 16-битов Unicode.

Низът е неизменен, Терминът неизменен тук се отнася до обекта String, който е създаден и присвоен на някаква референтна променлива.

/**
* Here myString is a reference variable that holds the reference to * the actual String object created in memory.
*/
String myString = new String();

Така че, можете да промените стойността на референтната променлива myString, когато пожелаете, тъй като това не е действителният обект.

Когато създавате String обект, той се създава в паметта на Java heap и референтната променлива просто има връзка към това.

String x = "ab";
x = "cd";
print(x); //output will be cd

И така, след присвояване на нова стойност cdпо-старата стойност abсе намира в паметта, тя се нарича изгубен обект.
Можете лесно да се свържете сега защо String се нарича неизменен, тъй като не можем да променим оригиналния обект “ab”.

Сега помислете за тези операции, извършвани върху String

String x= "Java";
x.concat(" Facts");
print(x); 
//Output : Java

В горния кодов фрагмент, когато изпълняваме операция concat, ще има 2 обекта в паметта
1. Java
2. Факти за Java
но , тъй като нямаме препратка към новосъздадените „Факти за Java“, той ще се превърне в изгубен обект. и x все още се отнася до Java.

Сега, ако вече сте забелязали, можем да създаваме String обекти по тези начини

String s = new String("myString");
or
String s = new String();
s = "some other string"
or even better
String s = "more better string"

Java има концепция за низов литерал, ето пример за литерал

"Yes! I am a string literal"

JVM ще задели различно пространство в паметта, известно като Постоянен пул от низовеи ще запази всички литерали в пула и всеки път, когато намери литерал от низ по време на компилация, ще провери дали идентичен низов литерал вече съществува в пула, ако има намерени съвпадения, тогава няма да бъде създаден нов литерал, само препратка ще бъде добавена към по-стария литерал.

И така, тук s и s2 се отнасят за един и същ низов литерал „Здравей“,Ето как в голям проект, ако има много идентични низове, паметта няма да се оплаче.

Но ако изрично създадете нов обект чрез извикване на new String()той ще създаде нов обект вътре в Java heap, независимо дали този идентичен низ вече съществува в пула или не.

Така че като цяло винаги трябва да използвате String литерали, така че компилаторът да може да оптимизира вашия код.

Сега можете да започнете да разбирате защо правенето на String обекти неизменни е добра идея. Ако няколко референтни променливи препращат към един и същи String, без да го знаят. Би било много лошо, ако някой от тях може да промени стойността на String.

Сравнение в низ

String first = "hello"
String second = "hello"
print(first == second) // true
String first = "hello"
String second = new String("hello")
print(first == second) //false

Както в първия пример, и двата низови литерала са еднакви, следователно == връща true, но във втория пример, когато взехме new String()той връща false.

За сравняване на низови стойности вместо референтни има метод .equals()който сравнява действителните стойности.

String first = new String("hello")
String second = new String("hello")
print(first.equals(second)) //true

Това са всички малки, но важни неща за низовете, благодаря :)