Главная » Разработка для Android » Типы реализации коллекций – JAVA ДЛЯ ANDROID

0

 

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

ArrayList – список на основе массива. В нем быстро происходит индексация, но медленно изменяется размер.

LinkedList – список, который может быстро менять размер, но медленнее индексируется.

HashSet – набор, который реализуется в виде хеша, add, remove, contains и size выполняются за постоянное время, то есть для их работы нужен хорошо организованный хеш. HashSet может содержать nul 1 (не более одного).

HashMap – реализация интерфейса Map, использующего в качестве индекса хеш-таблицу, add, remove, contains и size выполняются за постоянное время, то есть для их работы нужен хорошо организованный хеш. HashMap может содержать один и только один ключ null, в то время как сколько угодно значений могут быть nul 1.

ТrееМар – упорядоченная карта. Объекты в карте отсортированы в соответствии с их естественным порядком, если они реализуют интерфейс Comparable, либо в соответствии с Comparator, переданным конструктору ТгееМар, если интерфейс Comparable в них не реализуется.

Пользователи Java, уже выработавшие собственный стиль, предпочитают объявлять типы интерфейсов, а не типы реализации, если это только возможно. Это общее правило, но его будет проще понять в контексте фреймворка коллекций.

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

Но такой вариант реализации нам не подойдет: он просто будет работать не со всеми видами списков! Он применим только к ArrayList. Если в какой-то момент понадобится изменить код, вызывающий этот метод, например перейти от использования ArrayList на LinkedList, код просто не сможет использовать прежний метод. Согласитесь, это совершенно неоправданно.

Более красивая реализация приведенного выше кода может выглядеть так:

Эта версия более адаптируема, поскольку она не связывает метод с конкретной реализацией списка. Метод зависит только от того факта, что параметр реализует определенный интерфейс. Неважно, как именно. При использовании типа интерфейса в качестве параметра мы сообщаем именно ту информацию, которая нужна для выполнения задачи, – ни больше ни меньше.

На самом деле код можно было бы оптимизировать и далее, если бы в качестве параметра и типа возврата мы имели коллекцию (Collection).

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии