[flame]разве ява годный язык? [re: php порвало яву]

stm6692945

Хорошо, теперь это сириоус тред и вот сириоус вопросы к жабе:
- где замыкания?
- где лямбды?
- где свойства?
- где шаблоны? Разработчики Sun вынуждены только облизываться. Даже генерики, введённые в 5-й версии Java — не более, чем syntactic sugar. Дотнетовские генерики это реально поддерживаемые платформой типы, которые расширяются на лету при загрузке, котрые оптимизируются JIT-компилятором. Для Java генерики существуют только в коде и ни JIT, ни загрузчик классов их никогда не видит. Поэтому проблемы боксинга, преобразования типов в runtime просто скрыты от программиста.
- где делегаты/евенты?
- где partial-классы?
- где детерминированное освобождение ресурсов
(ключевое слово using + интерфейс IDisposable)?
- где оптимизация JVM для расширений процессоров?
- где аналог linq и в частности удобные мапперы?
- где расширения методов класса?
- где скрытая имплементация интерфейсов?
- где перегрузка параметров функций?
- где нормальное потребление памяти приложением?
- где быстрая работа приложения?
- где нормальные иде, с полноценными дизайнерами?
- где пользовательские value types?
- где методы у инстансов value types?
- где var и анонимные типы
- где перегрузка операторов?
- где оптимизиции хвостовых вызовов? (в свете функционального хайпа это должно вызывать некоторый батхёрт)
- Где чёткое разделение домены и сборки? Это не учитывая, целый ворох технологий недоступный понимаю жабоиндусов, такие всякие сильверлайты/вин-веб/формочки, впф, XNA, список можно продолжать бесконечно, как впрочем и список ущербности жабы...
 
Всего, чего нет в жабе, автоматически объявляется хуитой, как только это появляется в жабе, это автоматически становится нехуитой. При этом, требуется сделать вид, что хуитой это называл кто-то другой...
Ну, что скажете? разве ява годный язык?

katrin2201

- где перегрузка параметров функций?
- где нормальное потребление памяти приложением?
- где быстрая работа приложения?
- где нормальные иде, с полноценными дизайнерами?
учитывая это, остальное даже комментировать не хочется
джава, конечно, не без недостатков, и некоторые ты, действительно, подметил, но
а минусов понаставили - потому что данный холивар у всех уже в печенках сидит...

stm6692945

конечно, ява не тормозит, да? :3

yroslavasako

джава, конечно, не без недостатков, и некоторые ты, действительно, подметил, но
можешь выписать те, которые есть на самом деле, а не только в воображении автора?

katrin2201

Об это уже много копий поломали. Если и правда интересно конструктивно побеседовать - почитай это, если еще нет. А потом расскажи, как именно для тебя тормозит джава. Заодно, можешь привести те инстракшен сеты, под которые jvm еще не оптимизирована.

stm6692945

А потом расскажи, как именно для тебя тормозит джава
лол, вот это фейл.

ты прав, джава не тормозит. она даже не успела начать тормозить :3

serega1604

какие ещё ебанутые тесты, не имеющие никакого отношения к реальной жизни ты напридумываешь?

stm6692945

не имеющие? то есть в реальной жизни никому совсем никогда не нужен большой массив булеан? это так ты оправдываешь убогость явы - "не нужен"?

katrin2201

Угу. Буду только немного реордерить/разбивать вопросы с целью их группировки.
- где замыкания?
- где лямбды?
- где делегаты/евенты?
Анонимные классы. Замена, естественно, не полноценная, но жить можно.
Если прям жить не можете - то Groovy.
По моему личному мнению - нафиг не надо. Мизюз/абуз фич - головная боль, о которой нельзя забывать. Чем больше фич - тем потенциально больше эта самая боль. У меня есть опасения, что внедрение честных лямбд/замыканий сильно поспособствует снижению мейнтебилити.
- где свойства?
Геттеры/сеттеры. Много букв, но Эклипс/Интеллиджей генерят их двумя щелчками.
- где шаблоны? Разработчики Sun вынуждены только облизываться. Даже генерики, введённые в 5-й версии Java — не более, чем syntactic sugar. Дотнетовские генерики это реально поддерживаемые платформой типы, которые расширяются на лету при загрузке, котрые оптимизируются JIT-компилятором. Для Java генерики существуют только в коде и ни JIT, ни загрузчик классов их никогда не видит. Поэтому проблемы боксинга, преобразования типов в runtime просто скрыты от программиста.
Хоть дженерики, конечно, и ущербны всмысле тимплейтов даже того же с++, но это не просто синтактик шугар. Это дополнительный констрейнт.
По поводу оптимизации JIT. Не могу сходу придумать примера, когда инфа, затертая erasureом генериков, помогла бы оптимизатору. Возможно, меня тут просвятят.
Кроме того, утверждение не вполне справделиво, ибо рефлекшеном таки докопаться до генериковых типов можно.
Поэтому проблемы боксинга, преобразования типов в runtime просто скрыты от программиста.
Не очень понимаю, о каких, собственно, проблемах идет речь =)
Я знаю проблему, где

