Вопрос:

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

java string

10712 просмотра

10 ответа

809 Репутация автора

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

Автор: splitgames Источник Размещён: 05.07.2013 12:45

Ответы (10)


5 плюса

4673 Репутация автора

Текст внутри двойных кавычек создает буквальный Stringобъект.

String myString = "Some text";

Код выше создает Stringобъект, используя двойные кавычки.

Автор: tristan2468 Размещён: 05.07.2013 12:49

18 плюса

249522 Репутация автора

String получает особую обработку в JLS: это один из двух не примитивных типов, для которых существуют литералы (другой - Class) * .

Из JLS :

Строковый литерал - это ссылка на экземпляр класса `String [...].

* ну, есть также «нулевой тип» с его «нулевым литералом» null, но большинство людей не думают о «нулевом типе» как о правильном типе.

Автор: Joachim Sauer Размещён: 05.07.2013 12:51

15 плюса

183361 Репутация автора

Это особенность языка Java. Строковые литералы в исходном коде получают специальную обработку.

Спецификация языка здесь просто говорит, что строковый литерал имеет Stringтип

Автор: nos Размещён: 05.07.2013 12:52

292 плюса

107664 Репутация автора

Решение

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, и для этого же содержимого нет общего хранилища.

Автор: Suresh Atta Размещён: 05.07.2013 12:53

1 плюс

38697 Репутация автора

Java.lang.Stringэто не просто класс. Это неотъемлемая часть основного языка. У компилятора есть синтаксический сахар для него. Например, ""это как сокращение для new String(""). При написании ""компилятор оптимизирует идентичные строки для одного и того же экземпляра для экономии места."a" + 5 == "a5" ==> true

У компилятора есть синтаксический сахар для множества вещей, включая отсутствие необходимости вставлять / снимать коробку между версиями объекта и их нативными типами, нет родительских средств Object, конструктор по умолчанию, ...

Автор: Sylwester Размещён: 05.07.2013 12:54

50 плюса

2720 Репутация автора

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

  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 ссылаются на разные объекты, например, когда мы инициализируем любые другие объекты. поэтому они неравны по сравнению с ==оператором, тогда как они равны по значениям.

Автор: chetan Размещён: 05.07.2013 12:55

2 плюса

30339 Репутация автора

- String - это класс в Java . Вы правы в этом, поэтому мы всегда можем инициализировать с newключевым словом.

- Но когда мы делаем что-то вроде:

String s = "";

Вышеприведенный оператор помечается компилятором как специальный объект String, а затем JVM во время загрузки класса (загрузка выполняется до инициализации), видит это так называемый строковый литерал , который хранится в пуле строкового литерала .

- Таким образом, String может быть создан с помощью new()и с помощью ""метода, но последний предоставляет строковый литерал, который остается в куче, даже когда нет ссылки на этот строковый объект, поскольку он имеет ссылку из пула строковых литералов.

Автор: Kumar Vivek Mitra Размещён: 05.07.2013 12:56

4 плюса

31606 Репутация автора

Строки очень часто используются в языке программирования. Поскольку 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's String.intern() method gives you the same
       // string object reference for all strings that are equal.
       assertSame("string", new String("string").intern());
    }
Автор: René Link Размещён: 05.07.2013 01:05

2 плюса

644 Репутация автора

Просто чтобы упомянуть. Строковый литерал - это ссылка на экземпляр класса String, который вы можете написать так:

 "ABC" .getBytes ();

 "А: б: в" .split ( ":");

 "愛" .codePointAt (0);
Автор: mkdev Размещён: 05.07.2013 01:47

2 плюса

470 Репутация автора

Java делает для нас двухэтапный процесс.

String str = "hello";

эквивалентно

char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);

Как [.NET] [1] получил похожую вещь.

String(Char[]) constructor

делает

String(char[] value)

Добавление ссылок: -

Автор: user1769790 Размещён: 05.07.2013 07:49
Вопросы из категории :
32x32