powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что не так с Java String и как вы с этим боретесь?
25 сообщений из 293, страница 2 из 12
Что не так с Java String и как вы с этим боретесь?
    #39704351
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene New...можно удалять сразу...

А зачем? Это будет жесткий тормоз.

Например Java new выделяет память не кусочками по байтам, а сразу большим куском для всего thread. Что бы минимизировать время блокировки heap при многопользовательской/многопотоковой обработке. Дальнейшее выделение памяти в Java (new), в оптимале, просто одна ассемблерная инструкция: add указатель_на_свободное_место + выделяемый_размер

В оптимале, т.к. и тут теоретики ООП постарались. Ввели исключение при синхронизации для иммутабельных полей типа final в объектах. Теперь любой new дополнительно требует включение asm инструкций для синхронизации. Но, вроде, читал иследование которое этому было посвещено, потери времени минимальный, единицы процентов (плюс авторы иследования нашли баги в JVM ))) - в ассемблерном коде были перепутаны типы блокировок ))) )

Так же и освобождение. Бесмысленно освобождать по одному объекту. Когда eden (young генерация) заполнится - ее всю сразу и освободят. В оптимале, если в eden только временные объекты, опять таки, одна ассемблерная инструкция ))) Поменять один eden на другой (их два)

P.S.
Как я понимаю, сейчас проблема "иследований" это научить языки оптимально работать с NUMA архитектурой. Никаких алгоритмов более-менее оптимального выделения памяти для NUMA до сих пор не придумано. Пока выделяют первое попавшееся, а потом получают тормоза при выполнении. Но опять таки, это проблема не только JAVA, а практически любого современного языка программирования.
AFAIK
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704353
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewЯ вообще вижу, что в 21 веке часто стали изобретать велосипеды 50-летней давности, по невежеству наступая на все уже пройденные грабли. Например, xml - тупик иерархических БД 1950-1960-х годов.

х.я се. в середине 40х только только появились электронные вычислители которые с натяжкой можно и компьютером то назвать, оказывается через 5 лет на таких уже иерархические бд крутились.

Eugene NewИли среды разработки, которые делают меньше, хуже и медленнее, пожирая дикое количество ресурсов по сравнению с тем, что быстро работало на Pentium-I.

Никто не заставляет пользоваться IDE, берешь notepad++ прогаешь на java, сразу после hello world вернешся назад на IDE. Почти все здесь пробовали в notepad писать. Как видно фанатов notepad здесь не много.
Ну вот тебе навскидку что такое IDE https://martinfowler.com/bliki/PostIntelliJ.html

Eugene NewЧто такого в сборщике мусора от Java, чему повредит досрочное удаление объекта, сделанное без поиска в памяти? Иммутабельные временные переменные, созданные в выражениях, можно удалять сразу именно потому, что они иммутабельные.

Ничему не повредит но скорее всего врядли поможет. Помимо это есть термин фрагментация памяти. Смысл есть если у нас все объекты будут однинакового размера со всеми вытекающими те. все объекты должны быть размером с самый большой объект.
Сборщик не просто чистит но еще и дефрагментирует.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704355
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще название сборщик мусора прижилось, возможно вначале они был сборщиком мусора но по сути это менеджер памяти встроенный в jvm.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704369
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewЧто не так с Java String и как вы с этим боретесь?
Да, еще одна вещь, которая "не так" с Java String

На самом деле, правильный интерфейс, это CharSequence !!!
а String - это конкретная имплементация