Short num = 5;
Set<Short> listOfShorts = new HashSet<Short>
listOfShorts.add(num);
listOfShorts.remove(5);
System.out.println(listOfShorts.contains(num;

выдает true. Такая проблема есть, нельзя не признать. О ней стоит помнить.
Вылазит она достаточно редко (я в живом коде ни разу, кажется, не встречал та же интеллиджей ее подсвечивает. Да и к генерикам тут отношение постольку поскольку.
- где partial-классы?
Нету.
В защиту опять же - не вижу особой надобности. Зато вот уж где раздолье для мизюза...
Как в джаве - по файлу на класс - мне уже давно больше нравится.
Для аспектов - можно и тулзиной заморочиться, хотя, конечно, приятно.
Спрятать нагенеренный дизайнером код? В джаве стараются, видимо, не генерить без нужды.
- где детерминированное освобождение ресурсов
(ключевое слово using + интерфейс IDisposable)?
Это которое эквивалентно try {} finally {} ?
Ну нету. Синтактик шугар, ага ;)
- где оптимизация JVM для расширений процессоров?
Там
- где аналог linq и в частности удобные мапперы?
Аналога линка нету. В JPA2 появится костыль, призванный это заткнуть. Я пытался смотреть, пока у них имхо плохо получается.
Но работы явно ведутся. Может джаве эдак к восьмой они справятся.
В остальном JPA/Hibernate вполне справляется.
- где расширения методов класса?
Нету. Собсно в частности поэтому нету и линка
- где скрытая имплементация интерфейсов?
Ты про нейм-клешинг и его разруливание?
Нету, да.
- где перегрузка параметров функций?
Member overloading? Там.
- где нормальные иде, с полноценными дизайнерами?
IntelliJ, Eclipse. Что с ними не так?
Более того, у меня есть подозрение, что та же студия даже с решарпером не дотягивает до той же интеллиджей.
- где пользовательские value types?
- где методы у инстансов value types?
Енумерейшены. В некотором роде иммутабл объекты.
- где var и анонимные типы
var нету. Мое мнение - не ленитесь - пользуйтесь интферфейсами =)
Анонимные типы - нету. Без того же линка, как я понимаю, толком и не надо оно.
Тем более, что можно достичь иными способами - зацени например JMock. Очень красивая по-своему либа.
- где перегрузка операторов?
Сознательно исключена Гослингом из фич. Причина - как раз головной боли от абьюза больше, чем пользы.
- где оптимизиции хвостовых вызовов? (в свете функционального хайпа это должно вызывать некоторый батхёрт)
Нету. В C# его афаик тоже нету. По схожим причинам. В джаве, кстати, версии к 8 опять же, глядишь, сделают.
Я вот только не понял, как стектрейс будет в этом случае выглядеть. Хорошо бы если честно...
- Где чёткое разделение домены и сборки?
Джарники, класслоадеры. В .нете это более продуманно всмысле сервис-левела, конечно, но и этого хватает.
Это не учитывая, целый ворох технологий недоступный понимаю жабоиндусов, такие всякие сильверлайты/вин-веб/формочки, впф, XNA, список можно продолжать бесконечно, как впрочем и список ущербности жабы...
gwt, swing, javafx...
Вообще, так как джава живет подольше .netа, то и технологий там побольше будет, а особенно - разнообразий в их имплементации. Тех же веб-фреймворков в джаве вагон и тележка. Чем-то это очень даже хорошо. Чем-то плохо. Хотя, плюсов имхо больше +)
Стоит помнить, что при дизайне .нета у народа была возможность обойти грабли, на которые наступила джава. Те же дженерики - как раз из тех граблей.
У .нета есть пачка принципиально неразрешимых проблем, связанных с проприетарностью. Нету кроссплатформенности. Проблемы с опенсурсностью. Завязанность на одну имплементацию. Только это стоит очень многого.
Итого, если подвести итоги, то я насчитал так.
В пяти пунктах я с тобой не согласился, утверждая что в джаве это есть.
Четыре пункта спорные - в джаве есть аналоги, пусть и не полноценные, но их хватает.
Четыре пункта - я признал их отсутствие в джаве, хотя лично мое мнение - из этого всего вороха реально не хватает только линка.
ЗЫ еще на тему сравнения c/java можно почитать тут.

katrin2201

лол, вот это фейл.
Причем здесь тормоза?
Это не тормоза. Это дефолтное ограничение jvm'а по макс размеру хипа. Которое ты не потрудился исправить - ссзб.
Другое дело, что дефолтные ограничения там достаточно забавные, и текущей реальности, действительно, соответствуют мало, ибо с тех пор как их задали, много воды утекло. Это, кстати, уже обсуждалось .

serega1604

нет, не оправдываю, просто такое действительно никогда не понадобится.
олсу
void 23:19:39 ~/.workspace % cat Main.java                                                                                                                     0
class Main {
public static void main(String[] args){
int size = Integer.parseInt(args[0]);
System.out.println(size);
boolean[] data = new boolean[size];
System.out.println("OK");
}
}
void 23:19:42 ~/.workspace % javac Main.java 0
void 23:19:48 ~/.workspace % java -Xmx4098m Main 1000000000 0
1000000000
OK
void 23:19:51 ~/.workspace %

6yrop

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

katrin2201

В общем-то да, согласен, но динамическая типизированность в Груви - всего лишь опция.

6yrop

Геттеры/сеттеры. Много букв, но Эклипс/Интеллиджей генерят их двумя щелчками.
совершенно поверхностный взгляд на свойства. У меня вот тут заявлено аж 6 проектов, в Java такое даже не снилось
http://propertyexpression.codeplex.com/

Dasar

- где перегрузка операторов?
Сознательно исключена Гослингом из фич. Причина - как раз головной боли от абьюза больше, чем пользы.
пример головной боли можно? лучше из C# (как из современного языка чем из C++ (как из древнего языка).

6yrop

По-моему, в спорах C# vs. Java стоит упомянуть о type inference. И сразу станет ясно, что Java уже морально устаревший язык.

serega1604

>стоит упомянуть о type inference.
>уже морально устаревший язык
сколько лет назад его придумали вспомнишь? все языки в которых его до сих пор не появилось автоматически считаем устаревшими?

Anturag

 
сколько лет назад его придумали вспомнишь?
Robin Milner в ML использовал выведение типов 37 лет назад. Появившиеся с 1975 года языки со статической типизацией, но без выведения типов - морально устаревшие при дизайне.

karkar

Robin Milner в ML использовал выведение типов 37 лет назад.
И C# до сих пор его не догнал, кстати. Егойный вывод типов слишком локален и примитивен, а в ML можно вообще за всю программу нигде тип не указать, все выводится.

doublemother

в ML можно вообще за всю программу нигде тип не указать, все выводится.
Там есть обратная сторона: нет неявных кастов и перегрузки.

karkar

- где пользовательские value types?
- где методы у инстансов value types?
Енумерейшены. В некотором роде иммутабл объекты.
Я че-то связи ответа с вопросом не увидел. Enumeration позволяет иметь неотбоксенный набор данных с методами?

Serab

Не очень понимаю, о каких, собственно, проблемах идет речь =)
Я знаю проблему, где
code:
     Short num = 5;
     Set<Short> listOfShorts = new HashSet<Short>
     listOfShorts.add(num);
     listOfShorts.remove(5);
     System.out.println(listOfShorts.contains(num;
выдает true. Такая проблема есть, нельзя не признать. О ней стоит помнить.
Вылазит она достаточно редко (я в живом коде ни разу, кажется, не встречал та же интеллиджей ее подсвечивает. Да и к генерикам тут отношение постольку поскольку.
Ах ты ж ебаный ты нахуй!
Этим языком можно пользоваться? :ooo:
// Я не травли ради, правда удивительно!
upd: А, типа «5» другого типа и не Equal'ится к Short(5)? Ну в таком случае что-то мне подсказывает, что дженерики в java совсем слабые, до хорошей строгой типизации не дотягивают.

stm6692945

ты выделил 4 гигабайта на то, чтобы разместить триллион булеанов? переменных способных принимать значения true или false
это не пиздец? :3

Serab

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

stm6692945

здешние знатоки явы похоже и про BitSet-то не знают, и про отсутствие определения boolean в спецификации jvm тоже.
Хорошо, давай по сравниваем работу BitSet, у меня вот так получилось

просос сисярпу в два раза, например :3

Serab

Запускаешь в дебаге, дальше не смотрел.

Serab

Не, по большому счету я согласен, конечно, что java отстает от C# в некоторых моментах и тому есть несколько логичных причин. Во-первых, Microsoft начинали с нуля, создавали язык, который им нравится, у них были все шансы не совершать ошибок, которые совершили их предшественники. Но это из разряда оправданий, конечно.
Другой вопрос, что это все небезнадежно, все эти фичи еще можно добавить, java'у заметно оптимизят от версии к версии. У них есть много хорошего поддерживаемого кода. У них пока получше с кроссплатформенностью.
Т.е. если ты профессионал и пишешь на java, то особых проблем нет.
Новичку я, конечно, посоветовал бы выбирать .NET

Serab

По моему личному мнению - нафиг не надо. Мизюз/абуз фич - головная боль, о которой нельзя забывать. Чем больше фич - тем потенциально больше эта самая боль. У меня есть опасения, что внедрение честных лямбд/замыканий сильно поспособствует снижению мейнтебилити.
Ну вот здесь мне кажется ты слишком сгущаешь краски. Лямбды даже в C++ добавлять «собираются», и мне кажется не зря. Отсутствие лаконичного способа задания функций на лету — главный барьер к применению алгоритмов (в смысле STL). А применение алгоритмов (хотя бы типа for_each или for_all) ведет к более ясному коду, слегка уменьшает вероятность ошибиться.
Да, всякое сумасшествие надо зарезать на корню, но это регулируется так же, как и другие возможности сходить с ума при кодировании :grin:

stm6695895

Не, по большому счету я согласен, конечно, что java отстает от C# в некоторых моментах и тому есть несколько логичных причин
извини, не вижу, там у тебя упомянуто в качестве причины то, что сишарп запускается всего на одной проприетарной платформе и имеет на ней специальную проприетарную оптимизацию?

Serab

Ну если
У них пока получше с кроссплатформенностью.
устроит защитников java, то да, написано.

Serab

сишарп запускается всего на одной проприетарной платформе
а java на каком количестве проприетарных платформ запускается?
Ладно, шучу, но если серьезно, то процитированное строго говоря вранье, потому что есть mono.

yroslavasako

Ладно, шучу, но если серьезно, то процитированное строго говоря вранье, потому что есть mono.
которое несовместимо. По крайней мере под линуксом многие современные .net программы запускать не выходит. Кстати, быть может .Net не вполне платформанезависимая, а как java SWT?
Вот по приколу набрал java+qnx в гугле - сабж есть, а mono+qnx не существует (есть ссылка, что ведутся работы, одним или двумя студентами вроде, так что за время работ новая .net выйдет)

stm6695895

Ладно, шучу, но если серьезно, то процитированное строго говоря вранье, потому что есть mono
Ну в принципе да, я и забыл, ведь .NET реализован на довольно приличном количестве операционных систем: реализации есть под Windows 2000, Windows XP, Windows Seven, Windows 2008 Server и даже есть мобильная версия под Windows Mobile! И да, ведь есть еще и mono! :3

Serab

Че ты разнервничался. Писать на .NET'е удобнее, я только про это говорил. И с этим спорят только упертые, про кроссплатформенность я сразу и написал, херово. Ну и похуй бы. Ради одной кроссплатформенности на java писать — идиотизм.
А сейчас на работе пишу на C++, причем под такие платформы, на которых java не работает и не будет, я думаю :grin:
Так что не суетись.

katrin2201

Ну, на самом деле, в этом пункте я готов согласиться.
Я сознательно в пред своем посте не согласился, надеясь, что меня ткнут в пример, когда эти пропертис архиполезны и незаменимы.
По твоей ссылке пока успел посмотреть только первый проект - Reactive Relations. Прикольный проект, ты его, кажется, рекламировал уже здесь.
Но если на его примере говорить, что в джаве такого и не снилось, то это не совсем так. Посмотри, например, как в JMock мочатся произвольные интерфейсы/объекты. Там задание экспектейшенов вполне смахивает на то, как ты свое дерево экспрешеннов в коде задаешь. Красота кода, на мой взгляд, не страдает.
Концепт ДжейМока растет из фаулеровского FluentInterface.
На другие проекты пока времени не было посмотреть. Вообще, дальше что-то иное будет, или принцип использования везде похожий?

katrin2201

пример головной боли можно? лучше из C# (как из современного языка чем из C++ (как из древнего языка).
Мнение достаточно спорное, согласен. Примеров приводит не буду, просто зацитирую самого Гослинга из приведенной выше ссылки
There are some things that I kind of feel torn about, like operator overloading. I left out operator overloading as a fairly personal choice because I had seen too many people abuse it in C++. I've spent a lot of time in the past five to six years surveying people about operator overloading and it's really fascinating, because you get the community broken into three pieces: Probably about 20 to 30 percent of the population think of operator overloading as the spawn of the devil; somebody has done something with operator overloading that has just really ticked them off, because they've used like + for list insertion and it makes life really, really confusing. A lot of that problem stems from the fact that there are only about half a dozen operators you can sensibly overload, and yet there are thousands or millions of operators that people would like to define — so you have to pick, and often the choices conflict with your sense of intuition. Then there's a community of about 10 percent that have actually used operator overloading appropriately and who really care about it, and for whom it's actually really important; this is almost exclusively people who do numerical work, where the notation is very important to appealing to people's intuition, because they come into it with an intuition about what the + means, and the ability to say "a + b" where a and b are complex numbers or matrices or something really does make sense. You get kind of shaky when you get to things like multiply because there are actually multiple kinds of multiplication operators — there's vector product, and dot product, which are fundamentally very different. And yet there's only one operator, so what do you do? And there's no operator for square-root. Those two camps are the poles, and then there's this mush in the middle of 60-odd percent who really couldn't care much either way. The camp of people that think that operator overloading is a bad idea has been, simply from my informal statistical sampling, significantly larger and certainly more vocal than the numerical guys. So, given the way that things have gone today where some features in the language are voted on by the community — it's not just like some little standards committee, it really is large-scale — it would be pretty hard to get operator overloading in. And yet it leaves this one community of fairly important folks kind of totally shut out. It's a flavor of the tragedy of the commons problem.

katrin2201

Сам язык по фичам - да, менее навороченный чем c#. Тут трудно не согласиться.
Делает ли только отсутствие всех этих рюшечек его морально устаревшим - совсем другой вопрос.
Можете вон для сравнения на PL/SQL посмотреть. Там, для разнообразия, в 11g оракловцы добавили оператор continue. До этого его поведение приходилось реализовывать через goto...

katrin2201

В некотором роде, да.
Пример посмотреть можно тут, самый последний пример в статье до комментариев.
Оно не честный value type, потому что не на стеке создается (такое в джаве, действительно, возможно только для примитивов). Но поведение почти похоже =)

katrin2201

upd: А, типа «5» другого типа и не Equal'ится к Short(5)? Ну в таком случае что-то мне подсказывает, что дженерики в java совсем слабые, до хорошей строгой типизации не дотягивают.
Догадка верная. Но там не в генериках проблема. Там у remove сигнатура такая:

boolean remove(Object o);

Этим языком можно пользоваться?
Ну так, периодически переосмысливая мир, ага =)

Serab

А можно сакральный вопрос: а почему?

katrin2201

Ну вот здесь мне кажется ты слишком сгущаешь краски. Лямбды даже в C++ добавлять «собираются», и мне кажется не зря. Отсутствие лаконичного способа задания функций на лету — главный барьер к применению алгоритмов (в смысле STL). А применение алгоритмов (хотя бы типа for_each или for_all) ведет к более ясному коду, слегка уменьшает вероятность ошибиться.
Да, всякое сумасшествие надо зарезать на корню, но это регулируется так же, как и другие возможности сходить с ума при кодировании
Это все есть. Анонимный класс.
Под коллекшены гугл даже либу написал. Поценить можно тут.

katrin2201

Честно говоря, я не знаю. Но это явно фича, так как аккуратно прописано во всех коллекшеновых интерфейсах. Там еще есть такая спецификация, пришедшая с догенериковых джав:

* @throws ClassCastException if the type of the specified element
* is incompatible with this list (optional)

Подозреваю, что это было сделано для лучшей совместимости с каким-то ужасным кодом.

Serab

Это все есть. Анонимный класс.
Под коллекшены гугл даже либу написал. Поценить можно тут.
да есть-то оно, может быть и есть. В .NET 2 (а может и в 1, не помню уже) были анонимные делегаты. Но и они довольно громоздки. Хотя сумасшествий и с ними уже можно было накатать. Это все о синтаксическом сахаре, о нем, да.

Serab

Подозреваю, что это было сделано для лучшей совместимости с каким-то ужасным кодом.
Нет, тут похоже правда надо переосмыслить жизнь. При создании новой синтаксической фичи языка заботятся о совместимости с неким ужасным кодом. Нет, я правда не понимаю.
И много там еще таких анти-генерик методов в генериках?

katrin2201

здешние знатоки явы похоже и про BitSet-то не знают, и про отсутствие определения boolean в спецификации jvm тоже.
Хорошо, давай по сравниваем работу BitSet, у меня вот так получилось
Давай посравниваем. Токо сравнивать надо с java.util.BitSet

final int SIZE = 50000000;
long d1 = System.currentTimeMillis;
BitSet bitSet = new BitSet(SIZE);
long d2 = System.currentTimeMillis;
boolean[] bools = new boolean[SIZE];
long d3 = System.currentTimeMillis;
System.out.println(d2-d1);
System.out.println(d3-d2);

Output:
16
62

Если ты спросишь, какого рожна им не реализованы нативные массивы булеанов - то я скажу из-за трейдоффа по скорости/кроссплатформенности.

stm6695895

я не нервничаю и не суечусь, все ок :3

katrin2201

Нет, тут похоже правда надо переосмыслить жизнь. При создании новой синтаксической фичи языка заботятся о совместимости с неким ужасным кодом. Нет, я правда не понимаю.
Ну как тебе сказать. Собственно, сам erasure был придуман именно для этой самой совместимости кода. На мой взгялд они, правда, слишком сильные ограничения навесили, и тем самым облажались. Уж лучше бы в джвме жило две маленьких джава машины. Одна для догенерикового кода, и вторая - для послегенерикового. Так что имхо сановцы просто смалодушничали, и обошлись малой кровью.
И много там еще таких анти-генерик методов в генериках?
Да нет на самом деле. Это единственное, что я навскидку помню.
Но других приколов еще масса. Там целая книга про это есть =) Если хочешь, вечером могу запостить линк.

