powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / String [constant] pool. Вопросы.
22 сообщений из 22, страница 1 из 1
String [constant] pool. Вопросы.
    #38460461
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Простой вопрос, но вижу на него в Ководствах два разных ответа.
Код: java
1.
String s1 = new String("Summer");

Старое Ководство (Sierra, "SCJP Sun Certified Programmer for Java 6 Exam 310-065" pg. 472) утверждает, что JVM при этом:
1) создаст новый объект в non-pool области, и переменная s1 будет ссылаться на него;
2) добавит литерал "John" в String Pool.

Новое ководство по сдаче 1z0-803 (M. Gupta, "OCA Java SE7, programmer-I, certification guide, prepare for 1z0-803 exam") на странице 178 говорит, что вышеприведенное выражение:Gupta, 1z0-803, pg. 178creates new String object with the value "Summer". This object is not placed in the String constant poolСам объект-то, понятное дело, в пул не будет затолкан. А вот литерал, на основе которого он был создан ("Summer") - что с ним ?
Будет он в пуле или нет ? Если да, то как это понять из кода конструктора в исходнике класса String:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public String(String original) {
        int size = original.count;
        char[] originalValue = original.value;
        char[] v;
        if (originalValue.length > size) {
            // The array representing the String is bigger than the new
            // String itself.  Perhaps this constructor is being called
            // in order to trim the baggage, so make a copy of the array.
            int off = original.offset;
            v = Arrays.copyOfRange(originalValue, off, off+size);
        } else {
            // The array representing the String is the same
            // size as the String, so no point in making a copy.
            v = originalValue;
        }
        this.offset = 0;
        this.count = size;
        this.value = v;
    }

- ?
PS. И еще: содержимое String Pool'a - его как-то можно посмотреть или нет ?
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460486
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisString s1 = new String("Summer");
2) добавит литерал "John" в String Pool.

Здесь 2 экземпляра строки. Один создан через new. Он не в пуле. Первый создан из литерала. Он в пуле.

ozzmosisThis object is not placed in the String constant pool
Сам объект-то, понятное дело, в пул не будет затолкан. А вот литерал, на основе которого он был создан ("Summer") - что с ним ?

Ничего не поменялось. Речь про созданный объект.

ozzmosisЕсли да, то как это понять из кода конструктора в исходнике класса String:

Брр. Сказано же, что вызов констркутора не помещает строку в пул. Вот в конструкторе и ничего нет про пул.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460498
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczПервый создан из литерала. Он в пуле.где в исходниках явы можно увидеть, как она толкает в пул литерал ? и как посмотреть содержимое этого пула ?
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460507
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PS. И что мешает яве задействовать стринговый пул при повторной встрече с тем же самым выражением:
Код: java
1.
String s2 = new String("Summer");

- ?
(в конструкторе используется литерал ==> компилятор должен знать, что прежде чем создавать такой объект, надо бы пошарить в пуле)
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460511
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisгде в исходниках явы можно увидеть, как она толкает в пул литерал ?
String.intern() -> JVM_InternString -> jvm.cpp ->

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// String support ///////////////////////////////////////////////////////////////////////////
JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
  JVMWrapper("JVM_InternString");
  JvmtiVMObjectAllocEventCollector oam;
  if (str == NULL) return NULL;
  oop string = JNIHandles::resolve_non_null(str);
  oop result = StringTable::intern(string, CHECK_NULL);
  return (jstring) JNIHandles::make_local(env, result);
JVM_END



-> sun.jvm.hotspot.memory.StringTable
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460514
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisPS. И что мешает яве задействовать стринговый пул при повторной встрече с тем же самым выражением:
Код: java
1.
String s2 = new String("Summer");



То что адекватный девелопер напишет
String s2 = "Summer";
и получит ссылку на строку из пула.
А если девелопер пишет new String(), то он явно хочет не пулированую строку, которую никто больше нигде в системе не использует.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460538
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczА если девелопер пишет new String(), то он явно хочет не пулированую строку, которую никто больше нигде в системе не использует.Если строки в яве нельзя изменить после своего создания, то что значит "использует" (еще кто-то) ? Ну, пусть через 1 минуту эту строку "используют" уже 100500 раз - и что с того ?
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460576
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisЕсли строки в яве нельзя изменить после своего создания
Ну, как... Не то чтобы совсем "нельзя".

ozzmosis, то что значит "использует" (еще кто-то) ?
Ну, например, синхронизируются на ней.

ozzmosisНу, пусть через 1 минуту эту строку "используют" уже 100500 раз - и что с того ?
Ничего. Это вообще оффтопик пошел. Вопрос не в том как и почему надо писать = new String() и = "".
А в том, что фактически при этом происходит в JVM.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460612
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВопрос не в том как и почему надо писать = new String() и = "".
А в том, что фактически при этом происходит в JVM.пардон, но мой вопрос был в другом: почему JVM не смотрит сначала в String Pool, чтобы взять оттуда строку и присвоить новой переменной адрес этой строки, когда натыкается на второе и последующие выражения типа такого:
Код: java
1.
String s2 = new String("Summer");

(в предположении, что String s1 = new String("Summer"); - уже "проскакивало" до того).
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460621
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisпардон, но мой вопрос был в другом: почему JVM не смотрит сначала в String Pool, чтобы взять оттуда строку и присвоить новой переменной адрес этой строки, когда натыкается на второе и последующие выражения типа такого:
Код: java
1.
String s2 = new String("Summer");

