Коллекции в Java. Часть 5.
Интерфейс List и его реализации — ArrayList и LinkedList.
List – интерфейс, который традиционно рассматривают первым и которым пользуются чаще всего.
Название переводится как «список»: интерфейс представляет собой упорядоченную коллекцию данных, похожую на массив. Это значит, что у его элементов есть порядковые номера, показывающие их расположение в списке, – индексы. Но, в отличие от массива, List динамический, о чем я говорил выше, — в нем можно изменять количество элементов.
Интерфейс List имеет две стандартные реализации — ArrayList и LinkedList.
Смысл в том, что можно написать и другие реализации, но в JDK уже есть две, которые доступны «из коробки».
ArrayList содержит внутри себя массив, длина которого будет увеличиваться автоматически при добавлении в него новых элементов.
Вторая имплементация интерфейса List — класс LinkedList. Это список с двумя связями, где каждый элемент содержит ссылку на предшествующий и следующий элементы списка. Только у первого элемента ссылка на предшествующий элемент будет null, и ссылка у последнего элемента коллекции на следующий элемент будет тоже null, что вполне логично, согласны?
Методы у них одинаковые, но действия с такими списками различаются сложностью выполнения и скоростью.
Методы add() и remove() в связанном списке LinkedList имеют фиксированную скорость выполнения, поэтому оптимальнее. А вот обращение к элементу по индексу быстрее в ArrayList.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Интерфейс List и его реализации — ArrayList и LinkedList.
List – интерфейс, который традиционно рассматривают первым и которым пользуются чаще всего.
Название переводится как «список»: интерфейс представляет собой упорядоченную коллекцию данных, похожую на массив. Это значит, что у его элементов есть порядковые номера, показывающие их расположение в списке, – индексы. Но, в отличие от массива, List динамический, о чем я говорил выше, — в нем можно изменять количество элементов.
Интерфейс List имеет две стандартные реализации — ArrayList и LinkedList.
Смысл в том, что можно написать и другие реализации, но в JDK уже есть две, которые доступны «из коробки».
ArrayList содержит внутри себя массив, длина которого будет увеличиваться автоматически при добавлении в него новых элементов.
Вторая имплементация интерфейса List — класс LinkedList. Это список с двумя связями, где каждый элемент содержит ссылку на предшествующий и следующий элементы списка. Только у первого элемента ссылка на предшествующий элемент будет null, и ссылка у последнего элемента коллекции на следующий элемент будет тоже null, что вполне логично, согласны?
Методы у них одинаковые, но действия с такими списками различаются сложностью выполнения и скоростью.
Методы add() и remove() в связанном списке LinkedList имеют фиксированную скорость выполнения, поэтому оптимальнее. А вот обращение к элементу по индексу быстрее в ArrayList.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5✍2👨💻2
Коллекции в Java. Часть 6.
Vector и его потомок Stack.
Есть еще две реализации, о которых говорят реже. Это Vector и его потомок Stack. Vector похож на ArrayList, но сейчас им не рекомендуют пользоваться — он синхронизированный, за счет этого более потокобезопасный, но менее производительный. Исключение — редкие ситуации с высокими требованиями к потоковой безопасности.
Stack — это стек, работающий по принципу LIFO (last in, first out). Доступ начинается с того элемента, который добавлен в структуру последним, как взятие верхней карты из колоды. Его же быстрее всего можно удалить. Для просмотра последнего элемента есть метод peek(), для просмотра с удалением — pop(), а для добавления элемента в конец — push().
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Vector и его потомок Stack.
Есть еще две реализации, о которых говорят реже. Это Vector и его потомок Stack. Vector похож на ArrayList, но сейчас им не рекомендуют пользоваться — он синхронизированный, за счет этого более потокобезопасный, но менее производительный. Исключение — редкие ситуации с высокими требованиями к потоковой безопасности.
Stack — это стек, работающий по принципу LIFO (last in, first out). Доступ начинается с того элемента, который добавлен в структуру последним, как взятие верхней карты из колоды. Его же быстрее всего можно удалить. Для просмотра последнего элемента есть метод peek(), для просмотра с удалением — pop(), а для добавления элемента в конец — push().
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3✍2👨💻2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁10✍3👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5💯3✍2👍1
Коллекции в Java. Часть 7.
Set и его реализации.
Set, или набор, — это математическое множество, реализованное в языке программирования. Если проще, это коллекция уникальных значений. Ни одно из них не повторяется в рамках одного сета.
Для проверки равенства у такой коллекции есть специальный метод equals().
Коллекция не упорядочена, то есть у ее элементов нет порядковых номеров и четких позиций следования. Это может понадобиться при хранении разных структур данных, например имен пользователей сайта: никнеймы уникальны, а порядковых номеров у них нет.
У Set есть два дочерних интерфейса SortedSet и NavigableSet — соответственно, отсортированный и навигируемый сеты. Фактических реализаций три, и о них стоит поговорить подробнее.
Здесь будет посложнее для понимания)
Часто используется реализация HashSet — это сет или множество, которое не позволяет хранение одинаковых элементов благодаря содержанию в себе объекта HashMap. Он использует для хранения данных хэш-таблицы. Хэш-таблица реализована с помощью HashMap — одной из реализаций интерфейса Map, о котором мы поговорим позже.
LinkedHashSet — множество, подобное HashSet, в котором элементы объединены между собой в порядковый список. В этом случае элементы хранятся в том же порядке, в котором и добавляются (благодаря содержанию в себе объекта LinkedHashMap).
TreeSet — коллекция, которая использует для хранения элементов упорядоченное по значениям дерево. TreeSet содержит в себе TreeMap — коллекцию, которая использует для хранения своих элементов сбалансированное красно-черное бинарное дерево. Благодаря этому операции add, remove и contains в этой коллекции очень быстрые (относительно алгоритмической сложности). А это — весомое преимущество по сравнению с другими имплементациями интерфейса Set.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Set и его реализации.
Set, или набор, — это математическое множество, реализованное в языке программирования. Если проще, это коллекция уникальных значений. Ни одно из них не повторяется в рамках одного сета.
Для проверки равенства у такой коллекции есть специальный метод equals().
Коллекция не упорядочена, то есть у ее элементов нет порядковых номеров и четких позиций следования. Это может понадобиться при хранении разных структур данных, например имен пользователей сайта: никнеймы уникальны, а порядковых номеров у них нет.
У Set есть два дочерних интерфейса SortedSet и NavigableSet — соответственно, отсортированный и навигируемый сеты. Фактических реализаций три, и о них стоит поговорить подробнее.
Здесь будет посложнее для понимания)
Часто используется реализация HashSet — это сет или множество, которое не позволяет хранение одинаковых элементов благодаря содержанию в себе объекта HashMap. Он использует для хранения данных хэш-таблицы. Хэш-таблица реализована с помощью HashMap — одной из реализаций интерфейса Map, о котором мы поговорим позже.
LinkedHashSet — множество, подобное HashSet, в котором элементы объединены между собой в порядковый список. В этом случае элементы хранятся в том же порядке, в котором и добавляются (благодаря содержанию в себе объекта LinkedHashMap).
TreeSet — коллекция, которая использует для хранения элементов упорядоченное по значениям дерево. TreeSet содержит в себе TreeMap — коллекцию, которая использует для хранения своих элементов сбалансированное красно-черное бинарное дерево. Благодаря этому операции add, remove и contains в этой коллекции очень быстрые (относительно алгоритмической сложности). А это — весомое преимущество по сравнению с другими имплементациями интерфейса Set.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
✍4👍3👨💻2
✍4👍2👨💻2
Коллекции в Java. Часть 8.
Третий прямой наследник Collection — очередь, или Queue и его реализации.
Очередь и стек — два похожих формата, которые различаются принципом доступа к элементам.
Если в стеке мы имеем быстрый доступ к последним добавленным частям, то в очереди — к тем, которые были добавлены первыми. Такой принцип называется FIFO (first in, first out) и действительно напоминает живую очередь.
Соответственно, быстро получить и удалить элемент можно из начала очереди, а добавить — только в ее конец.
У Queue две основных реализации. Одна из них — PriorityQueue, прямая реализация, которая по умолчанию сортирует элементы в порядке их появления в очереди. Но это можно переопределить в конструкторе — специальном методе для создания объекта. Там можно задать связь с интерфейсом Comparator, который будет сравнивать элементы очереди и располагать их в зависимости от значений.
Вторая реализация чуть сложнее. У Queue есть потомок под названием Deque (читается как «дек»). Он расширяет Queue и добавляет возможность создавать коллекции, работающие по принципу LIFO — мы говорили о нем выше. По сути, получается двунаправленная очередь. Так вот вторая реализация называется ArrayDeque и технически является реализацией интерфейса Deque, а не Queue. Но Deque — потомок Queue, так что ArrayDeque периодически называют реализацией Queue.
Упомянутый выше LinkedList — реализация, принадлежащая не только List, но и Deque.
В целом, Queue редко используется, достаточно знать, что это и в чем ее суть, чтобы упомянуть это при рассказе на собеседовании о коллекциях в целом.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Третий прямой наследник Collection — очередь, или Queue и его реализации.
Очередь и стек — два похожих формата, которые различаются принципом доступа к элементам.
Если в стеке мы имеем быстрый доступ к последним добавленным частям, то в очереди — к тем, которые были добавлены первыми. Такой принцип называется FIFO (first in, first out) и действительно напоминает живую очередь.
Соответственно, быстро получить и удалить элемент можно из начала очереди, а добавить — только в ее конец.
У Queue две основных реализации. Одна из них — PriorityQueue, прямая реализация, которая по умолчанию сортирует элементы в порядке их появления в очереди. Но это можно переопределить в конструкторе — специальном методе для создания объекта. Там можно задать связь с интерфейсом Comparator, который будет сравнивать элементы очереди и располагать их в зависимости от значений.
Вторая реализация чуть сложнее. У Queue есть потомок под названием Deque (читается как «дек»). Он расширяет Queue и добавляет возможность создавать коллекции, работающие по принципу LIFO — мы говорили о нем выше. По сути, получается двунаправленная очередь. Так вот вторая реализация называется ArrayDeque и технически является реализацией интерфейса Deque, а не Queue. Но Deque — потомок Queue, так что ArrayDeque периодически называют реализацией Queue.
Упомянутый выше LinkedList — реализация, принадлежащая не только List, но и Deque.
В целом, Queue редко используется, достаточно знать, что это и в чем ее суть, чтобы упомянуть это при рассказе на собеседовании о коллекциях в целом.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4✍2👨💻2
Коллекции в Java. Часть 9.
Интерфейс Map.
Интерфейс Map технически не относится к иерархии коллекций Collection. Он не является потомком Iterable и, соответственно, Collection, у него нет общих для коллекций методов, это другой вид объекта, и методы у него свои. Но я решил упомянуть о нем именно в контексте коллекций, потому что они часто объясняются и используются вместе. При этом Map — другой вид объекта, и принцип построения у него отличается.
На собеседованиях на Junior Java разработчика и стажера, когда вы рассказываете о иерархии Collection, обязательно упоминайте об интерфейсе Map! Это неотъемлемая часть структур данных в Java, да и не только в Java.
Map, «карта», он же «словарь» или ассоциативный массив — это список формата «ключ-значение». Представьте себе таблицу, где данные указаны, например, в таком формате:
Имя: Иван
Фамилия: Иванов
«Имя» и «Фамилия» будут ключами, а «Иван» и «Иванов» — значениями. По такому принципу данные хранятся в Map: вместо индексов у них ключи. Map не итерируется, потому что сложно сказать, какой из ключей можно назвать «первым», а какой «вторым», — это неупорядоченная структура.
Интерфейс Map.
Интерфейс Map технически не относится к иерархии коллекций Collection. Он не является потомком Iterable и, соответственно, Collection, у него нет общих для коллекций методов, это другой вид объекта, и методы у него свои. Но я решил упомянуть о нем именно в контексте коллекций, потому что они часто объясняются и используются вместе. При этом Map — другой вид объекта, и принцип построения у него отличается.
На собеседованиях на Junior Java разработчика и стажера, когда вы рассказываете о иерархии Collection, обязательно упоминайте об интерфейсе Map! Это неотъемлемая часть структур данных в Java, да и не только в Java.
Map, «карта», он же «словарь» или ассоциативный массив — это список формата «ключ-значение». Представьте себе таблицу, где данные указаны, например, в таком формате:
Имя: Иван
Фамилия: Иванов
«Имя» и «Фамилия» будут ключами, а «Иван» и «Иванов» — значениями. По такому принципу данные хранятся в Map: вместо индексов у них ключи. Map не итерируется, потому что сложно сказать, какой из ключей можно назвать «первым», а какой «вторым», — это неупорядоченная структура.
👍3✍2❤1👨💻1
У Map три непосредственных реализации и один дочерний интерфейс, который в свою очередь имеет свою реализацию. Дочерний интерфейс называется SortedMap, от него наследуется еще один интерфейс NavigableMap, а уже у него есть реализация под названием TreeMap — карта в виде дерева. Структурирование дерева в сете возможно благодаря наличию в объекте элемента TreeMap для хранения позиций
Непосредственные реализации — это Hashtable, HashMap, LinkedHashMap.
Hashtable — это хэш-таблица, такая реализация сейчас не рекомендована к использованию: она синхронизированная и из-за этого работает медленнее современных методов.
HashMap — более новая альтернатива Hashtable. Она отличается от предыдущей двумя деталями: HashMap не синхронизированная, а еще в ней можно в качестве значения или ключа хранить null — «отсутствие», нулевую или пустую сущность. Эта реализация не отсортирована.
LinkedHashMap — это отсортированный словарь. В нем элементы располагаются не случайно, в зависимости от хэша, а в порядке добавления.
Вообще, как мы с вами уже заметили, коллекции в Java достаточно объемны. Они содержат в себе массу интерфейсов и реализаций, о которых точно можно написать не одну статью и даже не две. И правильное понимание принципов работы с коллекциями останется навсегда одним из главных навыков для качественной разработки на Java.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Непосредственные реализации — это Hashtable, HashMap, LinkedHashMap.
Hashtable — это хэш-таблица, такая реализация сейчас не рекомендована к использованию: она синхронизированная и из-за этого работает медленнее современных методов.
HashMap — более новая альтернатива Hashtable. Она отличается от предыдущей двумя деталями: HashMap не синхронизированная, а еще в ней можно в качестве значения или ключа хранить null — «отсутствие», нулевую или пустую сущность. Эта реализация не отсортирована.
LinkedHashMap — это отсортированный словарь. В нем элементы располагаются не случайно, в зависимости от хэша, а в порядке добавления.
Вообще, как мы с вами уже заметили, коллекции в Java достаточно объемны. Они содержат в себе массу интерфейсов и реализаций, о которых точно можно написать не одну статью и даже не две. И правильное понимание принципов работы с коллекциями останется навсегда одним из главных навыков для качественной разработки на Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👨💻3✍2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7💯3✍1
Что делает функция SUM в языке SQL?
Anonymous Quiz
1%
Извлекает максимальное значение в столбце
0%
Вычисляет среднее значение столбца
7%
Подсчитывает общее количество строк в таблице
90%
Вычисляет сумму значений в столбце
3%
Посмотреть ответ
👍3✍2🎉2
Хэширование в Java. Часть 1.
Давайте подробнее рассмотрим хэширование и Hash таблицы.
Хэширование — это преобразование информации с помощью особых математических формул. В результате возникает хэш — отображение данных в виде короткой строки. Размер строки может быть одинаковым для информации разного объема.
Хэш — это не закодированная исходная информация. Это уникальная метка, которая генерируется для каждого набора данных индивидуально. Если захэшировать большую книгу и одно слово, получатся хэши одинаковой длины. А если изменить в слове одну букву и снова захэшировать полученную строку, новый хэш будет совершенно другим, там не окажется участков, которые повторяли бы предыдущий.
Математические алгоритмы, по которым хэшируется информация, называются хэш–функциями. Их название тоже иногда сокращают как «хэш». Хэш–функций существует очень много, они различаются методами вычислений, назначением, надежностью и другими параметрами.
Но для чего же нужно хэширование?
Основное назначение хэширования — проверка информации. Эта задача важна в огромном количестве случаев. Так как хэш — это уникальный код определенного набора данных, по нему можно понять, соответствует ли информация ожидаемой. Поэтому программа может хранить хэши вместо образца данных для сравнения. Это может быть нужно для защиты чувствительных сведений или экономии места.
Вот несколько примеров:
– вместо паролей на сервере хранятся хэши паролей;
– антивирус хранит в базе хэши вирусов, а не образцы самих программ;
– электронная подпись использует хэш для верификации;
– информация о транзакциях криптовалюты хранится в виде хэшей;
– коммиты в Git идентифицируются по хэшу.
Среди других, менее распространенных примеров использования — поиск дубликатов в больших массивах информации, генерация ID и построение особых структур данных. Это, например, хэш–таблицы — в них идентификатором элемента является его хэш, и он же определяет расположение элемента в таблице. Об этом далее.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Давайте подробнее рассмотрим хэширование и Hash таблицы.
Хэширование — это преобразование информации с помощью особых математических формул. В результате возникает хэш — отображение данных в виде короткой строки. Размер строки может быть одинаковым для информации разного объема.
Хэш — это не закодированная исходная информация. Это уникальная метка, которая генерируется для каждого набора данных индивидуально. Если захэшировать большую книгу и одно слово, получатся хэши одинаковой длины. А если изменить в слове одну букву и снова захэшировать полученную строку, новый хэш будет совершенно другим, там не окажется участков, которые повторяли бы предыдущий.
Математические алгоритмы, по которым хэшируется информация, называются хэш–функциями. Их название тоже иногда сокращают как «хэш». Хэш–функций существует очень много, они различаются методами вычислений, назначением, надежностью и другими параметрами.
Но для чего же нужно хэширование?
Основное назначение хэширования — проверка информации. Эта задача важна в огромном количестве случаев. Так как хэш — это уникальный код определенного набора данных, по нему можно понять, соответствует ли информация ожидаемой. Поэтому программа может хранить хэши вместо образца данных для сравнения. Это может быть нужно для защиты чувствительных сведений или экономии места.
Вот несколько примеров:
– вместо паролей на сервере хранятся хэши паролей;
– антивирус хранит в базе хэши вирусов, а не образцы самих программ;
– электронная подпись использует хэш для верификации;
– информация о транзакциях криптовалюты хранится в виде хэшей;
– коммиты в Git идентифицируются по хэшу.
Среди других, менее распространенных примеров использования — поиск дубликатов в больших массивах информации, генерация ID и построение особых структур данных. Это, например, хэш–таблицы — в них идентификатором элемента является его хэш, и он же определяет расположение элемента в таблице. Об этом далее.
Please open Telegram to view this post
VIEW IN TELEGRAM
✍4👨💻3👍1🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
✍7😁4👍2🔥1