НО в большинстве ф-ций языка и 100% библиотк/пользовательского кода, вместо интерфейса CharSequence, забит String ((( Никто, никогда ПРАВИЛЬНО не пишет - CharSequence, все тупо в описании ф-ций гуано-кодят String и не парятся.

Из-за этого, нет возможности сделать свою "правильную" имплементацию ((( Если бы народ не загуано-кодил 100500 миллиардов строк с тупым указанием String (имплементации), а правильно всюду бы использовали CharSequence (интерфейс) - проблемы бы не было. ООП бы рулил.

Но сейчас, весь lagacy код жестко привязан к конкретной имплементации. Поэтому свою имплементацию, при всем желание, сделать уже не получается. Тогда нужно во ВСЕХ ныне существующих библиотеках find-and-replace String на CharSequence заменять и перекомпилировать (((
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704403
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНикто, никогда ПРАВИЛЬНО не пишет - CharSequence
в android везде CharSequence ;)
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704408
chebaaagh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eugene NewGarrick,

вроде того, что такой код плохой

Код: java
1.
2.
3.
4.
String s = "";
for (int i = 0; i < 100; i++) {
    s = s + Integer.toString(i);
}



пожирает память, создавая 100 объектов, причем почему то одновременно.

Потому что у тебя код слишком сложный для escape analysis оптимизации. Вот здесь почитай, как оно работает в java, и в каких случаях объекты не аллоцируются: https://habr.com/company/jugru/blog/322348/

А так да, асбстрактный совершенный компилятор здесь бы ничего не создал кроме финальной строки. Но таких пока нет.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704415
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming, вас еще много открытий ждет. Как говорил Сократ: "я знаю что ничего не знаю".

Leonid Kudryavtsev,
значит, дело в тормозах. Теперь понятно, спасибо.

Я тут сейчас прочитал про новый алгоритм выделения памяти в Java 2017 года - вообще отказаться от сборки мусора и просто ронять программу когда память заканчивается

Никаких алгоритмов более-менее оптимального выделения памяти для NUMA до сих пор не придумано.

IMHO раз в 2000-м году не придумали, сейчас тем более вряд ли что то новое родят.

Под локальные объекты-значения просится стек, но есть опасения, что для строк неограниченной длины потребуется слишком много места в стеке.

По поводу грязного кода - его же сами разработчики Java и наплодили в своих библиотеках, а не народ. Даже грязный Integer.ToString придумал не народ. :-)

Возвращаясь к использованию String. Хотелось бы кое что уточнить.

Мне бы хотелось иметь какие то критерии его использования. Понятно, что в принципе его вообще не надо использовать и бить тапками по голове всех, кто его упомянет в программе, включая самих разработчиков Java.

Непонятно, когда его использовать все таки МОЖНО и это не будет грязным. Ну вроде для хранения константных значений, которые никогда не будем даже читать - можно :) А любая попытка доступа к нему даже для чтения породит копию объекта в куче, которая там будет висеть в потенциале очень долго.

Если по final в функцию передать, сделает копию или нет?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704420
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

CharSequence повялся гораздо позже String

у String контракт на hashCode, без него switch не работает

с CharSequence будут возникать проблемы (ну самое простое: как его использовать в качестве ключа Map?)
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704421
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,

в android везде CharSequence ;)

Неправда.

FontVariationAxis(String tagString, float styleValue)

https://developer.android.com/reference/android/graphics/fonts/FontVariationAxis

Я просто наугад потыкал в справочник, ожидая что первое со строками выпадет.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704422
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene Newlleming, вас еще много открытий ждет. Как говорил Сократ: "я знаю что ничего не знаю".

Leonid Kudryavtsev,
значит, дело в тормозах. Теперь понятно, спасибо.

Я тут сейчас прочитал про новый алгоритм выделения памяти в Java 2017 года - вообще отказаться от сборки мусора и просто ронять программу когда память заканчивается

Никаких алгоритмов более-менее оптимального выделения памяти для NUMA до сих пор не придумано.

IMHO раз в 2000-м году не придумали, сейчас тем более вряд ли что то новое родят.

Под локальные объекты-значения просится стек, но есть опасения, что для строк неограниченной длины потребуется слишком много места в стеке.

По поводу грязного кода - его же сами разработчики Java и наплодили в своих библиотеках, а не народ. Даже грязный Integer.ToString придумал не народ. :-)

Возвращаясь к использованию String. Хотелось бы кое что уточнить.

Мне бы хотелось иметь какие то критерии его использования. Понятно, что в принципе его вообще не надо использовать и бить тапками по голове всех, кто его упомянет в программе, включая самих разработчиков Java.

Непонятно, когда его использовать все таки МОЖНО и это не будет грязным. Ну вроде для хранения константных значений, которые никогда не будем даже читать - можно :) А любая попытка доступа к нему даже для чтения породит копию объекта в куче, которая там будет висеть в потенциале очень долго.

Если по final в функцию передать, сделает копию или нет?

Копия создается только при изменении.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704433
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
Копия создается только при изменении. 



Знающие, прокомментируйте это, пожалуйста. Так ли это или он меня в заблуждение вводит?

Не первое противоречие в данной теме.

String s1 = 'Превед';
String s2 = s1;

Создается копия или нет? По идее да. Так зачем он мне пишет, что "Копия создается только при изменении." ???
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704448
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewЗнающие, прокомментируйте это, пожалуйста. Так ли это или он меня в заблуждение вводит?

Не первое противоречие в данной теме.

String s1 = 'Превед';
String s2 = s1;

Создается копия или нет? По идее да. Так зачем он мне пишет, что "Копия создается только при изменении." ???
Нет конечно
Где тут какое-то создание? (вызов new)
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704458
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene New...Если .... в функцию передать, сделает копию или нет?
Нет конечно.

Еще раз читать книжки по Java для начинающих. AFAIK В Java ВСЕ передачи параметров типа "объект" by reference, а все передачи atomic типов by value.

Разумеется никаких копий объектов при передачи в функцию не будет и быть не может.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704468
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene New...

Почему в Java с первой версии не сделали нормальный string с подсчетом ссылок?

при чем здесь String?
Если подразумевается управление памятью с использованием счетчика ссылок на себя в самом объекте,
то этого механизма памяти в java нет совсем .
Ни для каких объектов.
Управление памятью строится на базе достижимости объектов от переменных -
"корней" графа созданных объектов.
Недостижимые от таких корней объекты удаляются, со временем, сборщиком мусора.

Eugene New Не осилили или были объективные причины?
Мир они так видели.
В целом, надеялись, что этот подход даст им более простые механизмы управления памятью,
а значит, как они верили, более надёжный язык.

Eugene NewКогда все-таки следует или приходится использовать тип String в программах на Java?

Всегда, когда вам требуются ключевые свойства String - иммутабельность, компарабельность и предвычисленность хеш-значения.
И, если вдруг, все три одновременно - то нужны очень-очень специальные основания для того, чтобы думать, чем их заменить.

Eugene NewСтранно сделали разработчики Java - вроде бы сделали тип String с семантикой значения, а не ссылки...

В java вообще нет объектов с "семантикой значения". Совсем, by design.

Eugene NewПод локальные объекты-значения просится стек, но есть опасения, что для строк неограниченной длины потребуется слишком много места в стеке.

Повторю. Никто никуда не просится. Объектов-значений в java просто нет .

PS
Дело ваше, конечно, что и как вам говорить.
Но выглядят ваши тексты как ..., допустим, как слишком толстый троллинг.
Местами - за гранью хамства.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704492
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
String s1 = "Hello";
String s2 = s1;
s2 = "Abc";



s1 = "Hello" - хотя для других объектов было бы новое значение, а не старое. У Java нет перегрузки операторов, но String можно использовать в выражениях с оператором + . При том, что нет атомарного типа - последовательности символов. Поэтому String все же какой то особенный класс, отсюда вопросы про ньюансы его передачи в функции.

хамство.

Никакого хамства, желание разобраться - не более.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704495
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene New
Код: java
1.
2.
3.
String s1 = "Hello";
String s2 = s1;
s2 = "Abc";



s1 = "Hello" - хотя для других объектов было бы новое значение, а не старое. У Java нет перегрузки операторов, но String можно использовать в выражениях с оператором + . При том, что нет атомарного типа - последовательности символов. Поэтому String все же какой то особенный класс, отсюда вопросы про ньюансы его передачи в функции.
Нет никаких ньюансов передачи в функции

Ваш пример и текст - совершенно не понял. В примере, вообще никакого создания объектов на этапе выполнения не будет. Т.к. все строковые константы будут созданы еще в момент загрузки класса. И никаких new у Вас нет.

по исходному вопросу темы (хоть уже и отвечали):

Использовать + с классом String, это гуано-код. Для нормального решения данной задачи, есть StringBuilder/StringBuffer и метод append

Последние версии Java, умеют сами преобразовывать + в StringBuilder/StringBuffer

Но в Вашем исходном примере, дофига лишних вызовов: Integer.toString() и + между String'ами. Хотя, все можно сделать одним вызовом: StringBuilder.append( int )
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704500
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема в конструкции

a = b + c

в том, что Вы неявно говорите, мне нужен объект a, с новым значением a + b.

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

Никакой разницы между Java и другими языками программирования - НЕТ. Счетчик ссылок тут тоже никаким боком помочь не может. Даже строки с фиксированной длиной, помочь не могут. Т.к. их все равно нужно копировать (что не бесплатно! и строки могут быть в 100500 символов)

Т.ч. в любом языке, такая конструкция будет не оптимальной.

Оптимальный вариант, вместо создания 100500 раз разных переменных под временные значения в цикле и многократного копирования строк, один раз выделить буфер и дописывать в его конец... В Java для этого существует класс StringBuilder. В других языках (например "чистый" Basic) и того нет, только многократное копирование строк с места на место.

Ни Java, ни GC, ни счетчик ссылок - тут вообще никаким боком.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704501
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene News1 = "Hello" - хотя для других объектов было бы новое значение, а не старое
почему-это?

Код: java
1.
2.
3.
4.
5.
Object o1 = new Object();
Object o2 = o1;
System.out.println(o1 == o2); // --> true
o2 = new Object();
System.out.println(o1 == o2); // --> false
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704502
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaпочему-это?потому что ссылки
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704505
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaпочему-это?

Запустить... проверить )))
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704509
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
Leonid Kudryavtsev
я не спрашиваю, почему так получается. был приведен пример
Код: java
1.
2.
3.
String s1 = "Hello";
String s2 = s1;
s2 = "Abc";



