Вопрос

я искал двунаправленная карта реализацию на Java и наткнулся на эти две библиотеки:

Оба бесплатны, имеют реализацию двунаправленной карты, которую я искал (BidiMap в Apache, BiMap в Google), и на удивление почти одинакового размера (Apache 493 КБ, Google 499 КБ) [прим.:уже неправда!] и кажутся мне во всех отношениях очень похожими на меня.

Какой из них мне выбрать и почему?Существуют ли другие эквивалентные альтернативы (должны быть бесплатными и иметь хотя бы двунаправленную карту)?Я работаю с последней версией Java SE, поэтому нет необходимости искусственно ограничиваться Java 5 или чем-то в этом роде.

Это было полезно?

Решение

На мой взгляд лучший выбор Гуава (ранее известные как коллекции Google):

  • он более современный (имеет дженерики)
  • он полностью соответствует требованиям API коллекций
  • он активно поддерживается
  • CacheBuilder и это предшественник MapMaker просто потрясающие

Apache Commons Collections также является хорошей библиотекой, но она уже давно не может предоставить версию с поддержкой дженериков (которая является главный недостаток для API коллекций, на мой взгляд) и, как правило, похоже, находится в режиме обслуживания/не делайте слишком много работы над ним Недавно фонд Commons Collections снова набрал обороты, но ему еще предстоит наверстать упущенное..

Если размер загрузки/объем памяти/размер кода является проблемой, то коллекции Apache Commons могут быть лучшим кандидатом, поскольку это общая зависимость других библиотек.Поэтому использование его в вашем собственном коде потенциально может быть выполнено без добавления каких-либо дополнительных зависимостей.Редактировать:Это конкретное «преимущество» к настоящему времени частично сведено на нет, поскольку многие новые библиотеки фактически зависят от Guava и нет в коллекциях Apache Commons.

Другие советы

Самые важные вещи, которые я обнаружил, делают Коллекции Google идеальным местом для начала:

  • Дженерики (Коллекции без дженериков — FTL)
  • Согласованность с инфраструктурой коллекций (Джош Блох был ключевым игроком в этой структуре)
  • Корректность.Эти ребята отчаянно стремятся решить эту проблему правильно;у них есть что-то вроде 25 тысяч модульных тестов, и они привязаны к правильному API.

Вот отличный YouTube видео о докладе, который провел основной автор, и он хорошо объясняет, что стоит знать об этой библиотеке.

Из часто задаваемых вопросов:Часто задаваемые вопросы о коллекциях Google

Почему Google создал все это, если вместо этого он мог попытаться улучшить Apache Commons Collections?

Коллекции Apache Commons явно не отвечали нашим потребностям.Он не использует дженерики, что является для нас проблемой, поскольку мы ненавидим получать сборники компиляции из нашего кода.Он также был в «удержании» в течение долгого времени.Мы могли видеть, что для нас потребуется довольно серьезная инвестиция, чтобы исправить его, пока мы не будем рады использовать его, и тем временем наша собственная библиотека уже расти органически.

Важным отличием между библиотекой Apache и нашей является то, что наши коллекции очень добросовестно придерживаются контрактов, указанных в реализации интерфейсов JDK.Если вы просматриваете документацию Apache, вы найдете бесчисленные примеры нарушений.Они заслуживают того, чтобы указать на них так ясно, но все же, отклонение от стандартного поведения в сборе, рискованно!Вы должны быть осторожны, что вы делаете с такой коллекцией;ошибки всегда просто ждут своего часа.

Наши коллекции полностью генерированы и никогда не нарушают свои контракты (за изолированными исключениями, где реализации JDK создали сильный прецедент для приемлемых нарушений).Это означает, что вы можете передать одну из наших коллекций любому методу, который ожидает коллекции и чувствует себя уверенно, что все будет работать именно так, как и должно.

Еще две вещи (надеюсь, я не ошибаюсь)

  • Лицензией Guava (новое название коллекций Google) является лицензия Apache 2.0, что означает:тот же, что и для проекта Apache Commons
  • Я не могу найти исходный код Guava в файле для загрузки (кажется, возможен только git-доступ)

Одна неприятная вещь в Guava заключается в том, что Multimap не расширяет java.util.Map.Если у вас есть собственные методы, которые работают с картами, они не будут работать с мультикартами Guava (интерфейс Apache MultiMap расширяет java.util.Map).Я уверен, что есть веская причина, почему это так, но это также неудобно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top