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

Простой вопрос, но вижу на него в Ководствах два разных ответа.
Код: 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
11.11.2013, 14:55:08
    #38460486
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
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
11.11.2013, 14:59:34
    #38460498
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
BlazkowiczПервый создан из литерала. Он в пуле.где в исходниках явы можно увидеть, как она толкает в пул литерал ? и как посмотреть содержимое этого пула ?
...
Рейтинг: 0 / 0
11.11.2013, 15:03:59
    #38460507
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
PS. И что мешает яве задействовать стринговый пул при повторной встрече с тем же самым выражением:
Код: java
1.
String s2 = new String("Summer");

- ?
(в конструкторе используется литерал ==> компилятор должен знать, что прежде чем создавать такой объект, надо бы пошарить в пуле)
...
Рейтинг: 0 / 0
11.11.2013, 15:05:03
    #38460511
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
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
11.11.2013, 15:06:52
    #38460514
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
ozzmosisPS. И что мешает яве задействовать стринговый пул при повторной встрече с тем же самым выражением:
Код: java
1.
String s2 = new String("Summer");



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

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

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

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

(в предположении, что String s1 = new String("Summer"); - уже "проскакивало" до того).
Пардон, я на этот вопрос уже ответил. Повторять в теме одно и то же не обязательно.
15109418
Если что-то не понятно в ответе, то задайте вопрос в контексте ответа.
...
Рейтинг: 0 / 0
11.11.2013, 16:14:34
    #38460633
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
Даже в JavaDoc вышеприведенного конструтора написано
RTFMUnless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.
Простыми словами - "вам этот конструктор 300 лет не нужен, пока вы не решите явно создавать копии." При этом совершенно не важно по какой причине кто-то захочет создавать эти копии. Главное что такая возможность есть.
...
Рейтинг: 0 / 0
11.11.2013, 17:13:07
    #38460740
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
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
11.11.2013, 17:19:29
    #38460754
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
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
11.11.2013, 17:41:39
    #38460807
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
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
11.11.2013, 17:43:01
    #38460812
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
ozzmosis,
извините что не по теме, но это вам для чего?
...
Рейтинг: 0 / 0
11.11.2013, 17:43:51
    #38460814
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
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
11.11.2013, 17:48:23
    #38460828
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
...
Рейтинг: 0 / 0
11.11.2013, 18:00:46
    #38460859
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
Blazkowicz,

Ну да - начиная с 7u6 оно не требуется. Но общий принцип поясняет.
...
Рейтинг: 0 / 0
12.11.2013, 21:37:25
    #38462709
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
javapeckerozzmosis,
извините что не по теме, но это вам для чего?Результаты глубокого бурения в итоге оседают на дне подкорки :-)
...
Рейтинг: 0 / 0
12.11.2013, 21:51:38
    #38462724
ozzmosis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
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
12.11.2013, 22:45:58
    #38462794
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
String [constant] pool. Вопросы.
BlazkowiczozzmosisString s1 = new String("Summer");
2) добавит литерал "John" в String Pool.

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


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

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


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