-
s = new String("xyz"); Сколько строковых объектов создано? Один — «xyx», а другой — ссылочный объект, указывающий на «xyx».
String s="Hello";int i=3; s=i+s; Правильно ли это выражение? В Java отображается сообщение о несоответствии типа данных. Потому что строка — это класс! Правильный подход: s+="3" или s+='3' или s+=(char)i;
Мы собираемся представить еще один способ создания объектов String — текст, заключенный в кавычки. Этот метод уникален для String и сильно отличается от нового метода.
В виртуальной машине JAVA (JVM) имеется пул строк, в котором хранится множество объектов String, и его можно использовать совместно, что повышает эффективность. String a="abc";, когда эта строка кода выполняется, виртуальная машина JAVA сначала ищет в пуле строк, чтобы определить, существует ли уже такой объект со значением "abc". Основанием для принятия решения является класс String, равный(Object). obj) Возвращаемое значение метода. Если да, то новый объект не будет создан, и будет возвращена прямая ссылка на существующий объект; в противном случае сначала будет создан объект, затем добавлен в пул строк, а затем будет возвращена его ссылка.
Создание строковых объектов: из-за широкого использования строковых объектов [это объект, вообще говоря, объекты всегда выделяют память в куче] в Java, чтобы сэкономить пространство памяти и время выполнения [например, при сравнении строк, == лучше, чем равенства()], все строковые литералы помещаются в пул литералов на этапе компиляции, а пул литералов времени выполнения становится частью пула констант. Преимущество пула литералов в том, что все одинаковые строковые константы в пуле объединяются и занимают только одно пространство. Мы знаем, что для двух ссылочных переменных используйте ==, чтобы определить, равны ли их значения [ссылки], то есть указывают ли они на один и тот же объект:
Теперь посмотрим на оператор String s = new String("abc"); Здесь "abc" сам по себе является объектом в пуле, и когда во время выполнения выполняется new String(), в пул помещается копия объекта. в куче и передать ссылку на этот объект в куче s. ок, этот оператор создает 2 объекта String.
String s1 = new String("abc") ;String s2 = new String("abc") ;if( s1 == s2 ){ //Инструкция, которая не будет выполнена}
// Сколько строковых объектов было создано [три, один в пуле и два в куче. ]
В пул строк будут добавлены только новые объекты, созданные соединением «+» между объектами String, созданными с использованием кавычек для включения текста. Для всех выражений подключения «+», которые содержат новые объекты, созданные в новом методе (включая значение null), создаваемые ими новые объекты не будут добавлены в пул строк.
1.== означает, что на них ссылаются из одного и того же объекта, а Equals() означает, что значения равны.
String str1 = "abc"; указанный объект находится в стеке (или пуле строк).
String str1 =new String ("abc"); Объект, на который ссылаются, находится в памяти/куче.
2.String str1 = "строка в стеке";
String str3 = "str" в стеке;
String str4 = "ing" в стеке;
String str2 = str3+str4; в куче, поскольку функция знака + — вернуть другой вновь созданный объект String вместо поиска строкового значения в стеке. Если это String str2 = "str"+"ing", то окончательный результат находится в стеке. str1==str2 верно.
Но есть одна ситуация, которая требует нашего внимания. Пожалуйста, посмотрите на код ниже:
общественный класс StringStaticTest {
public static Final String A = "ab" // константа A;
public static Final String B = "cd" // константа B;
public static void main(String[] args) {
String s = A + B // Инициализируем s, соединяя две константы с помощью +;
Строка т = «abcd»;
если (s == t) {
System.out.println("s равно t, это один и тот же объект");
} еще {
System.out.println("s не равно t, это не один и тот же объект");
}
}
}
Результат запуска этого кода следующий:
s равно t, это один и тот же объект
Причина в том, что в приведенном выше примере A и B являются константами и их значения фиксированы, поэтому значение s также фиксировано и определяется при компиляции класса. То есть: String s=A+B эквивалентно: String s="ab"+"cd";
Позвольте мне немного изменить приведенный выше пример и посмотреть, что произойдет:
общественный класс StringStaticTest {
public static Final String A // константа A;
public static Final String B // константа B;
статический {
А = «аб»;
Б = «компактный диск»;
}
public static void main(String[] args) {
// Инициализируем s, соединяя две константы с помощью +
Строка s = A + B;
Строка т = «abcd»;
если (s == t) {
System.out.println("s равно t, это один и тот же объект");
} еще {
System.out.println("s не равно t, это не один и тот же объект");
}
}
}
Результат его работы таков:
s не равно t, это не один и тот же объект
Просто внес небольшое изменение, и результат прямо противоположный приведенному сейчас примеру. Давайте еще раз проанализируем. Хотя A и B определены как константы (их можно назначить только один раз), они не назначаются сразу. Прежде чем значение s будет вычислено, когда они присваиваются и какое значение им присваивается, все это переменные. Следовательно, A и B ведут себя как переменные, прежде чем им будет присвоено значение. Тогда s не может быть определен во время компиляции, а может быть создан только во время выполнения.
Наконец, давайте поговорим о хранении объектов String в виртуальной машине JAVA (JVM) и взаимосвязи между пулом строк, кучей и стеком. Давайте сначала рассмотрим разницу между кучей и стеком:
Стек: в основном сохраняет базовые типы (или встроенные типы) (char, byte, short, int, long, float, double, boolean) и ссылки на объекты. Данные могут быть разделены, и его скорость уступает только скорости регистрации. куча.
Куча: используется для хранения объектов.
Когда мы посмотрим на исходный код класса String, мы обнаружим, что у него есть атрибут value, в котором хранится значение объекта String. Тип — char[], что также показывает, что строка представляет собой последовательность символов. При выполнении String a="abc"; виртуальная машина JAVA создает в стеке три символьных значения 'a', 'b' и 'c', а затем создает в куче объект String, его значение (value ) представляет собой массив из трех только что созданных значений char {'a', 'b', 'c'}. Наконец, вновь созданный объект String будет добавлен в пул строк.
Если затем мы выполним код String b=new String("abc"); поскольку "abc" был создан и сохранен в пуле строк, виртуальная машина JAVA создаст только новый объект String в куче, но это будет value — это три значения типа char «a», «b» и «c», созданные в стеке при выполнении предыдущей строки кода.
К этому моменту нам уже вполне ясен вопрос о том, почему String str=new String("abc"), поднятый в начале этой статьи, создает два объекта.
Эта статья взята из блога CSDN. При перепечатке указывайте источник: http://blog.csdn.net/yakihappy/archive/2009/03/10/3977169.aspx.
Эта статья взята из блога CSDN. При перепечатке указывайте источник: http://blog.csdn.net/Foxalien/archive/2009/12/18/5029470.aspx.
-