Вопрос по java, string – Создание строкового объекта с использованием new и его сравнение с методом intern

0

В книге Кэти Сьерра я читал, что когда мы создаем String с использованием оператора new, например String s = new String (& quot; abc & quot;) и s будет ссылаться на него. Кроме того, буквальное «abc» будет размещен в бассейне.

intern () говорит, что если пул String уже содержит строку, то возвращается строка из пула. В противном случае объект String добавляется в пул и возвращается ссылка на этот объект String.

Если строка & quot; abc & quot; при создании с использованием new также помещает строку в пул, тогда wht делает intern () говорит, что строка из пула возвращается, если строковый пул содержит строку, иначе строковый объект добавляется в пул.

Также я хочу знать, если мы создадим String, используя new, то сколько фактически будет создано объектов?

Ваш Ответ

2   ответа
0

е.

Когда используешьnew String("abc").intern() или используя метод, какString s = "abc"; Пул строк проверяется, если существует ссылка, которая ссылается на «abc».

В случае ссылки на "abc" уже существует в пуле и.intern() вызывается по ссылке, ссылающейся наString object создан с использованиемnew String("abc")затем объект, созданныйnew String("abc") имеет право на сборку мусора. Смотрите код ниже для большей ясности.

public static void main(String[] args) {
    String s = new String("abc");
    String a = s;
    System.out.println(s==a);// true
    String b = "abc";
    s = s.intern();
    System.out.println(s==a);// false
} 
6

TL;DR: Если вам действительно нужноnew String("abc"), вы будете знать, что вам нужно, и вы будете знать, почему. Это настолько редко, что этоalmost справедливо сказать, что вам никогда не нужно. Просто используйте"abc".

Длинная версия:

Когда у вас есть кодnew String("abc") следующие вещи происходят в разное время:

When the class containing that code is loaded, if a string with the characters "abc" is not already in the intern pool, it's created and put there. When the new String("abc") code is run: A reference to the "abc" string from the intern pool is passed into the String constructor. A new String object is created and initialized by copying the characters from the String passed into the constructor. The new String object is returned to you.

If string "abc" when created using new also placed the string in the pool, then why does intern() says that string from the pool is returned if String pool contains the string otherwise the string object is added to the pool.

Потому что это то, чтоintern делает. Обратите внимание, что вызовintern на строковом литерале нет операции; Строковые литералы интернируются автоматически. Например.:

String s1 = "abc";               // Get a reference to the string defined by the literal
String s2 = s1.intern();         // No-op
System.out.println(s1 == s2);    // "true"
System.out.println(s1 == "abc"); // "true", all literals are interned automatically

Also I want to know if we create a String using new then actually how many objects get created?

Вы создаете хотя бы одинString объект (новый, не интернированный) и, возможно, два (если литерал еще не был в пуле; но опять же, этот бит происходит раньше, когда загружаются литералы файла класса):

String s1 = "abc";            // Get a reference to the string defined by the literal
String s2 = new String(s1);   // Create a new `String` object (guaranteed)
System.out.println(s1 == s2); // "false"
String s3 = s2.intern();      // Get the interned version of the string with these characters
System.out.println(s1 == s3); // "true"
Error: User Rate Limit Exceeded Anand
Error: User Rate Limit ExceededinternError: User Rate Limit Exceededintern returnsError: User Rate Limit ExceededString.
Error: User Rate Limit Exceeded"abc"Error: User Rate Limit Exceeded

Похожие вопросы