1. Прежде всего, String не принадлежит к 8 основным типам данных. String является объектом.
Поскольку значение объекта по умолчанию равно null, значение String по умолчанию также равно null, но это специальный объект, обладающий некоторыми характеристиками, которых нет у других объектов;
2. new String() и new String("") объявляют новую пустую строку, которая является пустой строкой, а не нулевой;
3. Строка str="kvill";
Разница между String str=new String ("kvill");:
Здесь мы не будем говорить о куче или стеке, а просто представим простую концепцию постоянного пула.
Пул констант относится к пулу, который определяется во время компиляции и сохраняется в скомпилированном пуле. Некоторые данные в файле класса. Он включает в себя константы в классах, методах, интерфейсах и т. д., а также строковые константы.
Посмотрите пример 1:
Скопируйте код кода следующим образом:
Строка s0="квилл";
Строка s1="квилл";
Строка s2="kv" + "ill";
System.out.println(s0==s1);
System.out.println(s0==s2);
Результат:
истинный
истинный
Во-первых, нам нужно знать, что Java гарантирует наличие только одной копии строковой константы.
Поскольку «kvill» в s0 и s1 в примере являются строковыми константами, они определяются во время компиляции, поэтому s0==s1 имеет значение true, а «kv» и «ill» также являются строковыми константами, когда строка объединяется с помощью несколько строковых констант, она сама должна быть строковой константой, поэтому s2 также анализируется в строковую константу во время компиляции, поэтому s2 также является одним из «kvill» в пуле констант Quote.
Итак, мы получаем s0==s1==s2;
Строки, созданные с помощью new String(), не являются константами и не могут быть определены во время компиляции, поэтому строки, созданные с помощью new String(), не помещаются в пул констант, они имеют собственное адресное пространство.
Посмотрите пример 2:
Скопируйте код кода следующим образом:
Строка s0="квилл";
String s1=новая строка("kvill");
String s2="kv" + новая строка("ill");
System.out.println(s0==s1);
System.out.println(s0==s2);
System.out.println(s1==s2);
Результат:
ЛОЖЬ
ЛОЖЬ
ЛОЖЬ
В примере 2 s0 по-прежнему является применением «kvill» в пуле констант. Поскольку s1 не может быть определен во время компиляции, это ссылка на новый объект «kvill», созданный во время выполнения. Поскольку s2 имеет вторую половину newString. («ill»), это также невозможно определить во время компиляции, поэтому это тоже применение вновь созданного объекта «kvill»: если вы это поймете, вы поймете, почему получен такой результат;
4. Строка.интерн():
Добавлю еще один момент: существует в. Пул констант в файле класса загружается JVM во время выполнения и может быть расширен. Метод intern() класса String — это метод расширения пула констант; когда экземпляр String вызывает метод intern(), Java проверяет, есть ли строковая константа с тем же Unicode в пуле констант. Если да, он возвращает результат. его ссылку. Если нет, добавьте строку Unicode, равную str, в пул констант и верните ее ссылку, это будет понятно, посмотрев пример 3. Пример 3:
Скопируйте код кода следующим образом:
Строка s0= "квилл";
String s1=новая строка("kvill");
String s2 = новая строка («квилл»);
System.out.println(s0==s1);
System.out.println( "************");
s1.стажер();
s2=s2.intern(); //Назначаем ссылку «kvill» в пуле констант на s2
System.out.println(s0==s1);
System.out.println(s0==s1.intern());
System.out.println(s0==s2);
Результат:
ЛОЖЬ
**********
false //Хотя s1.intern() выполняется, его возвращаемое значение не присваивается s1
true //Указывает, что s1.intern() возвращает ссылку на «kvill» в пуле констант
истинный
Напоследок позвольте мне развеять еще одно недоразумение:
Кто-то сказал: «Используйте метод String.intern(), чтобы сохранить класс String в глобальной таблице String. Если строка Unicode с тем же значением уже находится в этой таблице, то этот метод возвращает строку, уже находящуюся в таблице. , если в таблице нет строки с таким же значением, зарегистрируйте в таблице свой собственный адрес. «Если я понимаю глобальную таблицу строк, которую он назвал пулом констант, его последнее предложение будет: «Если в таблице есть строка». table, Если строк с одинаковым значением нет, прописывать в таблице собственный адрес неправильно:
Посмотрите пример 4:
Скопируйте код кода следующим образом:
String s1=новая строка("kvill");
Строка s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );
Результат:
ЛОЖЬ
Квилл Квилл
истинный
В этом классе мы не объявляли константу «kvill», поэтому вначале в пуле констант не было «kvill». Когда мы вызывали s1.intern(), в пул констант добавлялась новая константа «kvill». Оказывается, «квилл», которого нет в пуле констант, все еще существует, а значит, он не «регистрирует собственный адрес в пуле констант».
s1==s1.intern() имеет значение false, что указывает на то, что исходный «kvill» все еще существует;
s2 теперь является адресом «kvill» в пуле констант, поэтому s2==s1.intern() имеет значение true.
5. О функциях равенства() и ==:
Для String это просто сравнение эквивалентности последовательностей двух строк в Юникоде и возврат true, если они равны, а == — сравнение того, совпадают ли адреса двух строк, то есть являются ли они ссылками; в ту же строку.
6. О том, что строка неизменяема
Об этом можно многое сказать. Если вы знаете, что экземпляр String не изменится после создания, например: String str="kv"+"ill"+" "+"ans";
Существует 4 строковые константы. Сначала «kv» и «ill» генерируют «kvill», который сохраняется в памяти, затем «kvill» объединяется с « » для создания «kvill» и, наконец, сохраняется в памяти. объединяется с "kvill ans" для генерации "kvill ans" ; и присваивает адрес этой строки строке, поскольку "неизменяемость" String генерирует множество временных переменных, поэтому рекомендуется использовать StringBuffer, поскольку StringBuffer изменчивый.