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



Если String-это класс, как и любой другой, как его можно инициализировать с помощью двойных кавычек?

435   10  

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

enter image description here

Примечание :строковые литералы хранятся в общем пуле. Это облегчает совместное использование хранилища для строк с одинаковым содержимым для сохранения хранилища. String объекты, выделенные с помощью оператора new, хранятся в heap, и нет совместного использования хранилища для того же содержание.

Java обрабатывает строку как специальный класс, вы можете инициализировать в обоих направлениях

  1. прямое назначение литерал

    String a = "adsasdf";
    
  2. как и другие объекты, используя новое ключевое слово

    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

    Ничего не найдено.