![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Skipy |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 6 Всего: 16 |
Ну, сам строковый литерал "Hello world!" в пуле таки будет. Так что при сравнении по equals с вновь созданной строкой вернется именно он. Не совсем удачный пример. А вот так - строки точно не будет в пуле (разве что случайно такая окажется ![]()
|
||||||||
|
|||||||||
Evgeni68 |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 9.7.2007 Репутация: 2 Всего: 3 |
Да, действительно, пример не совсем удачный. Но смысл от того что литерал будет в пуле?
Выводом будет FALSE. Метод equals в классе String сначала проверяет равенство ссылок, а затем обычное сравнение строк по символам. В итоге никакого преимущества в скорости от того, что литерал в пуле - нет. Или я чего-то не допонимаю? Поправьте. Это сообщение отредактировал(а) Evgeni68 - 25.9.2010, 09:49 |
||||
|
|||||
Skipy |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 6 Всего: 16 |
Так лучше? А то Вы как-то упустили, что test2 указывает не на тот экземпляр, который в пуле. |
||||||
|
|||||||
danilka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 15.1.2010 Репутация: нет Всего: нет |
||||
|
||||
Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 6 Всего: 16 |
Пул - он один. Еще раз объясняю - строковые литералы существуют только в исходном коде. При компиляции они помещаются в пул строк. И в него же во время исполнения помещаются отсутствующие в нем строки при вызове на них метода intern(). |
|||
|
||||
Evgeni68 |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 9.7.2007 Репутация: 2 Всего: 3 |
Так гораздо лучше! Просто я хотел сказать, что создавать новый инстанс строки, передавая в конструктор литерал - мягко говоря не рационально. |
||||||||
|
|||||||||
danilka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 15.1.2010 Репутация: нет Всего: нет |
То есть правильно ли я понял? Представим что каждая из приведенных ниже строк кода выполняется в новом приложении (пул строк пустой)
|
|||
|
||||
Skipy |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 6 Всего: 16 |
Ага. И Вы на эти грабли наступили... Рассказываю. Допустим, у Вас есть строка. Большая, в несколько тысяч символов. Вы выбираете подстроку, символов 10. Исходная строка выбрасывается. Вопрос. Освобождается ли память, которую занимала эта подстрока? А вот не освобождается! В качестве базы строки берется текущий массив char-ов. И просто выставляется смещение и длина. Но при этом ВСЯ исходная строка, фактически, остается в памяти. Это оптимизация, чтобы избежать копирования (и память дополнительная нужна, и время). А вот конструктор String(String) - он КОПИРУЕТ строку. Т.е. если Вы результаты Вашего substring передадите в копирующий конструктор, несмотря на внешнюю бессмысленность этого действия, - у Вас останется массив из нужных 10 символов. А исходный массив соберется как мусор, если Вы убъете на него ссылки. Так что да, создавать строку на основе литерала прямо в коде - нерационально, если только Вы не хотите, чтобы ссылка была не на объект, находящийся в пуле. Но копирующий конструктор сам по себе - бывает весьма полезен. Добавлено @ 13:35
Да. Да. Нет. "test" помещается в пул - ибо есть строковый литерал. s - по значению в пуле будет, ибо создана на основе литерала. Т.е. вызов s.intern() не приведет к помещению новых данных в пул, а вернет ссылку на "test". А вот ссылка на s - не будет совпадать со сcылкой на "test", т.е. результатом (s =="test") будет false. Это сообщение отредактировал(а) Skipy - 29.9.2010, 13:37 |
||||||
|
|||||||
Evgeni68 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 9.7.2007 Репутация: 2 Всего: 3 |
Спасибо, очень полезно. О копирующем конструкторе не задумывался ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |