разница в том, что первый вариант — это оператор присваивания, а второй — создание нового объекта в хипе (который впоследствии может быть и удален из хипа) ну и присваивание тоже. возьмите декомпилятор и проверьте. от присваивания переменной [допустимого для ее типа] значения размер хипа и его фрагментация не изменяется. Не знаю как найти в официальной документации по жаве такую банальную вещь. Предлагаю вам самостоятельно проверить и аргументированно опровергнуть, если вас что-то в моих словах не устраивает. В конце концов, ну запустите вы фуу и бар и посмотрите как будет вести себя хип и как будет работать GC
побойтесь бога! если бы конструкция String a=«hello»; размещала бы (на этапе рантайма программы, разумеется) в хипе новый объект типа String, то откуда вообще в этом стринге возьмутся последовательно составленные символы h-e-l-l-o? Дело как раз в том и состоит, что код навроде вот такого никаким боком ничего не меняет в хипе
public void foo ( )
{
while ( true )
{
String a = "hello";
String b = "apple";
String c = "banana";
String d = "apricot";
String e = "pear";
//
a = null;
b = null;
c = null;
e = null;
}
}
в отличии от вот такого:
public void bar ( )
{
while ( true )
{
String a = new String ( "hello" );
String b = new String ( "apple" );
String c = new String ( "banana" );
String d = new String ( "apricot" );
String e = new String ( "pear" );
//
a = null;
b = null;
c = null;
e = null;
}
}
на что я и постарался обратить внимание топикстартера
я принимаю претензию о неверной терминологии. я имел в виду, что объект типа String будет создан на стадии загрузки класса и не будет выгружен. далее в программе манипуляции типа String a=«hello»; String b=a; a=null; b=«world»; b=null; ничего с хипом не делают вообще(!). Перечитайте оригинальную статью начиная со слов «Давайте посмотрим на пример. Допустим, у нас есть следующий код:» и посмотрите на код.
Надо понимать, что «сложение» и «сложение xx-битных чисел в компьютере» вообще говоря разные операции. Эксепшен — это «все, финиш, приехали». А переполнение при том же сложении — это заранее оговоренная в документации особенность работы конкретного процессора.
> но в некоторых особо точных расчётах и его может не хватить
вот это я и пытаюсь спросить — каким образом вы собираетесь делать «особо точные расчеты», если не использовать те же алгоритмы с увеличенной разрядностью? ладно, умножение в столбик я представляю как реализовать. а деление и прочие синусы?
Хорошо, предположим что ваш тезис о недопустимости финансовых расчетов с помощью арифметики с плавающей точкой верен. А какие в таком случае альтернативы? Если имеется счет, на который была внесена сумма в ххх.xx рублей с процентной ставкой yy.yy% в месяц и накопительным процентом (я забыл как называется этот термин правильно) — то какая сумма должна быть на счете через z1 дней, если через z2 дней клиент захочет снять треть вклада? Посчитайте это без использования плавающей точки, перемножьте на количество клиентов в банке и сравните получившиеся погрешности. Так или иначе придется «вручную» совершать те же операции нормализации и округления до приемлемых порядков.
[каламбур]Множество действительных чисел бесконечно[/каламбур]
Велик и могуч русский язык :) Но как раз слово «конечно» в обиходе является синонимом «обозримо мозгом, имеет начало и конец» и поэтому будет антонимом для «несчетно, неисчислимо, бесконечно».
String a = «hello»;
// делаем чего-нибудь
a = null;
При этой операции сама строка «hello» никуда из памяти не денется. Ибо это вообще константная строка, которая загружается раз и навсегда при загрузке класса. Так что хипа от операции «a = null» больше не станет. И фрагментация хипа существено не изменится.
Разбиение описания (в том числе программы) на отдельные фрагменты служит единственной цели — уменьшению сложности описания объекта. Даже пятилетнему ребенку можно объяснить что самолет — это фюзеляж, хвост и два крыла и он летает. Подробности создания дюралюминия для заклепок корпуса, принципа действия двигателя реактивной тяги и основы аэродинамики жесткого крыла скрыто в имплементации (то бишь в подзадачах).
я живу в мире, в котором используется jdk1.3 и jdk1.4
имя этому миру — j2me
да в общем-то не в этом примере дело — подобные подходы, когда за счет какого-то ловкого фокуса можно достичь определенного результата существуют в разных языках (и даже сферах отличных от айти). если заранее в формулировке задания про ФиззБузз работодатель не сообщает дополнительные сведения, то соискатель с очень большой долей вероятности «промахнется» мимо того решения, которое предполагал работодатель как идеальное.
я сперва по привычке пролистнул комментарий в начале класса и просто начал читать методы.
на четвёртом методе понял, что меня дурачат, пролистал вниз (и вправо), на 5 секунд задумался о том, зачем это нужно было автору, прикинул что единственный известный мне резон поступать так — это оптимизировать то, что по каким-то причинам не оптимизируется компилятором/обфускатором.
вернулся на начало текста, прокитал комментарий и подтвердился в своей правоте (хотя еще проверю потом сам в помощью java-декомпилятора). может быть и воспользуюсь сам таким фокусом в моей программ, ибо как в некоторых случаях (в моем случае по крайней мере) я соглашусь на некоторую потерю «читабельности» кода ради выигрыша по памяти, объему, [скорости].
так что у меня к этому комментарий «УУУУУУУУУУУУУ!!!!!!»
В принципе, если меня попросят «выписать рецепт на аспирин» — я тоже «зависну» на пару дней, потому что заканчивал вовсе не медицинский факультет. Да и на перле, руби, питоне этот пример не напишу сходу. Да что там говорить — на бейсике не смогу, так как последний раз писал на бейсике 20 лет назад на ямахе MSX. Специалист подобен флюсу — он однобок. Я лично не пытаюсь перечислить в CV языки, на которых я могу написать только «Hello, World»
в отличии от вот такого:
на что я и постарался обратить внимание топикстартера
Надо понимать, что «сложение» и «сложение xx-битных чисел в компьютере» вообще говоря разные операции. Эксепшен — это «все, финиш, приехали». А переполнение при том же сложении — это заранее оговоренная в документации особенность работы конкретного процессора.
вот это я и пытаюсь спросить — каким образом вы собираетесь делать «особо точные расчеты», если не использовать те же алгоритмы с увеличенной разрядностью? ладно, умножение в столбик я представляю как реализовать. а деление и прочие синусы?
[каламбур]Множество действительных чисел бесконечно[/каламбур]
Велик и могуч русский язык :) Но как раз слово «конечно» в обиходе является синонимом «обозримо мозгом, имеет начало и конец» и поэтому будет антонимом для «несчетно, неисчислимо, бесконечно».
// делаем чего-нибудь
a = null;
При этой операции сама строка «hello» никуда из памяти не денется. Ибо это вообще константная строка, которая загружается раз и навсегда при загрузке класса. Так что хипа от операции «a = null» больше не станет. И фрагментация хипа существено не изменится.
имя этому миру — j2me
да в общем-то не в этом примере дело — подобные подходы, когда за счет какого-то ловкого фокуса можно достичь определенного результата существуют в разных языках (и даже сферах отличных от айти). если заранее в формулировке задания про ФиззБузз работодатель не сообщает дополнительные сведения, то соискатель с очень большой долей вероятности «промахнется» мимо того решения, которое предполагал работодатель как идеальное.
я сперва по привычке пролистнул комментарий в начале класса и просто начал читать методы.
на четвёртом методе понял, что меня дурачат, пролистал вниз (и вправо), на 5 секунд задумался о том, зачем это нужно было автору, прикинул что единственный известный мне резон поступать так — это оптимизировать то, что по каким-то причинам не оптимизируется компилятором/обфускатором.
вернулся на начало текста, прокитал комментарий и подтвердился в своей правоте (хотя еще проверю потом сам в помощью java-декомпилятора). может быть и воспользуюсь сам таким фокусом в моей программ, ибо как в некоторых случаях (в моем случае по крайней мере) я соглашусь на некоторую потерю «читабельности» кода ради выигрыша по памяти, объему, [скорости].
так что у меня к этому комментарий «УУУУУУУУУУУУУ!!!!!!»