admin / 10.07.2018

Глава 8 Пакеты и интерфейсы

Здесь, очевидно, есть 3 вопроса, поэтому они могут решать их по очереди:

  1. Как именно я ожидаю, что методы списка будут работать, когда я ожидаю список Integer и получаю список int []?

Ну, методы будут работать точно так, как ожидалось, — это список типов . Здесь является , поэтому будет содержать массивы как каждый элемент:

Таким образом, вернет элемент . В случае содержит один элемент, а именно so:

Будет

Итак,

В случае строк тип возврата — это List of String, а не List of String []. Какие существуют различия в реализации?

— это , не примитивный тип. Отсюда следует различие.

  1. Что хорошего в этом методе для примитивов, если все так неопределенно?

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

Обратите внимание, что с Java 8 преобразование в очень просто:

.

Импорт пакетов

Если вспомнить, что пакеты предлагают эффективный механизм изоляции различных классов друг от друга, становится понятно, почему все встроенные классы Java хранятся в пакетах. Ни один из основных классов Java не хранится в неименованном пакете, используемом по умолчанию. Все стандартные классы хранятся в каком-либо именованном пакете. Поскольку внутри пакетов классы должны быть полностью определены именем или именами их пакетов, длинное, разделенное точками имя пути пакета каждого используемого класса может оказаться слишком громоздким. Поэтому, чтобы определенные классы или весь пакет можно было сделать видимыми, в Java включен оператор import. После того как класс импортирован, на него можно ссылаться непосредственно, используя только его имя. Оператор import служит только для удобства программистов и не является обязательным с технической точки зрения для создания завершенной Java-программы. Однако если в приложении придется ссылаться на несколько десятков классов, оператор import значительно уменьшит объем вводимого кода.

В исходном файле Java-программы операторы import должны следовать непосредственно за оператором package (если таковой имеется) перед любыми определениями классов. Оператор import имеет следующую общую форму:

В этой форме пакет! — имя пакета верхнего уровня, па кет 2 — имя подчиненного пакета внутри внешнего пакета, отделенное символом точки (.). Глубина вложенности пакетов практически не ограничена ничем, кроме файловой системы. И, наконец, имя_ класса может быть задано либо явно, либо с помощью символа звездочки (*), который указывает компилятору Java о необходимости импорта всего пакета. Следующий фрагмент демонстрирует применение обеих форм оператора:

Внимание!Использование формы с применением символа звездочки может привести к увеличению времени компиляции — особенно при импорте нескольких больших пакетов. Поэтому советуем явно указывать имена классов, которые нужно использовать, а не импортировать пакеты полностью. Однако использование формы с применением звездочки никак не влияет на производительность системы времени выполнения или на размеры классов.

Все стандартные классы, поставляемые с системой Java, хранятся в пакете j ava.

Основные функции языка хранятся в пакете j ava. lang внутри пакета j ava. Обычно каждый пакет или класс, который нужно использовать, приходится импортировать. Но поскольку система Java бесполезна без многих функций, определенных в пакете java. lang, компилятор неявно импортирует его для всех программ. Это эквивалентно присутствию следующей строки в каждой из программ:

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

Полностью определенное имя класса с указанием полной иерархии пакетов можно использовать везде, где можно допускается имя класса. Например, в следующем фрагменте кода присутствует оператор импорта:

Этот же пример без оператора import выглядит следующим образом:

В этой версии объект Date полностью определен.

Java.util.Arrays.asList() Method

При импорте пакета в импортирующем коде классам, не являющимся подклассами классов пакета, будут доступны только те элементы пакета, которые объявлены как public. Например, если нужно, чтобы приведенный ранее класс Balance пакета МуРаск был доступен в качестве самостоятельного класса вне пакета МуРаск, его необходимо объявить как public и поместить в отдельный файл, как показано в следующем примере:

Как видите, теперь класс Balance объявлен как public. Его конструктор и метод show () также объявлены как public. Это означает, что они доступны любому коду вне пакета МуРаск. Например, класс TestBalance импортирует пакет МуРаск и поэтому может использовать класс Balance:

В качестве эксперимента удалите спецификатор public из класса Balance, а затем попытайтесь выполнить компиляцию класса TestBalance. Как уже было сказано, это приведет к возникновению ошибок.



Коллекции (Collections) в Java. List

Javalock8 августа 2012 г. 12:37

Метки:abstractlistarraylistcollectionjavalinkedlistlist

В этой статье речь пойдет о, пожалуй, наиболее часто используемых коллекциях List, а именно о таких классах как AbstractList, ArrayList, LinkedList.

List — упорядоченная коллекция иногда называемая списком или последовательностью. Список может содержать повторяющиеся элементы. Разработчик имеет абсолютный контроль над тем, в каком месте списка будет вставлен каждый элемент. Также пользователь может получить доступ к элементам списка по индексу. В дополнение к стандартным операциям интерфейса Collection, List содержит следующие:

  • Доступ по позиции;
  • Поиск;
  • Специальный итератор ListIterator;
  • Диапазон элементов (sublist).

Доступ по позиции — манипулирует элементами на основе их индексной позиции в списке.

Не взирая на то, что в интерфейсе List присутствуют методы для доступа к элементу по позиции (индексу), делать это не рекоммендуется. В некоторых реализациях списка (например, LinkedList), эти операции могут выполнятся за время, пропорциональное значению индекса.

Поиск — находит указанный элемент и возвращает его позицию в списке. Для этого служит два метода: indexOf() и lastIndexOf().

Специальный итератор ListIterator — содержит усовершенствованный итератор ListIterator для обработки последовательных свойств списка.

ListIterator позволяет вставлять и заменять элементы и производить перебор элементов в двух направлениях. Ниже приведено объявление интерфейса ListIterator:

Описание Iterator:

Как видно из вышеприведенного кода, в ListIterator появились методы для управления итератором в обратном порядке: hasPrevious(), previous(), previousIndex().

Диапазон элементов (sublist) — позволяет манипулировать произвольным диапазоном в списке. Это выполняется с помощью метода subList(). Например так:

Метод subList() принимает два значения: стартовый индекс и конечный индекс подсписка.

Similar Threads

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

Также обратите внимание, что элемент с конечным индексом не включается в список.

На Рис.1 приведена иерархия классов List.


Рис 1. Иерархия List во фреймворке Collections

Интерфейсу List также принадлежит два устаревших класса: Vector и Stack, о которых упоминалось в предыдущей статье.

В отличие от Set, List может содержать повторяющиеся элементы. Также может содержать null-элементы.

Некоторые реализации списков имеют ограничения на элементы, которые они могут содержать. Например, в некоторых реализациях запрещено использовать null в качестве элемента для вставки (на ArrayList и LinkedList это правило не распространяется).

Два объекта типа List одинаковы (т.е., метод equals() возвращает true) только в том случае, когда они содержат одинаковые элементы в одном и том же порядке.

ArrayList — наиболее широко используемая реализация List. ArrayList обладает наибольшей производительностью в плане доступа к случайному элементу в массиве.

LinkedList — еще одна реализация интерфейса List. В отличие от ArrayList, LinkedList обладает большей скоростью вставки элемента в произвольное место в списке, однако доступ к элементу прямо пропорциональный его позиции относительно начала последовательности.

Комментарии (1)

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

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*