Serab

А, хотя тут тоже есть догадка. Оно имплементит нечто не-генерик?
Ну вот в .NET'е, например, Dictionary<,> тоже имплементит обычный IDictionary, но указанных проблем не возникает.

katrin2201

А, хотя тут тоже есть догадка. Оно имплементит нечто не-генерик?
Ну вот в .NET'е, например, Dictionary<,> тоже имплементит обычный IDictionary, но указанных проблем не возникает.
Нет, там такого нету.
http://www.docjar.com/html/api/java/util/Collection.java.htm...

Dasar

Примеров приводит не буду, просто зацитирую самого Гослинга из приведенной выше ссылки
зайду чуть с другой стороны:
ты согласен с тем?:
1. что чем исходник компактнее (без потери читабельности) тем меньше делается ошибок?
и тем быстрее читается и пишется код?
2. разработчики Java игнорируют п.1. и скорее даже против п.1. и исходя из этого они против syntactic sugar, против операторов, против using, против свойств, были против generic-ов и т.д.

katrin2201

1. что чем исходник компактнее (без потери читабельности) тем меньше делается ошибок?
и тем быстрее читается и пишется код?
Согласен. Замечу только, что читабельность - ооч субъективное понятие. Где-то компактность дает прирост читабельности (как в том же JMock/FluentInterface где-то нет (попробуйте регэкспы длиннее 10 символов почитать).
2. разработчики Java игнорируют п.1. и скорее даже против п.1. и исходя из этого они против syntactic sugar, против операторов, против using, против свойств, были против generic-ов и т.д.
Не согласен. Проблемы в п2 имхо мало связаны с п1.
Возьмем те же операторы. И представим себе ситуацию - незнакомый код с переопределенным оператором +. Который не дай бог еще, скажем, не симметричен. С какими-нибудь паразитными эффектами. Не знаю как вам, но мне читать код будет тяжело.
А теперь представим, что оператор + переопределяется по-разному. И иерархий несколько. По-моему, уже можно тушить свет.
А все ради чего? Чтобы вместо какого-нибудь ".add" написать "+"? По-моему, оно того не стоит.
Допускаю, что это актуально было раньше, когда текст писался в блокноте, и в какой-то момент все начинало тупо упираться в скорость набора текста. Сейчас, со всякими смарт-комплишенами, лайв тимплейтами и авторефакторингами это уже не проблема.
Повторюсь опять же, что джава, как язык, действительно развивается медленнее сишарпа/.нета. Пока отставание, на мой вгляд, не критично. И перекрывается преимуществом в разнообразии либов/технологий. И нивелируется наличием клевых сред типа ИнтеллиДжей.
Джаву можно ругать бесконечно, но ей пока нет кроссплатформенной альтернативы с хотя бы сравнимым набором технологий.
Заодно замечу, что лично для меня язык становится проблемным, или морально устаревшим - когда мне на нем становится противно писать, из-за массы изобретаемых по ходу велосипедов, давно присутствующих в стандарте/либах других языков. Отсутствие continue в pl/sql - яркий тому пример.

asvsergey


Подозреваю, что это было сделано для лучшей совместимости с каким-то ужасным кодом.
Нет, тут похоже правда надо переосмыслить жизнь. При создании новой синтаксической фичи языка заботятся о совместимости с неким ужасным кодом. Нет, я правда не понимаю.
И много там еще таких анти-генерик методов в генериках?
Генерики в яве только внешне похожи на шаблоны, внутри все приводится к тому классу, который описан в коде самого генерик класса, вся информация о конкретном типе теряется.

Serab

Генерики в яве только внешне похожи на шаблоны
ну я как бы понимаю разницу между шаблонами и генериками. Но и генерики можно делать по-человечески.
Ладно, я понял, тут одно из двух: либо полная совместимость с догенериковской джавой, либо человеческие генерики (вы меня не переубедите, что это нормально иметь в генерик-коллекции метод с сигнатурой Name(Object o когда семантически там всегда должен присутствовать тип, которым этот генерик инстанцирован и проверка этого оставляется программисту и IDE).
В принципе, не сужу разработчиков, думаю они не могли не подумать о том, о чем подумал я, просто удивился.

Dasar

А теперь представим, что оператор + переопределяется по-разному. И иерархий несколько. По-моему, уже можно тушить свет.
и чем это отличается от ситуации, что метод add переопределяется у каждого объекта по своему?
т.е. тебе не лень запомнить, что add бывает разный, но лень запомнить - что + бывает разный?

Serab

+ маскируется четче :grin:

katrin2201

т.е. тебе не лень запомнить, что add бывает разный, но лень запомнить - что + бывает разный?
С такой аргументацией можно дойти до того, что писать всем стоит в шестнадцатеричных кодах.
Чем больше таких скрытых неочевидных вещей в коде, ломающих шаблон - тем он менее читабелен.
Еще это в чем-то сродни тому, что ты все переменные в коде обзываешь буковками алфавита. Если эти операторы так хороши - давай тогда все методы в таких операторах делать - очень удобно чейнить будет. Кратко. Красота. Выглядеть, правда, как брейнфак будет...
И потом, ты никак не можешь сказать, чем это полезно. То есть у тебя пока аргументация такая - есть не просит, ну и пусть будет. Это не всегда хорошо, ибо именно так всякие всячести и обрастают кучей ненужного мусора, превращаясь в франкенштейна/помойку.
Я вот тут все с ужасом жду джава-проектов, в которых сорсы будут уникодно-локализованные, с какими-нибудь китайскими именами переменных, например.

pitrik2

Нет, тут похоже правда надо переосмыслить жизнь. При создании новой синтаксической фичи языка заботятся о совместимости с неким ужасным кодом. Нет, я правда не понимаю.
эээ
брррр
о каких совместимостях вы тут говорите?
есть стандарт языка, где четко прописано что метод remove у коллекций работает только основываясь на методе equals переданного объекта (ну иногда еще и hashCode)
вы предлагаете при введении фичи генерики менять стандарт?
за каким спрашивается чертом?
раньше я когда удалял из коллекции то передавал туда анонимный класс-фильтр который матчил что мне нужно
а теперь мне надо как-то такой же класс создавать? а если у него конструктор закрытый то как мне создавать-то его?
кстати да, в других языках remove генериковый? как вы тогда удаляете если конструктор закрыт?
в с++ для этого используют отдельный метод http://www.cplusplus.com/reference/algorithm/remove_if/ в который надо передавать предикат
и есть стандартный предикат-обёртка, вызывающий == для переданного объекта
всё бы хорошо вот токо такой метод remove всегда линейный, а для многих коллекций можно удалять быстрее, тут я так понимаю с++ беспомощен

katrin2201

вы предлагаете при введении фичи генерики менять стандарт?
Ну, как бы да, иначе толку от этих генериков, если они никаких доп ограничений не накладывают?
Добавить произвольный объект ты же не можешь. А чем, тогда спрашивается, добавление хуже удаления?
Там какой-то другой ризонинг был, я просто не помню какой, и нагуглить сходу не удается.

Serab

есть стандарт языка, где четко прописано что метод remove у коллекций работает только основываясь на методе equals переданного объекта (ну иногда еще и hashCode)
вы предлагаете при введении фичи генерики менять стандарт?
ага, т.е. по-твоему, стандарт — враг человека. А мне всегда хотелось верить, что друг.
раньше я когда удалял из коллекции то передавал туда анонимный класс-фильтр который матчил что мне нужно
а теперь мне надо как-то такой же класс создавать? а если у него конструктор закрытый то как мне создавать-то его?
зач0т
кстати да, в других языках remove генериковый? как вы тогда удаляете если конструктор закрыт?
в с++ для этого используют отдельный метод http://www.cplusplus.com/reference/algorithm/remove_if/ в который надо передавать предикат
и есть стандартный предикат-обёртка, вызывающий == для переданного объекта
всё бы хорошо вот токо такой метод remove всегда линейный, а для многих коллекций можно удалять быстрее, тут я так понимаю с++ беспомощен
что-то я не понял. Есть структуры данных, которые удаляют все элементы, на которых твой анонимный класс выдает true быстрее, чем за линейное время? Ну-ка ну-ка.

katrin2201

что-то я не понял. Есть структуры данных, которые удаляют все элементы, на которых твой анонимный класс выдает true быстрее, чем за линейное время? Ну-ка ну-ка.
А, я понял о чем он.
Типа, если мы знаем хешкоды объектов, которые надо удалить, или удаляемые объекты у нас вообще упорядочены, тогда оно может не по всей коллекции пройтись, а только по нужной части.
Забавно. Да, это неплохой шорткат. Тогда, может, и правда из-за этого.
Все элементы - это уже пограничный случай, фиг с им =)

pitrik2

Есть структуры данных, которые удаляют все элементы, на которых твой анонимный класс выдает true быстрее, чем за линейное время?
если hashCode определен то любые структуры использующие хэши
если сравнение определено (интерфейс Comparable) то любые структуры использующие упорядочивание для быстрого поиска элементов
просто в Java принято что любые коллекции наследуются от базовой Collection
и итераторы у них у всех с одинаковым интерфейсом
это ОЧЕНЬ удобно
в С++ с этим полный бардак, все коллекции независимые классы, у всех итераторы с разным поведением
например: некоторые итераторы тама при удаленни текущего элемента портятся а некоторые нет
в джава любая кастомная коллекция может быть подставлена в базовые библиотеки без проблем
в С++ кастомные коллекции с базовыми ничего общего не имеют, для них приходится стандартные методы переписывать

pitrik2

Тогда, может, и правда из-за этого.
ну там есть такая книжка Java Puzzlers (как-то так называется где сами авторы дженериков рассказывают почему remove принимает Object

stm6692945

Давай посравниваем. Токо сравнивать надо с java.util.BitSet
а ты думаешь в моем посте какой-то особый волшебный BitSet? Там сравниваются битсеты из реализции в яве и сисярпе. и да, если внимательно разглядеть две с половиной строчки кода, там помимо выделения собственно структуры еще у всех элементов меняются значения с true на false - так сказать, иллюстрация конкретной работы.
var нету. Мое мнение - не ленитесь - пользуйтесь интферфейсами =)
Анонимные типы - нету. Без того же линка, как я понимаю, толком и не надо оно.

смотри сюда, например:

List<object> data = new List<object>
IItem parent = RepositoryManager.GetItem(TypeDefCombo.SelectedItem.Value);
if (parent != null && parent is ItemTypeDefinition)
{
foreach (var child in parent.Items)
{
if (child is PropertyDefinition)
{
data.Add(new { id = child.Name, name = child.Name });
}
}
}
PropertyStore.DataSource = data;
PropertyStore.DataBind;

Тут никакого линка. PropertyStore - возьмёт data и гламурно сериализует его в JSON. Мне даже париться не надо. Но всё красиво и понятно.

asvsergey

просто в Java принято что любые коллекции наследуются от базовой Collection
и итераторы у них у всех с одинаковым интерфейсом
это ОЧЕНЬ удобно

Проблема в том что коллекции на порядок медленнее масивов, а у масивов в яве итераторов вообще нет.
В С++ итератор есть даже для обычного масива, что бы унифицировать алгоритмы. За это приходится платить неопределенным поведением в некоторых случаях.

pitrik2

Проблема в том что коллекции на порядок медленнее масивов, а у масивов в яве итераторов вообще нет.
В С++ итератор есть даже для обычного масива, что бы унифицировать алгоритмы. За это приходится платить неопределенным поведением в некоторых случаях.
ну я с тобой не согласен
Arrays.asList выдает вполне себе итератор по массиву, который можно в любые алгоритмы пихать
абсолютно не вижу здесь никаких отличий от с++
по поводу того что создается новый объект итератор, то в джаве итератор это всегда новый класс
по поводу того что коллекции медленнее массивов, то в джаве есть всякие библиотечные методы для работы чисто с массивами
да и потом это уже другой вопрос, за ответом - вона во всякие статьи развеивающие мифы про скорость джавы

asvsergey

Arrays.asList выдает вполне себе итератор по массиву, который можно в любые алгоритмы пихать
абсолютно не вижу здесь никаких отличий от с++

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

pitrik2

А он случаем не перегонит массив в коллекцию? Если перегоняет, то это везде не быстро, хоть на с++, хоть на яве, хоть где.
если бы перегонял то это не был бы итератор
я же тебе именно его дал как ответ на то что в джаве у массивов нет итераторов
А вот коллекции в яве гораздо медленнее массивов в яве же.
блин, ну явно же хрень пишешь
если мы говорим об абстрактной колелкции в вакууме то твое утверждение верно для любого языка
думаешь я тебе в с++ не найду какуюнить зверскую коллекцию которая будет пипец какой медленной по сравнению с массивом? :)
если же говорим про Arraylist (аналог vector в С++)
то давай доказательство своим словам
напиши простенький тест обычного массива и Arrays.asList от этого же массива
ну не верю что будет "гораздо медленнее", там даже гарбадж коллектору особо нечего делать будет

