Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Максимальная длина String 
:(
    Опции темы
batigoal
Дата 4.2.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Есть ли какое-нибудь ограничение на длину строки String? Или я могу ее наращивать, как обычный массив, пока память не кончится?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 4.2.2005, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Integer.MAX_VALUE. Массив большего размера не создать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 7.2.2005, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Ну что ж, вполне достаточно smile
Спасибо


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Zandr
Дата 22.2.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: 9
Всего: 13



Кста....... String наращивать нельзя smile
Если пишем
Код

String s1 = "aaa";
String s1 += "bbb";

то на самом деле происходит примерно следующее:
Код

String s1 = new String( "aaa");
StringBuffer tmpSb = new StringBuffer( s1);
tmpSb.append( new String ( "bbb"));
s1 = tmpSb.toString();

Порой встречается такое:
Код

String s1=....
while(.....) {
   ....
   s1 = s1 + ......
   ....
}

По умолчанию не помню сколько Java выделяет памяти... Что-то около 60-80 метров, и при таком стиле наращивания длина строки не может превысить 30-40 метров (мы не считаем что память используется не только для наших строк). Так что работаем через StringBuffer, причем желательно угадать заранее максимальную длину строки и при создании StringBuffer'а её указать.
И напоследок вопрос: зачем такие строки? Если с большими файлами работаешь - можно попытаться найти альтернативу в nio. Можно строчки поразбить и хранить их в List'е или еще как-нить.

Это сообщение отредактировал(а) Zandr - 26.2.2005, 12:08
PM MAIL   Вверх
Domestic Cat
Дата 22.2.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



ЗЫ

Цитата(Zandr @ 22.2.2005, 00:57)
String s1 = new String( "aaa");
StringBuffer tmpSb = new StringBuffer( s1);
tmpSb.append( new String ( "bbb"));
s1 = tmpSb.toString();


В Java 1.5 используется StringBuilder вместо StringBuffer.


--------------------

PM   Вверх
batigoal
Дата 22.2.2005, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Zandr
Спасибо за совет. Знал же, а не подумал. Учту.
Это может привести к выделению памяти под кучу строк без ее освобождения?

Domestic Cat
Цитата(Domestic @ 22.2.2005, 10:29)
В Java 1.5 используется StringBuilder вместо StringBuffer

Это аналогичный заменитель или есть качественная разница?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Domestic Cat
Дата 22.2.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



StringBuilder быстрее, т.к. не синхронизирован. Он используется там, где гарантированно будет работать 1 тред.


--------------------

PM   Вверх
batigoal
Дата 22.2.2005, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Т.е. только один тред будет работать с моей строкой, да? А если в каждом потоке будет своя строка обрабатываться, то его можно использовать, верно?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Domestic Cat
Дата 22.2.2005, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Конечно.


--------------------

PM   Вверх
Zandr
Дата 26.2.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: 9
Всего: 13



Цитата
Это может привести к выделению памяти под кучу строк без ее освобождения?

Нет, память то будет освобождаться, просто видел один раз как для JME приложения кто-то свою функцию рекомендовал для загрузки файла в кодировке win-1251. Так там в цикле к строчке прибавлялась буковка. Автор функции (а может и не автор) еще заметил, что она медленно работает... Я вот тоже подумал с чего бы это smile
Просто это называется memory burning, или как-то так, когда без толку создается-уничтожается много объектов, когда можно было бы обойтись одним. Кстати, если не задать StringBuffer'у достаточной начальной емкости, то получим примерно тот же эффект.
PM MAIL   Вверх
batigoal
Дата 26.2.2005, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Zandr @ 26.2.2005, 12:13)
Кстати, если не задать StringBuffer'у достаточной начальной емкости, то получим примерно тот же эффект.

Плохо. Строка формируется по записям из БД. В зависимости от настрек пользователя некоторые таблицы загружаются, некоторые нет, т.е. невозможно предугадать необходимую емкость.



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 27.2.2005, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Zandr @ 26.2.2005, 12:13)
если не задать StringBuffer'у достаточной начальной емкости, то получим примерно тот же эффект

StringBuffer при расширении, удваивает буфер. Так что тут ничего особо страшного не будет. Конечно если есть возможность спрогнозировать размер лучше ей пользоваться, но если нет, то StringBuffer работает достаточно рационально.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Sardar
Дата 27.2.2005, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Еще лучше организовать свою структуру на связанных контейнерах строк. Если нужно отредатктировать подстроку разбитую на два контейнера(replace например), то тогда обьеденяем оба контейнера в один. Память при таком подходе практически не засоряется и почти не хаваем лишнего.

Для выборок из БД лучше такие быстрые структуры как HAT.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
batigoal
Дата 27.2.2005, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Sardar @ 27.2.2005, 00:46)
Для выборок из БД лучше такие быстрые структуры как HAT

Что такое НАТ?
У меня выборка происходит не напрямую, а через объект.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Sardar
Дата 27.2.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



HAT структура очень простая и главная её задача эффективно увеличиватся в размерах. Естественно есть куча ограничений, потому и смотрим что конкретно нужно. Обычно выборка из БД это забивание контейнера даными и потом уже обработка. Если запрос не сортирующий и не групирующий, то можно использовать простые быстрые связанные списки, иначе разного рода деревья, позволяющие после набивки без дополнительных усилий представить как надо выборку. Нагрузка на процессор и память при таком подходе минимальная.

Цитата(Lamer @ 4.2.2005, 15:41)
Или я могу ее наращивать, как обычный массив, пока память не кончится?

Для наращивания создай свою стуктуру похожую на связанный список, хранить ты будешь строки. Естественно предлагается интерфейс строки + метод normalize, который разом склеивает все строки в одну для последующей быстрой обработки, если надо. При таком подходе память продублируется в конце(что не необходимо), в момент работы лишнего мусора не будет.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1156 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.