Какая библиотека Java Collections наиболее эффективна?
Несколько лет назад я много занимался Java, и у меня тогда сложилось впечатление, что trove - лучшая (самая эффективная) реализация Java Collections. Но когда я прочитал ответы на вопрос « Самые полезные бесплатные библиотеки Java? », Я заметил, что эта книга почти не упоминается. Так какая библиотека Java Collections сейчас лучше?
ОБНОВЛЕНИЕ: Чтобы уточнить, я в основном хочу знать, какую библиотеку использовать, когда мне нужно хранить миллионы записей в хэш-таблице и т. Д. (Требуется небольшой объем времени выполнения и объем памяти).
java
collections
Фрэнк
источник
источник
Ответы:
Из проверки видно, что Trove - это просто библиотека коллекций для примитивных типов - это не значит, что он должен добавлять много функциональности по сравнению с обычными коллекциями в JDK.
Лично (и я предвзято) я люблю Guava (включая бывший проект Google Java Collections). Это значительно облегчает выполнение различных задач (в том числе коллекций), по крайней мере, достаточно эффективно. Учитывая, что операции сбора редко образуют узкое место в моем коде (по моему опыту), это «лучше», чем API сбора данных, который может быть более эффективным, но не делает мой код более читабельным.
Учитывая, что перекрытие между Trove и Guava в значительной степени равно нулю, возможно, вы могли бы уточнить, что вы на самом деле ищете из библиотеки коллекций.
источник
Вопрос (сейчас) о хранении большого количества данных, которые могут быть представлены с использованием примитивных типов, например
int
, на карте. Некоторые ответы здесь очень вводят в заблуждение, на мой взгляд. Посмотрим почему.Я изменил эталонный тест Trove для измерения времени выполнения и потребления памяти. Я также добавил PCJ к этому бенчмарку, который является еще одной библиотекой коллекций для примитивных типов (я широко ее использую). «Официальный» тест производительности не сравнивает IntIntMaps с коллекцией Java
Map<Integer, Integer>
, вероятно, хранениеIntegers
и хранениеints
не совпадают с технической точки зрения. Но пользователь может не заботиться об этой технической детали, он хочет эффективно хранить данные, которые могут быть представленыints
.Сначала соответствующая часть кода:
Я предполагаю, что данные приходят как примитивные
ints
, что кажется нормальным. Но это подразумевает штраф за время выполнения для Java-утилиты из-за автобокса, который не является обязательным для каркасов примитивных коллекций.Результаты выполнения (без
gc()
вызовов, конечно) на WinXP, jdk1.6.0_10:Хотя это может показаться существенным, но это не причина для использования такой основы.
Причина в производительности памяти. Результаты для карты, содержащей 100000
int
записей:Коллекции Java требуют более чем в три раза больше памяти по сравнению с примитивными платформами сбора. Т.е. вы можете хранить в три раза больше данных в памяти, не прибегая к дисковым операциям ввода-вывода, которые снижают быстродействие во времени. И это имеет значение. Читайте подробности о том, почему.
По моему опыту, высокое потребление памяти является самой большой проблемой производительности Java, что, конечно, также приводит к снижению производительности во время выполнения. Примитивные рамки коллекции могут действительно помочь здесь.
Итак: нет, java.util не является ответом. И «добавление функциональности» в коллекции Java - не главное, когда спрашивают об эффективности. Также современные коллекции JDK не "превосходят даже специализированные коллекции Trove".
Отказ от ответственности: эталонный тест здесь далек от завершения и не идеален. Он предназначен для того, чтобы показать, что я испытал во многих проектах. Примитивные коллекции достаточно полезны, чтобы терпеть подозрительные API - если вы работаете с большим количеством данных.
источник
hashCode()
. Это получает васint
как ключ.Я знаю, что это старый пост, и здесь есть тонна ответов. Но, ответы выше являются поверхностными и слишком упрощенными с точки зрения предложения библиотеки. Нет ни одной библиотеки, которая бы справлялась с различными тестами, представленными здесь. Единственный вывод, который я могу сделать, - это если вы заботитесь о производительности и памяти, особенно о примитивных типах, то стоит взглянуть на альтернативы, отличные от jdk.
Вот более подробный анализ с точки зрения механики тестирования и рассматриваемых библиотек. Это тема в списке разработчиков mahout.
Библиотеки покрыты
Обновление июнь 2015 : К сожалению, оригинальные тесты больше не доступны и, кроме того, они немного устарели. Вот сравнительно недавние (январь 2015 г.) тесты, выполненные кем-то другим. Он не такой всеобъемлющий и не имеет интерактивных поисковых инструментов, как исходная ссылка.
источник
Как отметили другие комментаторы, определение «эффективный» создает широкую сеть. Однако никто еще не упомянул библиотеку Javolution .
Некоторые из основных моментов:
Дистрибутив Javolution включает набор тестов, чтобы вы могли увидеть, как они складываются с другими библиотеками / встроенными коллекциями.
источник
Некоторые коллекции libs для рассмотрения:
В первую очередь я хотел бы обратиться к библиотеке коллекций JDK. Он охватывает наиболее распространенные вещи, которые вам нужно сделать, и, очевидно, уже доступен для вас.
Google Collections, вероятно, лучшая высококачественная библиотека за пределами JDK. Он активно используется и хорошо поддерживается.
Коллекции Apache Commons старше и немного страдают от проблемы «слишком много поваров», но также содержат много полезных вещей.
У Trove есть очень специализированные коллекции для таких случаев, как примитивные ключи / значения. В наши дни мы обнаруживаем, что в современных JDK, а также с коллекциями Java 5+ и параллельными вариантами использования коллекции JDK превосходят даже специализированные коллекции Trove.
Если у вас действительно высокий уровень использования параллелизма, вы обязательно должны проверить такие вещи, как NonBlockingHashMap в высокопроизводительной библиотеке lib, которая является реализацией без блокировок и может растоптать ConcurrentHashMap, если у вас есть подходящий вариант использования.
источник
java.util
Извините за очевидный ответ, но для большинства случаев стандартных коллекций Java более чем достаточно.
источник
Чтобы хранить миллионы
String
на карте, взгляните на http://code.google.com/p/flatmap.источник
Я разработчик Happy-коллекций из Happy-коллекций на Source-Forge
источник
java.util.concurrent
Следует упомянуть ConcurrentHashMap, а также пакет, если вы планируете использовать HashMap в нескольких потоках. предполагается небольшой объем памяти, так как это является частью стандартного Java.источник
Зависит от того, как мы определяем «эффективный».
Каждая структура данных имеет свое поведение Big-Oh для чтения, записи, итерации, использования памяти и т. Д. Связанный список в одной библиотеке, вероятно, будет таким же, как и любой другой. И хэш-карта будет быстрее для чтения O (1), чем связанный список O (n).
Это не звучит как «самый эффективный». Это звучит как «самый популярный» для меня.
Просто некоторые отзывы - я никогда не слышал об этом, и я не знаю никого, кто использовал это. Коллекции, встроенные в JDK, Google или Apache Commons, мне хорошо известны.
источник
Trove предлагает несколько преимуществ.
Тем не менее, много было сделано для улучшения коллекций jdk с тех пор, как был написан trove.
Это стратегии хеширования, которые делают его привлекательным для меня, хотя ... Google для поиска и прочитать их обзор.
источник
Если вы хотите хранить миллионы записей в хеш-таблице, есть вероятность, что у вас возникнут проблемы с памятью. Это случилось со мной, например, когда я попытался создать карту с 2,3 миллионами объектов String. Я пошел с BerkeleyDB , который очень зрелый и хорошо работает. У них есть Java API, который упаковывает API Коллекций, так что вы можете легко создавать карты произвольно больших размеров с очень небольшим объемом памяти. Хотя доступ будет медленнее (так как он хранится на диске).
Дополнительный вопрос : есть ли приличная (и эффективная), ухоженная библиотека для неизменных коллекций? Clojure имеет отличную поддержку для этого, и было бы неплохо иметь что-то подобное для Java.
источник