(в предположении, что String s1 = new String("Summer"); - уже "проскакивало" до того).
Пардон, я на этот вопрос уже ответил. Повторять в теме одно и то же не обязательно.
15109418
Если что-то не понятно в ответе, то задайте вопрос в контексте ответа.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460633
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже в JavaDoc вышеприведенного конструтора написано
RTFMUnless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.
Простыми словами - "вам этот конструктор 300 лет не нужен, пока вы не решите явно создавать копии." При этом совершенно не важно по какой причине кто-то захочет создавать эти копии. Главное что такая возможность есть.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460740
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczozzmosisпардон, но мой вопрос был в другом: почему JVM не смотрит сначала в String Pool, чтобы взять оттуда строку и присвоить новой переменной адрес этой строки, когда натыкается на второе и последующие выражения типа такого:
Код: java
1.
String s2 = new String("Summer");

(в предположении, что String s1 = new String("Summer"); - уже "проскакивало" до того).
Пардон, я на этот вопрос уже ответил. Повторять в теме одно и то же не обязательно.
15109418
Если что-то не понятно в ответе, то задайте вопрос в контексте ответа.я прочитал внимательно и этот ответ, и исходник String.java (где говорится про "use of this constructor is unnecessary"). Напрашивается единственный вывод: юзать этот конструктор могут либо неадекваты, либо те, кто пишет код и сразу же делает "закладку" для решения проблем (за счет заказчика, разумеется :)).
Зачем он тогда вообще в языке оставлен ? "Проcто, чтобы было" ??
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460754
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisя прочитал внимательно и этот ответ, и исходник String.java (где говорится про "use of this constructor is unnecessary"). Напрашивается единственный вывод: юзать этот конструктор могут либо неадекваты, либо те, кто пишет код и сразу же делает "закладку" для решения проблем (за счет заказчика, разумеется :)).
Зачем он тогда вообще в языке оставлен ? "Проcто, чтобы было" ??
Никогда не говори "никогда". Это тяжело взять и сходу представить зачем что-то нужно. А вот когда в ответственный момент оно резко понадобиться, а его вдруг нет, то это намного хуже.

https://www.google.com/search?q=any reason to use String constructor
->
http://stackoverflow.com/questions/465627/use-of-the-stringstring-constructor-in-java
->
http://kjetilod.blogspot.com/2008/09/string-constructor-considered-useless.html

Но статья может быть не актуальной. В последних апдейстах Java 7 менялось внутреннее представление строки в классе String.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460807
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczвот когда в ответственный момент оно резко понадобиться, а его вдруг нет, то это намного хуже.

https://www.google.com/search?q=any reason to use String constructor
->
http://stackoverflow.com/questions/465627/use-of-the-stringstring-constructor-in-java
->
http://kjetilod.blogspot.com/2008/09/string-constructor-considered-useless.html

Но статья может быть не актуальной. В последних апдейстах Java 7 менялось внутреннее представление строки в классе String.Спасибо, ушёл читать.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460812
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis,
извините что не по теме, но это вам для чего?
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460814
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisЗачем он тогда вообще в языке оставлен ? "Проcто, чтобы было" ??
To
Код: java
1.
s = s.substring(1,3);

or not to
Код: java
1.
s = new String(s.substring(1,3));

That is the question.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460828
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38460859
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Ну да - начиная с 7u6 оно не требуется. Но общий принцип поясняет.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38462709
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapeckerozzmosis,
извините что не по теме, но это вам для чего?Результаты глубокого бурения в итоге оседают на дне подкорки :-)
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38462724
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz http://kjetilod.blogspot.com/2008/09/string-constructor-considered-useless.html

Но статья может быть не актуальной. В последних апдейстах Java 7 менялось внутреннее представление строки в классе String.Еще раз - большое спасибо, особенно за этот тынц. Весьма познавательно.
ps. вот и думай теперь, ЧТО хотели сказать авторы класса String:
String docUnless an explicit copy of {@code original} is needed, use of this constructor is unnecessary since Strings are immutable.А оказывается, тут целая собака порылась:
k0deif you have some code like this:

Код: plaintext
1.
2.
3.
    // imagine a multi-megabyte string here
    String s = "0123456789012345678901234567890123456789";
    String s2 = s.substring(0, 1);
     s = null; 

You'll now have a String s2 which, although it seems to be a one-character string, holds a reference to the gigantic char array created in the String s. This means the array won't be garbage collected , even though we've explicitly nulled out the String s!

The fix for this is to use our previously mentioned "useless" String constructor like this:

Код: plaintext
String s2 = new String(s.substring(0, 1));

It's not well-known that this constructor actually copies that old contents to a new array if the old array is larger than the count of characters in the string. This means the old String contents will be garbage collected as intended. Happy happy joy joy.
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38462794
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczozzmosisString s1 = new String("Summer");
2) добавит литерал "John" в String Pool.

Здесь 2 экземпляра строки. Один создан через new. Он не в пуле. Первый создан из литерала. Он в пуле.


Интересно, а можно ли что-то написать, и что, на Java, чтобы создавалась только одна строка ?
...
Рейтинг: 0 / 0
String [constant] pool. Вопросы.
    #38463257
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivИнтересно, а можно ли что-то написать, и что, на Java, чтобы создавалась только одна строка ?
Код: java
1.
System.out.println("адын, савсэм адын!");

:-)
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / String [constant] pool. Вопросы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]