[flame]разве ява годный язык? [re: php порвало яву]
- где перегрузка параметров функций?учитывая это, остальное даже комментировать не хочется
- где нормальное потребление памяти приложением?
- где быстрая работа приложения?
- где нормальные иде, с полноценными дизайнерами?
джава, конечно, не без недостатков, и некоторые ты, действительно, подметил, но
а минусов понаставили - потому что данный холивар у всех уже в печенках сидит...
конечно, ява не тормозит, да? :3
джава, конечно, не без недостатков, и некоторые ты, действительно, подметил, номожешь выписать те, которые есть на самом деле, а не только в воображении автора?
это, если еще нет. А потом расскажи, как именно для тебя тормозит джава. Заодно, можешь привести те инстракшен сеты, под которые jvm еще не оптимизирована.
Об это уже много копий поломали. Если и правда интересно конструктивно побеседовать - почитай А потом расскажи, как именно для тебя тормозит джавалол, вот это фейл.
ты прав, джава не тормозит. она даже не успела начать тормозить :3
какие ещё ебанутые тесты, не имеющие никакого отношения к реальной жизни ты напридумываешь?
не имеющие? то есть в реальной жизни никому совсем никогда не нужен большой массив булеан? это так ты оправдываешь убогость явы - "не нужен"?
- где замыкания?Анонимные классы. Замена, естественно, не полноценная, но жить можно.
- где лямбды?
- где делегаты/евенты?
Если прям жить не можете - то 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-классы?Нету.
В защиту опять же - не вижу особой надобности. Зато вот уж где раздолье для мизюза...
Как в джаве - по файлу на класс - мне уже давно больше нравится.
Для аспектов - можно и тулзиной заморочиться, хотя, конечно, приятно.
Спрятать нагенеренный дизайнером код? В джаве стараются, видимо, не генерить без нужды.
- где детерминированное освобождение ресурсовЭто которое эквивалентно try {} finally {} ?
(ключевое слово using + интерфейс IDisposable)?
Ну нету. Синтактик шугар, ага
- где оптимизация 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 можно почитать тут.
лол, вот это фейл.Причем здесь тормоза?
Это не тормоза. Это дефолтное ограничение jvm'а по макс размеру хипа. Которое ты не потрудился исправить - ссзб.
Другое дело, что дефолтные ограничения там достаточно забавные, и текущей реальности, действительно, соответствуют мало, ибо с тех пор как их задали, много воды утекло. Это, кстати, уже обсуждалось .
олсу
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 %
Если прям жить не можете - то Groovy.ага, сменить строго типизированный язык на динамический, спасибо, лучше уж рантайм машину и библиотеки поменять
В общем-то да, согласен, но динамическая типизированность в Груви - всего лишь опция.
Геттеры/сеттеры. Много букв, но Эклипс/Интеллиджей генерят их двумя щелчками.совершенно поверхностный взгляд на свойства. У меня вот тут заявлено аж 6 проектов, в Java такое даже не снилось
http://propertyexpression.codeplex.com/
- где перегрузка операторов?пример головной боли можно? лучше из C# (как из современного языка чем из C++ (как из древнего языка).
Сознательно исключена Гослингом из фич. Причина - как раз головной боли от абьюза больше, чем пользы.
По-моему, в спорах C# vs. Java стоит упомянуть о type inference. И сразу станет ясно, что Java уже морально устаревший язык.
>уже морально устаревший язык
сколько лет назад его придумали вспомнишь? все языки в которых его до сих пор не появилось автоматически считаем устаревшими?
сколько лет назад его придумали вспомнишь?Robin Milner в ML использовал выведение типов 37 лет назад. Появившиеся с 1975 года языки со статической типизацией, но без выведения типов - морально устаревшие при дизайне.
Robin Milner в ML использовал выведение типов 37 лет назад.И C# до сих пор его не догнал, кстати. Егойный вывод типов слишком локален и примитивен, а в ML можно вообще за всю программу нигде тип не указать, все выводится.
в ML можно вообще за всю программу нигде тип не указать, все выводится.Там есть обратная сторона: нет неявных кастов и перегрузки.
- где пользовательские value types?Я че-то связи ответа с вопросом не увидел. Enumeration позволяет иметь неотбоксенный набор данных с методами?
- где методы у инстансов value types?
Енумерейшены. В некотором роде иммутабл объекты.
Не очень понимаю, о каких, собственно, проблемах идет речь =)Ах ты ж ебаный ты нахуй!
Я знаю проблему, где
code:
Short num = 5;
Set<Short> listOfShorts = new HashSet<Short>
listOfShorts.add(num);
listOfShorts.remove(5);
System.out.println(listOfShorts.contains(num;
выдает true. Такая проблема есть, нельзя не признать. О ней стоит помнить.
Вылазит она достаточно редко (я в живом коде ни разу, кажется, не встречал та же интеллиджей ее подсвечивает. Да и к генерикам тут отношение постольку поскольку.
Этим языком можно пользоваться?
// Я не травли ради, правда удивительно!
upd: А, типа «5» другого типа и не Equal'ится к Short(5)? Ну в таком случае что-то мне подсказывает, что дженерики в java совсем слабые, до хорошей строгой типизации не дотягивают.
это не пиздец? :3
ну так почти в любом языке будет, кроме суперспециальных. Думаю, в Java есть BitSet.
Хорошо, давай по сравниваем работу BitSet, у меня вот так получилось
просос сисярпу в два раза, например :3
Запускаешь в дебаге, дальше не смотрел.
Другой вопрос, что это все небезнадежно, все эти фичи еще можно добавить, java'у заметно оптимизят от версии к версии. У них есть много хорошего поддерживаемого кода. У них пока получше с кроссплатформенностью.
Т.е. если ты профессионал и пишешь на java, то особых проблем нет.
Новичку я, конечно, посоветовал бы выбирать .NET
По моему личному мнению - нафиг не надо. Мизюз/абуз фич - головная боль, о которой нельзя забывать. Чем больше фич - тем потенциально больше эта самая боль. У меня есть опасения, что внедрение честных лямбд/замыканий сильно поспособствует снижению мейнтебилити.Ну вот здесь мне кажется ты слишком сгущаешь краски. Лямбды даже в C++ добавлять «собираются», и мне кажется не зря. Отсутствие лаконичного способа задания функций на лету — главный барьер к применению алгоритмов (в смысле STL). А применение алгоритмов (хотя бы типа for_each или for_all) ведет к более ясному коду, слегка уменьшает вероятность ошибиться.
Да, всякое сумасшествие надо зарезать на корню, но это регулируется так же, как и другие возможности сходить с ума при кодировании
Не, по большому счету я согласен, конечно, что java отстает от C# в некоторых моментах и тому есть несколько логичных причинизвини, не вижу, там у тебя упомянуто в качестве причины то, что сишарп запускается всего на одной проприетарной платформе и имеет на ней специальную проприетарную оптимизацию?
У них пока получше с кроссплатформенностью.устроит защитников java, то да, написано.
сишарп запускается всего на одной проприетарной платформеа java на каком количестве проприетарных платформ запускается?
Ладно, шучу, но если серьезно, то процитированное строго говоря вранье, потому что есть mono.
Ладно, шучу, но если серьезно, то процитированное строго говоря вранье, потому что есть mono.которое несовместимо. По крайней мере под линуксом многие современные .net программы запускать не выходит. Кстати, быть может .Net не вполне платформанезависимая, а как java SWT?
Вот по приколу набрал java+qnx в гугле - сабж есть, а mono+qnx не существует (есть ссылка, что ведутся работы, одним или двумя студентами вроде, так что за время работ новая .net выйдет)
Ладно, шучу, но если серьезно, то процитированное строго говоря вранье, потому что есть monoНу в принципе да, я и забыл, ведь .NET реализован на довольно приличном количестве операционных систем: реализации есть под Windows 2000, Windows XP, Windows Seven, Windows 2008 Server и даже есть мобильная версия под Windows Mobile! И да, ведь есть еще и mono! :3
А сейчас на работе пишу на C++, причем под такие платформы, на которых java не работает и не будет, я думаю
Так что не суетись.
Я сознательно в пред своем посте не согласился, надеясь, что меня ткнут в пример, когда эти пропертис архиполезны и незаменимы.
По твоей ссылке пока успел посмотреть только первый проект - Reactive Relations. Прикольный проект, ты его, кажется, рекламировал уже здесь.
Но если на его примере говорить, что в джаве такого и не снилось, то это не совсем так. Посмотри, например, как в JMock мочатся произвольные интерфейсы/объекты. Там задание экспектейшенов вполне смахивает на то, как ты свое дерево экспрешеннов в коде задаешь. Красота кода, на мой взгляд, не страдает.
Концепт ДжейМока растет из фаулеровского FluentInterface.
На другие проекты пока времени не было посмотреть. Вообще, дальше что-то иное будет, или принцип использования везде похожий?
пример головной боли можно? лучше из 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.
Делает ли только отсутствие всех этих рюшечек его морально устаревшим - совсем другой вопрос.
Можете вон для сравнения на PL/SQL посмотреть. Там, для разнообразия, в 11g оракловцы добавили оператор continue. До этого его поведение приходилось реализовывать через goto...
Пример посмотреть можно тут, самый последний пример в статье до комментариев.
Оно не честный value type, потому что не на стеке создается (такое в джаве, действительно, возможно только для примитивов). Но поведение почти похоже =)
upd: А, типа «5» другого типа и не Equal'ится к Short(5)? Ну в таком случае что-то мне подсказывает, что дженерики в java совсем слабые, до хорошей строгой типизации не дотягивают.Догадка верная. Но там не в генериках проблема. Там у remove сигнатура такая:
boolean remove(Object o);
Этим языком можно пользоваться?Ну так, периодически переосмысливая мир, ага =)
А можно сакральный вопрос: а почему?
Ну вот здесь мне кажется ты слишком сгущаешь краски. Лямбды даже в C++ добавлять «собираются», и мне кажется не зря. Отсутствие лаконичного способа задания функций на лету — главный барьер к применению алгоритмов (в смысле STL). А применение алгоритмов (хотя бы типа for_each или for_all) ведет к более ясному коду, слегка уменьшает вероятность ошибиться.Это все есть. Анонимный класс.
Да, всякое сумасшествие надо зарезать на корню, но это регулируется так же, как и другие возможности сходить с ума при кодировании
Под коллекшены гугл даже либу написал. Поценить можно тут.
* @throws ClassCastException if the type of the specified element
* is incompatible with this list (optional)
Подозреваю, что это было сделано для лучшей совместимости с каким-то ужасным кодом.
Это все есть. Анонимный класс.да есть-то оно, может быть и есть. В .NET 2 (а может и в 1, не помню уже) были анонимные делегаты. Но и они довольно громоздки. Хотя сумасшествий и с ними уже можно было накатать. Это все о синтаксическом сахаре, о нем, да.
Под коллекшены гугл даже либу написал. Поценить можно тут.
Подозреваю, что это было сделано для лучшей совместимости с каким-то ужасным кодом.Нет, тут похоже правда надо переосмыслить жизнь. При создании новой синтаксической фичи языка заботятся о совместимости с неким ужасным кодом. Нет, я правда не понимаю.
И много там еще таких анти-генерик методов в генериках?
здешние знатоки явы похоже и про BitSet-то не знают, и про отсутствие определения boolean в спецификации jvm тоже.Давай посравниваем. Токо сравнивать надо с java.util.BitSet
Хорошо, давай по сравниваем работу 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
Если ты спросишь, какого рожна им не реализованы нативные массивы булеанов - то я скажу из-за трейдоффа по скорости/кроссплатформенности.
я не нервничаю и не суечусь, все ок :3
Нет, тут похоже правда надо переосмыслить жизнь. При создании новой синтаксической фичи языка заботятся о совместимости с неким ужасным кодом. Нет, я правда не понимаю.Ну как тебе сказать. Собственно, сам erasure был придуман именно для этой самой совместимости кода. На мой взгялд они, правда, слишком сильные ограничения навесили, и тем самым облажались. Уж лучше бы в джвме жило две маленьких джава машины. Одна для догенерикового кода, и вторая - для послегенерикового. Так что имхо сановцы просто смалодушничали, и обошлись малой кровью.
И много там еще таких анти-генерик методов в генериках?Да нет на самом деле. Это единственное, что я навскидку помню.
Но других приколов еще масса. Там целая книга про это есть =) Если хочешь, вечером могу запостить линк.
Ну вот в .NET'е, например, Dictionary<,> тоже имплементит обычный IDictionary, но указанных проблем не возникает.
А, хотя тут тоже есть догадка. Оно имплементит нечто не-генерик?Нет, там такого нету.
Ну вот в .NET'е, например, Dictionary<,> тоже имплементит обычный IDictionary, но указанных проблем не возникает.
http://www.docjar.com/html/api/java/util/Collection.java.htm...
Примеров приводит не буду, просто зацитирую самого Гослинга из приведенной выше ссылкизайду чуть с другой стороны:
ты согласен с тем?:
1. что чем исходник компактнее (без потери читабельности) тем меньше делается ошибок?
и тем быстрее читается и пишется код?
2. разработчики Java игнорируют п.1. и скорее даже против п.1. и исходя из этого они против syntactic sugar, против операторов, против using, против свойств, были против generic-ов и т.д.
1. что чем исходник компактнее (без потери читабельности) тем меньше делается ошибок?Согласен. Замечу только, что читабельность - ооч субъективное понятие. Где-то компактность дает прирост читабельности (как в том же JMock/FluentInterface где-то нет (попробуйте регэкспы длиннее 10 символов почитать).
и тем быстрее читается и пишется код?
2. разработчики Java игнорируют п.1. и скорее даже против п.1. и исходя из этого они против syntactic sugar, против операторов, против using, против свойств, были против generic-ов и т.д.Не согласен. Проблемы в п2 имхо мало связаны с п1.
Возьмем те же операторы. И представим себе ситуацию - незнакомый код с переопределенным оператором +. Который не дай бог еще, скажем, не симметричен. С какими-нибудь паразитными эффектами. Не знаю как вам, но мне читать код будет тяжело.
А теперь представим, что оператор + переопределяется по-разному. И иерархий несколько. По-моему, уже можно тушить свет.
А все ради чего? Чтобы вместо какого-нибудь ".add" написать "+"? По-моему, оно того не стоит.
Допускаю, что это актуально было раньше, когда текст писался в блокноте, и в какой-то момент все начинало тупо упираться в скорость набора текста. Сейчас, со всякими смарт-комплишенами, лайв тимплейтами и авторефакторингами это уже не проблема.
Повторюсь опять же, что джава, как язык, действительно развивается медленнее сишарпа/.нета. Пока отставание, на мой вгляд, не критично. И перекрывается преимуществом в разнообразии либов/технологий. И нивелируется наличием клевых сред типа ИнтеллиДжей.
Джаву можно ругать бесконечно, но ей пока нет кроссплатформенной альтернативы с хотя бы сравнимым набором технологий.
Заодно замечу, что лично для меня язык становится проблемным, или морально устаревшим - когда мне на нем становится противно писать, из-за массы изобретаемых по ходу велосипедов, давно присутствующих в стандарте/либах других языков. Отсутствие continue в pl/sql - яркий тому пример.
Генерики в яве только внешне похожи на шаблоны, внутри все приводится к тому классу, который описан в коде самого генерик класса, вся информация о конкретном типе теряется.И много там еще таких анти-генерик методов в генериках?
Подозреваю, что это было сделано для лучшей совместимости с каким-то ужасным кодом.
Нет, тут похоже правда надо переосмыслить жизнь. При создании новой синтаксической фичи языка заботятся о совместимости с неким ужасным кодом. Нет, я правда не понимаю.
Генерики в яве только внешне похожи на шаблоныну я как бы понимаю разницу между шаблонами и генериками. Но и генерики можно делать по-человечески.
Ладно, я понял, тут одно из двух: либо полная совместимость с догенериковской джавой, либо человеческие генерики (вы меня не переубедите, что это нормально иметь в генерик-коллекции метод с сигнатурой Name(Object o когда семантически там всегда должен присутствовать тип, которым этот генерик инстанцирован и проверка этого оставляется программисту и IDE).
В принципе, не сужу разработчиков, думаю они не могли не подумать о том, о чем подумал я, просто удивился.
А теперь представим, что оператор + переопределяется по-разному. И иерархий несколько. По-моему, уже можно тушить свет.и чем это отличается от ситуации, что метод add переопределяется у каждого объекта по своему?
т.е. тебе не лень запомнить, что add бывает разный, но лень запомнить - что + бывает разный?
+ маскируется четче
т.е. тебе не лень запомнить, что add бывает разный, но лень запомнить - что + бывает разный?С такой аргументацией можно дойти до того, что писать всем стоит в шестнадцатеричных кодах.
Чем больше таких скрытых неочевидных вещей в коде, ломающих шаблон - тем он менее читабелен.
Еще это в чем-то сродни тому, что ты все переменные в коде обзываешь буковками алфавита. Если эти операторы так хороши - давай тогда все методы в таких операторах делать - очень удобно чейнить будет. Кратко. Красота. Выглядеть, правда, как брейнфак будет...
И потом, ты никак не можешь сказать, чем это полезно. То есть у тебя пока аргументация такая - есть не просит, ну и пусть будет. Это не всегда хорошо, ибо именно так всякие всячести и обрастают кучей ненужного мусора, превращаясь в франкенштейна/помойку.
Я вот тут все с ужасом жду джава-проектов, в которых сорсы будут уникодно-локализованные, с какими-нибудь китайскими именами переменных, например.
Нет, тут похоже правда надо переосмыслить жизнь. При создании новой синтаксической фичи языка заботятся о совместимости с неким ужасным кодом. Нет, я правда не понимаю.эээ
брррр
о каких совместимостях вы тут говорите?
есть стандарт языка, где четко прописано что метод remove у коллекций работает только основываясь на методе equals переданного объекта (ну иногда еще и hashCode)
вы предлагаете при введении фичи генерики менять стандарт?
за каким спрашивается чертом?
раньше я когда удалял из коллекции то передавал туда анонимный класс-фильтр который матчил что мне нужно
а теперь мне надо как-то такой же класс создавать? а если у него конструктор закрытый то как мне создавать-то его?
кстати да, в других языках remove генериковый? как вы тогда удаляете если конструктор закрыт?
в с++ для этого используют отдельный метод http://www.cplusplus.com/reference/algorithm/remove_if/ в который надо передавать предикат
и есть стандартный предикат-обёртка, вызывающий == для переданного объекта
всё бы хорошо вот токо такой метод remove всегда линейный, а для многих коллекций можно удалять быстрее, тут я так понимаю с++ беспомощен
вы предлагаете при введении фичи генерики менять стандарт?Ну, как бы да, иначе толку от этих генериков, если они никаких доп ограничений не накладывают?
Добавить произвольный объект ты же не можешь. А чем, тогда спрашивается, добавление хуже удаления?
Там какой-то другой ризонинг был, я просто не помню какой, и нагуглить сходу не удается.
есть стандарт языка, где четко прописано что метод remove у коллекций работает только основываясь на методе equals переданного объекта (ну иногда еще и hashCode)ага, т.е. по-твоему, стандарт — враг человека. А мне всегда хотелось верить, что друг.
вы предлагаете при введении фичи генерики менять стандарт?
раньше я когда удалял из коллекции то передавал туда анонимный класс-фильтр который матчил что мне нужнозач0т
а теперь мне надо как-то такой же класс создавать? а если у него конструктор закрытый то как мне создавать-то его?
кстати да, в других языках remove генериковый? как вы тогда удаляете если конструктор закрыт?что-то я не понял. Есть структуры данных, которые удаляют все элементы, на которых твой анонимный класс выдает true быстрее, чем за линейное время? Ну-ка ну-ка.
в с++ для этого используют отдельный метод http://www.cplusplus.com/reference/algorithm/remove_if/ в который надо передавать предикат
и есть стандартный предикат-обёртка, вызывающий == для переданного объекта
всё бы хорошо вот токо такой метод remove всегда линейный, а для многих коллекций можно удалять быстрее, тут я так понимаю с++ беспомощен
что-то я не понял. Есть структуры данных, которые удаляют все элементы, на которых твой анонимный класс выдает true быстрее, чем за линейное время? Ну-ка ну-ка.А, я понял о чем он.
Типа, если мы знаем хешкоды объектов, которые надо удалить, или удаляемые объекты у нас вообще упорядочены, тогда оно может не по всей коллекции пройтись, а только по нужной части.
Забавно. Да, это неплохой шорткат. Тогда, может, и правда из-за этого.
Все элементы - это уже пограничный случай, фиг с им =)
Есть структуры данных, которые удаляют все элементы, на которых твой анонимный класс выдает true быстрее, чем за линейное время?если hashCode определен то любые структуры использующие хэши
если сравнение определено (интерфейс Comparable) то любые структуры использующие упорядочивание для быстрого поиска элементов
просто в Java принято что любые коллекции наследуются от базовой Collection
и итераторы у них у всех с одинаковым интерфейсом
это ОЧЕНЬ удобно
в С++ с этим полный бардак, все коллекции независимые классы, у всех итераторы с разным поведением
например: некоторые итераторы тама при удаленни текущего элемента портятся а некоторые нет
в джава любая кастомная коллекция может быть подставлена в базовые библиотеки без проблем
в С++ кастомные коллекции с базовыми ничего общего не имеют, для них приходится стандартные методы переписывать
Тогда, может, и правда из-за этого.ну там есть такая книжка Java Puzzlers (как-то так называется где сами авторы дженериков рассказывают почему remove принимает Object
Давай посравниваем. Токо сравнивать надо с 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. Мне даже париться не надо. Но всё красиво и понятно.
просто в Java принято что любые коллекции наследуются от базовой Collection
и итераторы у них у всех с одинаковым интерфейсом
это ОЧЕНЬ удобно
Проблема в том что коллекции на порядок медленнее масивов, а у масивов в яве итераторов вообще нет.
В С++ итератор есть даже для обычного масива, что бы унифицировать алгоритмы. За это приходится платить неопределенным поведением в некоторых случаях.
Проблема в том что коллекции на порядок медленнее масивов, а у масивов в яве итераторов вообще нет.ну я с тобой не согласен
В С++ итератор есть даже для обычного масива, что бы унифицировать алгоритмы. За это приходится платить неопределенным поведением в некоторых случаях.
Arrays.asList выдает вполне себе итератор по массиву, который можно в любые алгоритмы пихать
абсолютно не вижу здесь никаких отличий от с++
по поводу того что создается новый объект итератор, то в джаве итератор это всегда новый класс
по поводу того что коллекции медленнее массивов, то в джаве есть всякие библиотечные методы для работы чисто с массивами
да и потом это уже другой вопрос, за ответом - вона во всякие статьи развеивающие мифы про скорость джавы
Arrays.asList выдает вполне себе итератор по массиву, который можно в любые алгоритмы пихать
абсолютно не вижу здесь никаких отличий от с++
А он случаем не перегонит массив в коллекцию? Если перегоняет, то это везде не быстро, хоть на с++, хоть на яве, хоть где.
по поводу того что коллекции медленнее массивов, то в джаве есть всякие библиотечные методы для работы чисто с массивамиНу вот и получается, для коллекций одна реализация алгоритмов, для массивов другая, это обратная сторона медали ява итераторов.
да и потом это уже другой вопрос, за ответом - вона во всякие статьи развеивающие мифы про скорость джавы
А по поводу быстродействия, вопрос не в сравнение между языками, массивы в яве не сильно от массивов в с++ отличаются. А вот коллекции в яве гораздо медленнее массивов в яве же.
А он случаем не перегонит массив в коллекцию? Если перегоняет, то это везде не быстро, хоть на с++, хоть на яве, хоть где.если бы перегонял то это не был бы итератор
я же тебе именно его дал как ответ на то что в джаве у массивов нет итераторов
А вот коллекции в яве гораздо медленнее массивов в яве же.блин, ну явно же хрень пишешь
если мы говорим об абстрактной колелкции в вакууме то твое утверждение верно для любого языка
думаешь я тебе в с++ не найду какуюнить зверскую коллекцию которая будет пипец какой медленной по сравнению с массивом?
если же говорим про Arraylist (аналог vector в С++)
то давай доказательство своим словам
напиши простенький тест обычного массива и Arrays.asList от этого же массива
ну не верю что будет "гораздо медленнее", там даже гарбадж коллектору особо нечего делать будет
Вот тебе твой тест
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
если бы перегонял то это не был бы итератор
я же тебе именно его дал как ответ на то что в джаве у массивов нет итераторов
Ну раз так, куда будет показывать итератор после удаления элемента?
Это ли называется одинаковым поведением итераторов?
если же говорим про 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 не быстрая операция, но без него чего нибдь закешироваться может.
зачем ты тестишь скорость работы генератора рандома, просили же коллекции и массивы :3
зачем ты тестишь скорость работы генератора рандома, просили же коллекции и массивы :3Да даже с рандомом разница большая, хотя он существенно на время влияет
Рандом, что б код не соптимизировался, и цикл честно работал.
Да и generator.nextInt не быстрая операция, но без него чего нибдь закешироваться может.ужас какой
сделай третий массив и загони туда все индексы до начала измерений
потом в тестах беги по массиву индексов
сделай третий массив и загони туда все индексы до начала измерений
потом в тестах беги по массиву индексов
Тебе небольшей тест нужен, или что то другое?
что про мой вариант скажешь ?
void 20:28:29 ~/.workspace % java ArraysVSCollections 0
sum: 494934045 time: 62
sum: 494934045 time: 84
void 20:28:36 ~/.workspace % 0
после удаления элемента итератор выкинет исключение.
код вообще бредовый - int и Integer разные вещи, сделай массив тех же объектов что и лист и повтори тест.
конфиг компа: двухядерный атлон, 1 гиг оперативки
параметров никаких спецаильных не указывал
ты даже версию нормально сказать не можешь?
Алсо вот резалты на домашнем компе (Q6600, 2 Gb например:
sum: 495087599 time: 16
sum: 495087599 time: 266
а то что я могу написать десяток ява-машин, в версии которых будет присутсвовать число 17
о ужас
эта штука сама по себе может долго работать
правильно: System.currentTimeMillis;
и эта
а почему такая нелюбовь к for each ?
осталось спросить почему я скобки на отдельных строках ставлю
>эта штука сама по себе может долго работать
точно, именно поэтому на массивах 16 миллисекунд, а на списке 300.
и вообще пиздеж, что System.currentTimeInMills чем-то отличается от Calendar.bla-bla-bla - сейчас проверил, результаты те же.
что там у , я не знаю, но я уже писал - запускал на двух машинах, несколько раз, резалты приведены.
и там и там ось 32-х битная наверно?
да, 32битные
я не нервничаю и не суечусь, все ок :3а у меня еще что-то скребло в подсознании, когда этот смайл увидел
Он мне сейчас пишет унижающие его приваты с просьбами не палить
странно что мне не пишет, я его тож спалил, правда я не заявил об этом во всеуслышанье.
Может быть именно поэтому и не пишет?
он просто не в курсе что у меня более веское доказательство чем скриншот - у меня ПМ от него
ты бы ещё 16-ти битную нашел и на ней проверил.
>да, 32битныеих ещё не мало.
и к тому же яве предъявлялись претензии в недостаточной оптимизации к железу. Этим своим требованиям (использовать 64 бит вместо 32) вы тем самым потверждаете, что ява оптимизирована под значительно меньшее количество железа, чем дот нет
>ты бы ещё 16-ти битную нашел и на ней проверил.
32битных систем все еще большинство сейчас, критичней как работает на них же :3
>
>>ты бы ещё 16-ти битную нашел и на ней проверил.
при любом ответе на моё сообщение мне приходит пм с уведомлением. так что удаляй-не удаляй, а я все равно прочитаю (причем если ты исправишь сообщение, то я прочитаю даже два варианта - исправленный и изначальный.
>32битных систем все еще большинство сейчас, критичней как работает на них же :3
на серверах? ну-ну.
про .NET все уже давно забыли, сравнение массивов и List пошло от C++.
ок, судя по твоему посту массивы "на 64битных серверах" работают откровенно хуево по сравнению с 32битными)
это из чего следует?
у меня 16 миллисекунд стабильно. что у тебя за процессор?
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
несколько хуже, чем на 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)
эпик фейл, извини. теперь можешь выдвигать свои оправдания, почему ява так фейлит, интересно послушать :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 раза конечно удручает но хоть не такая огромная как у тебя
есть подозрение что у тебя слишком мало памяти отведено джава машине и поэтому слишком часто работает gcты прав в том, что gc на этом коде похоже вообще не работает. выставил -Xmx1024M, результаты те же, что и на дефолтных настройках (сколько там отводится по умолчанию? 64 мегабайта?)
upd.
твой код:
sum: 494966016 time: 219
sum: 494966016 time: 391
алсо, у тебя суммы не совпали, что за фигня?
Чем больше таких ... вещей в коде, ломающих шаблон - тем он менее читабелен.в цитаты нах!
после удаления элемента итератор выкинет исключение.Так не пойдет, внутри ArrayList сидит тот же обычный массив, разницы не будет.
код вообще бредовый - int и Integer разные вещи, сделай массив тех же объектов что и лист и повтори тест.
Как бы обычно нужно работать с числами, а коллекции позволяют работать только с обертками.
Так не пойдет, внутри ArrayList сидит тот же обычный массив, разницы не будет.Есть trove. Правда работа с элементами там делается через визиторы, а не итераторы.
Как бы обычно нужно работать с числами, а коллекции позволяют работать только с обертками.
Но в целом это очень удобно, а главное, не так срет в память, как итераторы.
Оставить комментарий
stm6692945
Хорошо, теперь это сириоус тред и вот сириоус вопросы к жабе:- где замыкания?
- где лямбды?
- где свойства?
- где шаблоны? Разработчики Sun вынуждены только облизываться. Даже генерики, введённые в 5-й версии Java — не более, чем syntactic sugar. Дотнетовские генерики это реально поддерживаемые платформой типы, которые расширяются на лету при загрузке, котрые оптимизируются JIT-компилятором. Для Java генерики существуют только в коде и ни JIT, ни загрузчик классов их никогда не видит. Поэтому проблемы боксинга, преобразования типов в runtime просто скрыты от программиста.
- где делегаты/евенты?
- где partial-классы?
- где детерминированное освобождение ресурсов
(ключевое слово using + интерфейс IDisposable)?
- где оптимизация JVM для расширений процессоров?
- где аналог linq и в частности удобные мапперы?
- где расширения методов класса?
- где скрытая имплементация интерфейсов?
- где перегрузка параметров функций?
- где нормальное потребление памяти приложением?
- где быстрая работа приложения?
- где нормальные иде, с полноценными дизайнерами?
- где пользовательские value types?
- где методы у инстансов value types?
- где var и анонимные типы
- где перегрузка операторов?
- где оптимизиции хвостовых вызовов? (в свете функционального хайпа это должно вызывать некоторый батхёрт)
- Где чёткое разделение домены и сборки? Это не учитывая, целый ворох технологий недоступный понимаю жабоиндусов, такие всякие сильверлайты/вин-веб/формочки, впф, XNA, список можно продолжать бесконечно, как впрочем и список ущербности жабы...
Всего, чего нет в жабе, автоматически объявляется хуитой, как только это появляется в жабе, это автоматически становится нехуитой. При этом, требуется сделать вид, что хуитой это называл кто-то другой...
Ну, что скажете? разве ява годный язык?