stm6692945

блин, сплошные адекват-куны собрались, даже потроллить нормально не получается(
Вот тебе твой тест

import java.util.Arrays;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;

public class ArraysVSCollections
{
public static void main(String[] args)
{
int sum = 0;
long start_time;
long end_time;

Integer[] array1 = new Integer[10000000];
for(int i = 0; i < array1.length; i++)
{
array1[i] = (intMath.random*100);
}

start_time = Calendar.getInstance.getTimeInMillis;
for(int i = 0; i < array1.length; i++)
{
sum += array1[i];
}
end_time = Calendar.getInstance.getTimeInMillis;
System.out.println("sum: "+sum+" time: "+(end_time-start_time;

sum = 0;
start_time = Calendar.getInstance.getTimeInMillis;
for(Iterator<Integer> i = Arrays.asList(array1).iterator; i.hasNext;)
{
sum += i.next;
}
end_time = Calendar.getInstance.getTimeInMillis;
System.out.println("sum: "+sum+" time: "+(end_time-start_time;
}
}


sum: 495064147 time: 16
sum: 495064147 time: 296

эпик фейл, извини. теперь можешь выдвигать свои оправдания, почему ява так фейлит, интересно послушать :3

asvsergey

 
если бы перегонял то это не был бы итератор
я же тебе именно его дал как ответ на то что в джаве у массивов нет итераторов

Ну раз так, куда будет показывать итератор после удаления элемента?
Это ли называется одинаковым поведением итераторов?
 
если же говорим про Arraylist (аналог vector в С++)
то давай доказательство своим словам
напиши простенький тест обычного массива и Arrays.asList от этого же массива
ну не верю что будет "гораздо медленнее", там даже гарбадж коллектору особо нечего делать будет

 
public class TestSpeed {
public static void main(String[] args){
java.util.Random generator = new java.util.Random;
int size = 500000;
int cycle = 100000000;
int[] a = new int[size];
ArrayList<Integer> b = new ArrayList<Integer>
for (int i = 0 ; i < size ; i ++){
b.add(0);
}
long tArrayStart = System.currentTimeMillis;
for(int i2 = 0; i2 < cycle; i2++){
int index = Math.abs(generator.nextInt % size);
a[ index] ++;
}
long tArraySpeed = System.currentTimeMillis - tArrayStart;
System.out.println(tArraySpeed + " sec array");
long tCollectionStart = System.currentTimeMillis;
for(int i1 = 0; i1 < cycle; i1++){
int index = Math.abs(generator.nextInt % size);
b.set(Math.abs(index b.get(index) + 1);
}
long tCollectionSpeed = System.currentTimeMillis - tCollectionStart;
System.out.println(tCollectionSpeed + " sec collection");

}
}

У меня
4089 sec array
11340 sec collection

Это со спецефичными только для ArrayList операторами, через итераторы быстро такое не сделаешь.
Да и generator.nextInt не быстрая операция, но без него чего нибдь закешироваться может.

stm6692945

зачем ты тестишь скорость работы генератора рандома, просили же коллекции и массивы :3

asvsergey

зачем ты тестишь скорость работы генератора рандома, просили же коллекции и массивы :3
Да даже с рандомом разница большая, хотя он существенно на время влияет :)
Рандом, что б код не соптимизировался, и цикл честно работал.

pitrik2

Да и generator.nextInt не быстрая операция, но без него чего нибдь закешироваться может.
ужас какой :shocked:
сделай третий массив и загони туда все индексы до начала измерений
потом в тестах беги по массиву индексов

asvsergey

сделай третий массив и загони туда все индексы до начала измерений
потом в тестах беги по массиву индексов

Тебе небольшей тест нужен, или что то другое?

stm6692945

что про мой вариант скажешь ?

serega1604

версия явы какая? какие параметры запуска?
void 20:28:29 ~/.workspace % java ArraysVSCollections                                                                                                          0
sum: 494934045 time: 62
sum: 494934045 time: 84
void 20:28:36 ~/.workspace % 0

serega1604

>Ну раз так, куда будет показывать итератор после удаления элемента?
после удаления элемента итератор выкинет исключение.
код вообще бредовый - int и Integer разные вещи, сделай массив тех же объектов что и лист и повтори тест.

stm6692945

17ая jdk,
конфиг компа: двухядерный атлон, 1 гиг оперативки
параметров никаких спецаильных не указывал

serega1604

>17ая jdk,
ты даже версию нормально сказать не можешь?

stm6692945

Version 6, Update 17, что непонятного?
Алсо вот резалты на домашнем компе (Q6600, 2 Gb например:

sum: 495087599 time: 16
sum: 495087599 time: 266

serega1604

>Version 6, Update 17, что непонятного?
а то что я могу написать десяток ява-машин, в версии которых будет присутсвовать число 17

pitrik2

> Calendar.getInstance.getTimeInMillis
о ужас
эта штука сама по себе может долго работать
правильно: System.currentTimeMillis;
и эта
а почему такая нелюбовь к for each ?

stm6692945

да ебаный стыд! :3
осталось спросить почему я скобки на отдельных строках ставлю
>эта штука сама по себе может долго работать
точно, именно поэтому на массивах 16 миллисекунд, а на списке 300.
и вообще пиздеж, что System.currentTimeInMills чем-то отличается от Calendar.bla-bla-bla - сейчас проверил, результаты те же.
что там у , я не знаю, но я уже писал - запускал на двух машинах, несколько раз, резалты приведены.

serega1604

>Алсо вот резалты на домашнем компе (Q6600, 2 Gb например:
и там и там ось 32-х битная наверно?

Serab

Так тупо спалился. Гагагагагагагагагагагага.

stm6692945

да, 32битные

Serab

я не нервничаю и не суечусь, все ок :3
а у меня еще что-то скребло в подсознании, когда этот смайл увидел :grin:

Serab

Он мне сейчас пишет унижающие его приваты с просьбами не палить :lol:

serega1604

странно что мне не пишет, я его тож спалил, правда я не заявил об этом во всеуслышанье.

Serab

Может быть именно поэтому и не пишет?

serega1604

он просто не в курсе что у меня более веское доказательство чем скриншот - у меня ПМ от него ;)

serega1604

>да, 32битные
ты бы ещё 16-ти битную нашел и на ней проверил.

yroslavasako

>да, 32битные
их ещё не мало.
и к тому же яве предъявлялись претензии в недостаточной оптимизации к железу. Этим своим требованиям (использовать 64 бит вместо 32) вы тем самым потверждаете, что ява оптимизирована под значительно меньшее количество железа, чем дот нет

stm6692945

омг что еще за пм, вроде ничего не писал тебе...
>ты бы ещё 16-ти битную нашел и на ней проверил.
32битных систем все еще большинство сейчас, критичней как работает на них же :3

serega1604

>омг что еще за пм, вроде ничего не писал тебе...
>
>>ты бы ещё 16-ти битную нашел и на ней проверил.
при любом ответе на моё сообщение мне приходит пм с уведомлением. так что удаляй-не удаляй, а я все равно прочитаю (причем если ты исправишь сообщение, то я прочитаю даже два варианта - исправленный и изначальный.
>32битных систем все еще большинство сейчас, критичней как работает на них же :3
на серверах? ну-ну.

serega1604

>вы тем самым потверждаете, что ява оптимизирована под значительно меньшее количество железа, чем дот нет
про .NET все уже давно забыли, сравнение массивов и List пошло от C++.

stm6692945

>на серверах? ну-ну.
ок, судя по твоему посту массивы "на 64битных серверах" работают откровенно хуево по сравнению с 32битными)

serega1604

>ок, судя по твоему посту массивы "на 64битных серверах" работают откровенно хуево по сравнению с 32битными)
это из чего следует?

stm6692945

>sum: 494934045 time: 62
у меня 16 миллисекунд стабильно. что у тебя за процессор?

serega1604

void 23:29:13 ~ % cat /proc/cpuinfo                                                                                                                            0
processor : 0
vendor_id : AuthenticAMD
cpu family : 17
model : 3
model name : AMD Turion(tm) X2 Dual-Core Mobile RM-75
stepping : 1
cpu MHz : 550.000
cache size : 512 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow constant_tsc rep_good nonstop_tsc extd_apicid pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch osvw skinit
bogomips : 4397.99
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate

processor : 1
vendor_id : AuthenticAMD
cpu family : 17
model : 3
model name : AMD Turion(tm) X2 Dual-Core Mobile RM-75
stepping : 1
cpu MHz : 550.000
cache size : 512 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow constant_tsc rep_good nonstop_tsc extd_apicid pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch osvw skinit
bogomips : 4388.25
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate

serega1604

кстати вот чо у меня получилось на 32-х битах
несколько хуже, чем на 64, но отставание явно не в 10 раз.
#java Test
sum: 494988866 time: 45
sum: 494988866 time: 159
#java Test
sum: 495011192 time: 45
sum: 495011192 time: 155
#java Test
sum: 495061105 time: 29
sum: 495061105 time: 97
#java -version
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05)
Java HotSpot(TM) Server VM (build 1.5.0_13-b05, mixed mode)

pitrik2

эпик фейл, извини. теперь можешь выдвигать свои оправдания, почему ява так фейлит, интересно послушать :3
сколько ты дал -Xmx ?
есть подозрение что у тебя слишком мало памяти отведено джава машине и поэтому слишком часто работает gc
еще мне не очень нравится твой тест, там как будто и вправду оптимизация какаято включается
в реальных задачах скорее будет не просто пробежка по массиву а какиенить действия
чуток переписал: бегу по четным номерам и записываю в них сумму с следующей ячейкой
import java.util.Arrays;
import java.util.List;
public class ArraysVSCollections {
public static void main(String[] args) {
Integer[] array = new Integer[10000000];
for (int i = 0; i < array.length; i++) {
array[i] = (int) (Math.random * 100);
}

Integer[] arrayForList = new Integer[10000000];
System.arraycopy(array, 0, arrayForList, 0, array.length);
{
long sum = 0;
long start_time = System.currentTimeMillis;
for (int i = 0; i < array.length - 1; i += 2) {
array[i] += array[i + 1];
sum += array[i];
}
long end_time = System.currentTimeMillis;
System.out.println("sum: " + sum + " time: " + (end_time - start_time;
}
{
List<Integer> listArray = Arrays.asList(arrayForList);
long sum = 0;
long start_time = System.currentTimeMillis;
for (int i = 0, listArraySize = listArray.size - 1; i < listArraySize; i += 2) {
listArray.set(i, listArray.get(i) + listArray.get(i + 1;
sum += listArray.get(i);
}
long end_time = System.currentTimeMillis;
System.out.println("sum: " + sum + " time: " + (end_time - start_time;
}
}
}

> "C:\program files\Java\jdk1.6.0_16\bin\java" -Xmx512m ArraysVSCollections
sum: 495044367 time: 593
sum: 742587033 time: 1297


разница в 2 раза конечно удручает но хоть не такая огромная как у тебя

stm6692945

есть подозрение что у тебя слишком мало памяти отведено джава машине и поэтому слишком часто работает gc
ты прав в том, что gc на этом коде похоже вообще не работает. выставил -Xmx1024M, результаты те же, что и на дефолтных настройках (сколько там отводится по умолчанию? 64 мегабайта?)
upd.
твой код:
 

sum: 494966016 time: 219
sum: 494966016 time: 391

алсо, у тебя суммы не совпали, что за фигня?

6yrop

Чем больше таких ... вещей в коде, ломающих шаблон - тем он менее читабелен.
в цитаты нах! :grin:

asvsergey

после удаления элемента итератор выкинет исключение.
код вообще бредовый - int и Integer разные вещи, сделай массив тех же объектов что и лист и повтори тест.
Так не пойдет, внутри ArrayList сидит тот же обычный массив, разницы не будет.
Как бы обычно нужно работать с числами, а коллекции позволяют работать только с обертками.

danilov

Так не пойдет, внутри ArrayList сидит тот же обычный массив, разницы не будет.
Как бы обычно нужно работать с числами, а коллекции позволяют работать только с обертками.
Есть trove. Правда работа с элементами там делается через визиторы, а не итераторы.
Но в целом это очень удобно, а главное, не так срет в память, как итераторы.

bastii

выражения в C# 3.0 сильная штука, сравни jmock c moq например:
http://code.google.com/p/moq/
Оставить комментарий
Имя или ник:
Комментарий: