10 ответов:
строка Java является специальной
разработчики Java решили сохранить примитивные типы в объектно-ориентированном языке, вместо того, чтобы делать все объектом, чтобы улучшить производительность языка. Примитивы хранятся в стеке вызовов, который требует меньше места для хранения и дешевле манипулировать. С другой стороны, объекты хранятся в куче программ, которые требуют сложного управления памятью и складских помещений.
по причине производительности строка Java предназначена для того, чтобы быть между примитивом и классом.
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объекты, выделенные с помощью оператора new, хранятся вheap, и нет совместного использования хранилища для того же содержание.
Java обрабатывает строку как специальный класс, вы можете инициализировать в обоих направлениях
прямое назначение литерал
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 ссылаются на разные объекты, например, когда мы инициализируем любые другие объекты. так что они неравны по сравнению с
==оператор, тогда как они равны по значениям.
строка получает специальное обращение в JLS: это один из двух непримитивных типов, для которых существуют литералы (другой
Class)*.С JLS:
строковый литерал-это ссылка на экземпляр класса String `[...].
* ну, есть еще "нулевой тип" С его "нулевой литерал"
null, но большинство людей не думают о "нулевой тип" как правильный тип.
Это особенность языка Java. Строковые литералы в исходном коде получают специальную обработку.
спецификация языка,здесь, просто говорит, что строковый литерал-это
Stringтип
строки очень часто используются в языке программирования. Поскольку java является объектно-ориентированным, строка является объектом. Чтобы избежать громоздкой новой строки ("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's String.intern() method gives you the same // string object reference for all strings that are equal. assertSame("string", new String("string").intern()); }
просто упомянуть. В строковый литерал-это ссылка на экземпляр класса String можно написать такой код:
"abc".getBytes(); "a:b:c".split(":"); "愛".codePointAt(0);
- String-это класс в Java. Вы правы, поэтому мы всегда можем инициализировать с
newключевое слово.- но когда мы делаем что-то вроде:
String s = "";приведенное выше утверждение отмечено символом компилятор быть специальный строковый объект а то JVM во время загрузки класса (загрузка выполняется до инициализации), видит это то, что известно как a строковый литерал, хранящийся в строковый литерал бассейн.
- таким образом, строка может быть создана с помощью
new()и""способ, но latter предоставляет строковый литерал, который остается в куче, даже если нет ссылки на этот строковый объект, потому что он имеет ссылку из пула строковых литералов.
Java делает двухэтапный процесс для нас.
String str = "hello";эквивалентно
char data[] = {'h', 'e', 'l' , 'l', 'o'}; String str = new String(data);как [.NET] [1] получил аналогичную вещь.
String(Char[]) constructorтут
String(char[] value)добавление ссылок:-
Java.lang.String- Это не просто класс. Это неотъемлемая часть языка. Компилятор синтаксический сахар для него. Например,""это как аббревиатура дляnew String(""). Когда написано""компилятор оптимизирует одинаковые строки для одного экземпляра, чтобы сэкономить место."a" + 5 == "a5" ==> trueкомпилятор имеет синтаксический сахар для многих вещей, в том числе не нужно вставлять / распаковывать между версиями объектов и их родными типами, нет родительского объекта, конструктора по умолчанию, ...

Comments