Как инициализировать строку с помощью ""?

Если 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

enter image description here

** Примечание: *** Строковые литералы * хранятся в общем пуле. Это облегчает совместное использование хранилищ для строк с одним и тем же содержимым для сохранения хранилища. 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, конструктор по умолчанию,...