Перегрузка методов в Java
Концепция перегрузки методов в Java заключается в том, что класс может иметь несколько методов с одинаковым именем при условии, что их конструкции аргументов различны. Перегрузка метода сравнима с перегрузкой конструктора, где мы можем реализовать несколько конструкторов (также с одинаковым именем), при условии, что эти конструкторы имеют различную конструкцию аргументов.
https://www.journaldev.com/16807/method-overloading-in-java
Концепция перегрузки методов в Java заключается в том, что класс может иметь несколько методов с одинаковым именем при условии, что их конструкции аргументов различны. Перегрузка метода сравнима с перегрузкой конструктора, где мы можем реализовать несколько конструкторов (также с одинаковым именем), при условии, что эти конструкторы имеют различную конструкцию аргументов.
https://www.journaldev.com/16807/method-overloading-in-java
👋 Мы — команда айтишников. В текущих условиях компания не может работать как работала, и мы решили переехать всей командой.
💬 Создали канал для таких же, как мы, — тех, кто хочет уехать. Собираем всё самое полезное про релокацию. Рассказываем, с чем столкнулись сами, ищем лайфхаки и способы похачить систему (например, нашли несколько способов, как жить за границей на рубли).
👨💻 А вообще, мы HR-IT-чувачки (то есть без лишней скромности профи в сфере трудоустройства) и сейчас готовим новый проект: будем помогать айтишникам организовать переезд и устроиться на работу в валюте. И ещё сверху грант будем давать💰
👉 Что для этого нужно? Пока что — присоединиться к каналу RelocationDev и следить за новостями😉 Скоро обо всём расскажем — в мельчайших подробностях.
💬 Создали канал для таких же, как мы, — тех, кто хочет уехать. Собираем всё самое полезное про релокацию. Рассказываем, с чем столкнулись сами, ищем лайфхаки и способы похачить систему (например, нашли несколько способов, как жить за границей на рубли).
👨💻 А вообще, мы HR-IT-чувачки (то есть без лишней скромности профи в сфере трудоустройства) и сейчас готовим новый проект: будем помогать айтишникам организовать переезд и устроиться на работу в валюте. И ещё сверху грант будем давать💰
👉 Что для этого нужно? Пока что — присоединиться к каналу RelocationDev и следить за новостями😉 Скоро обо всём расскажем — в мельчайших подробностях.
👎5👍1
Что делает volatile?
Во-первых, чтение/запись такого поля становятся атомарными. Это применение актуально только для
Второй и самый интересный эффект – пара событий запись-чтение для такого поля являются synchronization actions. Значит, между ними существует отношение happens-before. Это значит, что существует гарантия, что произошедшее в памяти до записи будет видно после чтения. То есть будут успешно прочитаны значения, записанные в другие переменные.
Для полного понимания темы рекомендуется к просмотру доклад Алексея Шипилёва и документация. Лучше всего эффект
Трюк в том, что помимо очевидных 21 (поток 2 отработал после 1), 00 (поток 2 отработал до 1, переменные еще не инициализированы) и 01 (поток 2 сработал между записями), может быть и неожиданные 20. Дело в том, что для операторов одного потока действует program order, он гарантирует хотя бы видимость правильной последовательности операций. Между потоками необходим «мост» из happens-before. Его даст применение модификатора
Этот эффект используется для получения простой и дешевой адаптации программы к многопоточной среде без использования сложных и ошибкоопасных техник блокировок и синхронизаций.
volatile
– ключевое слово для работы с многопоточностью. Не то же самое, что volatile
в C++, не обязано делать что-либо с кэшем процессора. Оказывает на поле объекта ровно два эффекта.Во-первых, чтение/запись такого поля становятся атомарными. Это применение актуально только для
long
и double
, и не на всех платформах. Для остальных типов полей это верно и так.Второй и самый интересный эффект – пара событий запись-чтение для такого поля являются synchronization actions. Значит, между ними существует отношение happens-before. Это значит, что существует гарантия, что произошедшее в памяти до записи будет видно после чтения. То есть будут успешно прочитаны значения, записанные в другие переменные.
Для полного понимания темы рекомендуется к просмотру доклад Алексея Шипилёва и документация. Лучше всего эффект
volatile
иллюстрирует задача из этого доклада, которую часто и дают в качестве этого вопроса. Вопрос – что выведет данный код:int a; int b;
// thread 1:
a = 1;
b = 2;
// thread 2:
System.out.print(b);
System.out.print(a);
Трюк в том, что помимо очевидных 21 (поток 2 отработал после 1), 00 (поток 2 отработал до 1, переменные еще не инициализированы) и 01 (поток 2 сработал между записями), может быть и неожиданные 20. Дело в том, что для операторов одного потока действует program order, он гарантирует хотя бы видимость правильной последовательности операций. Между потоками необходим «мост» из happens-before. Его даст применение модификатора
volatile
к переменной b
, неожиданный результат 20 будет исключен.Этот эффект используется для получения простой и дешевой адаптации программы к многопоточной среде без использования сложных и ошибкоопасных техник блокировок и синхронизаций.
👍9
Делаем Core Services в eCom.
Разрабатываешь на JavaSE 11+? Мы строим платформу для продуктовых команд.
У нас нет легаси, можно хорошо прокачаться в kubernetes и service mesh, много инженерных и инфраструктурных задач.
Подробности по ссылке
Разрабатываешь на JavaSE 11+? Мы строим платформу для продуктовых команд.
У нас нет легаси, можно хорошо прокачаться в kubernetes и service mesh, много инженерных и инфраструктурных задач.
Подробности по ссылке
👍3
Что лучше, ArrayList или LinkedList?
Самый избитый вопрос. Проверяет знание особенностей реализации (кишки ArrayList, кишки LinkedList) и эффективности операций в этих разных реализациях. В вопрос иногда добавляют
Стоит добавить, что для работы на краях лучше использовать реализации специально для этого спроектированного интерфейса Deque: например реализующую кольцевой буфер
Самый избитый вопрос. Проверяет знание особенностей реализации (кишки ArrayList, кишки LinkedList) и эффективности операций в этих разных реализациях. В вопрос иногда добавляют
Vector
– пересинхронизированный и устаревший вариант ArrayList
, который лучше заменить Collections.synchronizedList()
.ArrayList
хранит данные в массиве, LinkedList
в двусвязном списке. Из этого вытекает разница в эффективности разных операций: ArrayList
лучше справляется с изменениями в середине и ростом в пределах capacity, LinkedList
– на краях. В целом обычно ArrayList лучше.Стоит добавить, что для работы на краях лучше использовать реализации специально для этого спроектированного интерфейса Deque: например реализующую кольцевой буфер
ArrayDeque
.👍7🔥3👎2❤1
Forwarded from Академия Кода
Какие типы Java могут имплементировать интерфейсы?
В Java нет концепции множественного наследования, но с помощью интерфейса мы можем его добиться. По сути, интерфейс - это именованный набор определений без реализации. Интерфейс в Java - это особый вид класса. Подобно классам, интерфейс содержит методы и члены; в отличие от классов, в интерфейсе все члены являются окончательными, а все методы абстрактными.
В основном существуют 5 типов Java, которые могут реализовывать интерфейсы:
1. Обычный класс
2. Абстрактный класс
3. Вложенный класс
4. Enum
5. Динамический прокси
Подписывайтесь на канал 👉@coddy_academy
#java
В Java нет концепции множественного наследования, но с помощью интерфейса мы можем его добиться. По сути, интерфейс - это именованный набор определений без реализации. Интерфейс в Java - это особый вид класса. Подобно классам, интерфейс содержит методы и члены; в отличие от классов, в интерфейсе все члены являются окончательными, а все методы абстрактными.
В основном существуют 5 типов Java, которые могут реализовывать интерфейсы:
1. Обычный класс
2. Абстрактный класс
3. Вложенный класс
4. Enum
5. Динамический прокси
Подписывайтесь на канал 👉@coddy_academy
#java
👍2
Когда идти в IT, если не сейчас?
Начать карьеру востребованного разработчика на Java можно с оплатой после трудоустройства в Kata Academy.
Узнай подробнее об учебе: https://clck.ru/eBgVD
В Kata можно изучить Java на реальных проектах и задачах за 8 месяцев. Учеба проходит в интенсивном формате под присмотром ментора. В сообществе студентов и выпускников проекта идет непрерывный обмен опытом и знаниями. Выпускники академии получают в среднем от 3 предложений о работе. А если выпускник не находит работу программистом с зарплатой минимум в 100 тысяч рублей, то за обучение он не платит – гарантировано договором.
Начать карьеру востребованного разработчика на Java можно с оплатой после трудоустройства в Kata Academy.
Узнай подробнее об учебе: https://clck.ru/eBgVD
В Kata можно изучить Java на реальных проектах и задачах за 8 месяцев. Учеба проходит в интенсивном формате под присмотром ментора. В сообществе студентов и выпускников проекта идет непрерывный обмен опытом и знаниями. Выпускники академии получают в среднем от 3 предложений о работе. А если выпускник не находит работу программистом с зарплатой минимум в 100 тысяч рублей, то за обучение он не платит – гарантировано договором.
👎8👍3
Как удалить элемент из ArrayList при итерации?
Обычно формулируется в виде задачи на внимательность «что здесь не так», например
Подвох в том, что итератор
Не исключение, но неожиданный результат получится если пользоваться не итератором, а обычным циклом
Единственный способ удалить элемент из коллекции при обходе, не получив при этом
Некоторые коллекции, такие как
#Коллекции
Обычно формулируется в виде задачи на внимательность «что здесь не так», например
for (String item : arrayList)
if (item.length() > 2)
arrayList.remove(item);
Подвох в том, что итератор
ArrayList
, который используется в таком варианте цикла for
, является fail-fast, то есть не поддерживает итерацию с параллельной модификацией. А параллельная модификация случается даже в одном потоке, что демонстрирует этот пример. Следующий шаг итератора после удаления элемента выбросит ConcurrentModificationException
.Не исключение, но неожиданный результат получится если пользоваться не итератором, а обычным циклом
for
– при каждом удалении нумерация элементов будет сдвигаться.Единственный способ удалить элемент из коллекции при обходе, не получив при этом
ConcurrentModificationException
или неопределенное поведение – удалить с помощью remove()
того же инстанса итератора. Вариант ListIterator поможет, если в теле цикла требуется и работа с индексами.Некоторые коллекции, такие как
CopyOnWriteArrayList
и ConcurrentHashMap
адаптированные под многопоточную среду и имеют fail-safe итераторы.#Коллекции
👍14
Forwarded from Академия Кода
Как объединить два массива в один на Java?
Можно использовать метод
пример пример кода.
Подписывайтесь на канал 👉@coddy_academy
#java
Можно использовать метод
arraycopy()
в Java чтобы объединить два массива в один,пример пример кода.
Подписывайтесь на канал 👉@coddy_academy
#java
👍4💩2
Какова структура Java Collections Framework? Почему Map не Collection?
🔘
🔘
🔘
Большой обзор фреймворка и сравнение эффективности коллекций можно найти в статье на хабре. Для разговора об эффективности нужно понимать что такое О-нотация. Другая статья содержит практические замеры быстродействия (осторожно, старая публикация, Java 6).
Collection
– хранилище отдельных значений, Map
– хранилище ключ-значение. Отсюда разные методы этих интерфейсов. Если проще, разные сигнатуры методов put
и add
.Collection
в свою очередь делится на три основных группы, и соответствующих им интерфейса:🔘
List
– упорядоченные списки с возможностью содержания дубликатов и доступа по индексу (random access);🔘
Queue
– обычно FIFO-коллекции, предполагает добавление/удаление элементов с края. Интерфейс-наследник Deque
– двусвязная очередь;🔘
Set
– не обязательно упорядоченный набор уникальных (с точки зрения equals
) значений;HashMap
можно привести к виду Collection
вызвав например keySet()
, entrySet()
или values()
.Большой обзор фреймворка и сравнение эффективности коллекций можно найти в статье на хабре. Для разговора об эффективности нужно понимать что такое О-нотация. Другая статья содержит практические замеры быстродействия (осторожно, старая публикация, Java 6).
👍8
Как работает HashMap?
Один из популярнейших вопросов, потому что содержит много нюансов. Лучше всего подготовиться к нему помогает чтение исходного кода
Нюансы которые стоит повторить и запомнить:
🔘 Общий принцип: внутренний массив
🔘 Пересчет хэш-суммы для умещения
🔘
🔘 Невозможность сжать однажды раздувшийся
🔘 Два способа разрешения коллизий: используемый в
🔘 Варианты для многопоточного использования: пересинхронизированная
🔘 Оптимизация Java 8: превращение списка в бакете в дерево при достижении 8 элементов – при большом количестве коллизий скорость доступа растет с O(n) до O(log(n));
🔘 Явное использование бакета 0 для ключа
🔘 Связь с
🔘 Нет гарантий порядка элементов;
Обсуждая этот вопрос на интервью вы обязательно затронете особенности методов equals/hashCode. Возможно придется поговорить об альтернативных хранилищах ключ-значение – TreeMap, LinkedHashMap.
Один из популярнейших вопросов, потому что содержит много нюансов. Лучше всего подготовиться к нему помогает чтение исходного кода
HashMap
. Реализация подробно рассмотрена во множестве статей, например на хабре.Нюансы которые стоит повторить и запомнить:
🔘 Общий принцип: внутренний массив
table
, содержащий бакеты (корзины) – списки элементов с одинаковыми пересчитанными хэш-суммами;🔘 Пересчет хэш-суммы для умещения
int
индексов в capacity
ячейках table
;🔘
rehash
– удвоение размера table
при достижении threshold
(capacity*loadFactor
) занятых бакетов;🔘 Невозможность сжать однажды раздувшийся
table
;🔘 Два способа разрешения коллизий: используемый в
HashMap
метод цепочек и альтернатива – открытая адресация;🔘 Варианты для многопоточного использования: пересинхронизированная
Hashtable
и умная ConcurrentHashMap
;🔘 Оптимизация Java 8: превращение списка в бакете в дерево при достижении 8 элементов – при большом количестве коллизий скорость доступа растет с O(n) до O(log(n));
🔘 Явное использование бакета 0 для ключа
null
;🔘 Связь с
HashSet
– HashMap
, в котором используются только ключи;🔘 Нет гарантий порядка элементов;
Обсуждая этот вопрос на интервью вы обязательно затронете особенности методов equals/hashCode. Возможно придется поговорить об альтернативных хранилищах ключ-значение – TreeMap, LinkedHashMap.
🔥4👍3
Как отсортировать Set/Map?
Для
Эффективный способ – хранить данные уже отсортированными. Для таких реализаций созданы интерфейсы-наследники
Реализации
Этот интерфейс добавляет методы получения подмножества от указанного элемента (
Все те же правила применяются к элементам
Основными реализациями являются
#Коллекции
Для
Map
можно привести ключи/значения к виду Collection, переложить в новый List
и отсортировать с помощью Collections.sort
. То же делается с Set
. Этот метод конечно же неэффективный, так как потребует полного копирования содержимого.Эффективный способ – хранить данные уже отсортированными. Для таких реализаций созданы интерфейсы-наследники
SortedSet
и SortedMap
.Реализации
SortedSet
дают линейный порядок множества. Элементы упорядочены по возрастанию. Порядок либо натуральный (элементы реализуют интерфейс Comparable
), либо его определяет переданный в конструктор Comparator
.Этот интерфейс добавляет методы получения подмножества от указанного элемента (
tailSet
), до элемента (headSet
), и между двумя (subSet
). Подмножество включает нижнюю границу, не включает верхнюю.SortedSet
расширяется интерфейсом NavigableSet
для итерации по порядку, получения ближайшего снизу (floor
), сверху (ceiling
), большего (higher
) и меньшего (lower
) заданному элемента.Все те же правила применяются к элементам
SortedMap
/NavigableMap
относительно их ключей.Основными реализациями являются
TreeSet
и TreeMap
. Внутри это самобалансирующиеся красно-чёрные деревья. Их структура и способ балансировки – вопрос достойный отдельного поста. Другая любопытная реализация из java.util.concurrent
– ConcurrentSkipListMap. #Коллекции
👍5
Java и вино 🍷 — авторский проект начинающего java-специалиста. Сложный и непростой, но такой интересный путь бывшего маркетолога: с чего начинать, куда податься и как быть, когда ничего не получается.Заметки IT-специалиста о карьере, профессиональной сфере и жизни.
«Вино тут, спросите, зачем в названии? Об этом я тоже постепенно буду рассказывать у себя в блоге»
https://t.me/java_wine
«Вино тут, спросите, зачем в названии? Об этом я тоже постепенно буду рассказывать у себя в блоге»
https://t.me/java_wine
👎4👍3🔥1
Как создать immutable-коллекцию?
В Collections Framework имеется набор методов
Другой менее очевидный способ – метод
#Коллекции
В Collections Framework имеется набор методов
Collections.unmodifiable*()
для различных типов коллекций. Такой метод вернет read-only обертку над переданной коллекцией. Так же как с Collections.synchronized*()
, внутри используется не копия, а оригинальная коллекция.Другой менее очевидный способ – метод
Collections.empty*()
. Он возвращает немодифицируемую пустую коллекцию. Попытка добавить элемент как и в случае unmodifiable приведет к UnsupportedOperationException
.#Коллекции
👍2