и утверждение "s1 = "Hello" - хотя для других объектов было бы новое значение"

я привел пример с объектами, идентичный указанному и усомнился в сделаных выводах
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704519
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри. Полностью с тобой согласен.
Просто показалось, что это вопрос Т.С., уже на твой ответ )))

вечер, пора идти пить пиво
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704537
guest2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene New
Код: java
1.
Копия создается только при изменении. 



Знающие, прокомментируйте это, пожалуйста. Так ли это или он меня в заблуждение вводит?

Не первое противоречие в данной теме.

String s1 = 'Превед';
String s2 = s1;

Создается копия или нет? По идее да. Так зачем он мне пишет, что "Копия создается только при изменении." ???

А зачем тут копию создавать. Тут во второй строке ссылка копируется из одной переменной в другую.
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704557
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

. В примере, вообще никакого создания объектов на этапе выполнения не будет. Т.к. все строковые константы будут созданы еще в момент загрузки класса. И никаких new у Вас нет.

Хотелось бы подробностей.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class MyCoolClass
{
   void DoIt ()
   {
      String a;
      String b;
      ...
      a = "Abc";
      b = a;
      b = "Def";
   }
}



Верно ли, что
a = "Abc"
это не
a = new String ("Abc")
?

Что есть строковая константа "Abc"? Объект класса String или что? В момент загрузки какого класса он создается - класса MyCoolClass или какого? Где хранится объект "Abc" (если это вообще объект) - в куче или где то в другом месте?
...
Рейтинг: 0 / 0
Что не так с Java String и как вы с этим боретесь?
    #39704566
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewВерно ли, что
a = "Abc"
это не
a = new String ("Abc")
?

Что есть строковая константа "Abc"? Объект класса String или что? В момент загрузки какого класса он создается - класса MyCoolClass или какого? Где хранится объект "Abc" (если это вообще объект) - в куче или где то в другом месте?
Да, верно

Объект класса String

Собственно последовательность байтиков-букв "Abc", в данном конкретном случае, будет хранится в некоторой специальной области для intern() строк пришедших из class файла. Куча это или нет - вопрос сложный и филосовский.
...
Рейтинг: 0 / 0
25 сообщений из 293, страница 2 из 12
Форумы / Java [игнор отключен] [закрыт для гостей] / Что не так с Java String и как вы с этим боретесь?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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