Если String является классом, как и любой другой, как его можно инициализировать с помощью двойных кавычек?
Как инициализировать строку с помощью ""?
Ответ 1
Java String является специальным
Дизайнеры Java решили сохранить примитивные типы в объектно-ориентированном языке, вместо того чтобы сделать все объектом, чтобы улучшить производительность языка. Примитивы хранятся в стеке вызовов, которые требуют меньше пространства для хранения и дешевле манипулировать. С другой стороны, объекты хранятся в куче программы, что требует сложного управления памятью и большего объема пространства для хранения.
По соображениям производительности Java String предназначена для того, чтобы находиться между примитивным и классом.
Например
String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // same reference
String s4 = new String("Hello"); // String object
String s5 = new String("Hello"); // String object
** Примечание: *** Строковые литералы * хранятся в общем пуле. Это облегчает совместное использование хранилищ для строк с одним и тем же содержимым для сохранения хранилища. String
объекты, выделенные новым оператором, хранятся в heap
, и нет совместного использования хранилища для одного и того же содержимого.
Ответ 2
Java рассматривает String как особый класс, вы можете инициализировать в обоих направлениях
-
Непосредственное назначение литерала
String a = "adsasdf";
-
Как и другие объекты, использующие новое ключевое слово
String a = new String("adsasdf");
Вам нужно проявлять особую осторожность, когда вы хотите сравнить с знаком ==
:
String a = "asdf";
String b = "asdf";
System.out.println(a == b); // True
System.out.println(a.equals(b)); // True
String a = new String("asdf");
String b = new String("asdf");
System.out.println(a == b); // False
System.out.println(a.equals(b)); // True
Это потому, что в первом случае объекты a и b хранятся в чем-то, называемом literal pool
, и оба они ссылаются на один и тот же объект, чтобы они были одинаковыми в обоих направлениях.
Но во втором случае a и b ссылаются на разные объекты, например, когда мы инициализируем любые другие объекты. поэтому они не равны по сравнению с оператором ==
, тогда как они равны в значениях.
Ответ 3
String получает специальное обращение в JLS: это один из двух непримитивных типов, для которых существуют литералы (другая Class
) *.
Из JLS:
Строковый литерал является ссылкой на экземпляр класса `String [...].
* хорошо, там также "нулевой тип" с ним "нулевой литерал" null
, но большинство людей не знает, t думаю о "нулевом типе" как о правильном типе.
Ответ 4
Это особенность языка Java. Строковые литералы в исходном коде подвергаются специальной обработке.
Спецификация языка здесь, просто говорит, что строковый литерал имеет String
type
Ответ 5
Текст внутри двойных кавычек создает литерал String
.
String myString = "Some text";
Приведенный выше код создает объект String
, используя двойные кавычки.
Ответ 6
Строки очень часто используются на языке программирования. Поскольку java объектно-ориентированная строка является объектом. Чтобы избежать громоздкой новой String ( "someString" ); оператор каждый раз, когда вам нужен строковый объект java, вы можете просто создать строковый объект, используя строковый литерал.
Но вы должны иметь в виду равенство строк. Вот короткий тест JUnit, чтобы продемонстрировать, что я имею в виду.
@Test
public void stringTest() {
// a string literal and a string object created
// with the same literal are equal
assertEquals("string", new String("string"));
// two string literals are the same string object
assertSame("string", "string");
// a string literal is not the same object instance
// as a string object created with the same string literal
assertFalse("string" == new String("string"));
// java String.intern() method gives you the same
// string object reference for all strings that are equal.
assertSame("string", new String("string").intern());
}
Ответ 7
- Строка - это класс в Java. Вы правы в этом, поэтому мы всегда можем инициализировать с помощью ключевого слова new
.
- Но когда мы делаем что-то вроде:
String s = "";
Вышеуказанный оператор отмечен компилятором как специальный объект String, а затем JVM во время загрузки класса (загрузка выполняется перед инициализацией), видит это так называемый строковый литерал, который хранится в строковом литеральном пуле.
-. Таким образом, String может быть создана с помощью new()
и методом ""
, но последний предоставляет строковый литерал, который остается в куче, даже если нет ссылки к этому строковому объекту, потому что он имеет ссылку из пула строковых литералов.
Ответ 8
Просто чтобы упомянуть. Строковый литерал - это ссылка на экземпляр класса String, который вы можете написать следующим образом:
"abc".getBytes(); "a:b:c".split(":"); "愛".codePointAt(0);
Ответ 9
Java выполняет для нас двухэтапный процесс.
String str = "hello";
эквивалентно
char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);
Как [.NET] [1], вы получили аналогичную вещь.
String(Char[]) constructor
делает
String(char[] value)
Добавление ссылок: -
Ответ 10
Java.lang.String
- это не просто класс. Это неотъемлемая часть основного языка. У компилятора есть синтаксический сахар. Например, ""
является аббревиатурой new String("")
. При написании ""
компилятор оптимизирует идентичные строки для одного и того же экземпляра для экономии места. "a" + 5 == "a5" ==> true
У компилятора есть синтаксический сахар для большого количества вещей, в том числе не иметь в коробке /unbox между объектными версиями и их родными типами, ни один родительский объект Object, конструктор по умолчанию,...