Java Guru 🤓
13.2K subscribers
886 photos
16 videos
751 links
Канал с вопросами и задачами с собеседований!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrSQZ

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
Что происходит внутри HashMap.put()?

Мы уже рассматривали хэш-таблицы в целом, теперь рассмотрим в деталях, как новые ключ и значение складываются в HashMap.

1. Вычисляется хэш ключа. Если ключ null, хэш считается равным 0. Чтобы достичь лучшего распределения, результат вызова hashCode() «перемешивается»: его старшие биты XOR-ятся на младшие.

2. Значения внутри хэш-таблицы хранятся в специальных структурах данных – нодах, в массиве. Из хэша высчитывается номер бакета – индекс для значения в этом массиве. Полученный хэш обрезается по текущей длине массива. Длина – всегда степень двойки, так что для скорости используется битовая операция &.

3. В бакете ищется нода. В ячейке массива лежит не просто одна нода, а связка всех нод, которые туда попали. Исполнение проходит по этой связке (цепочке или дереву), и ищет ноду с таким же ключом. Ключ сравнивается с имеющимися сначала на ==, затем на equals.

4. Если нода найдена – её значение просто заменяется новым. Работа метода на этом завершается.

5. Если ноды с таким же ключом в бакете пока нет – добавляемая пара ключ-значение запаковывается в новый объект типа Node, и прикрепляется к структуре существующих нод бакета. Ноды составляют структуру за счет того, что в ноде хранится ссылка на следующий элемент (для дерева – следующие элементы). Кроме самой пары и ссылок, чтобы потом не считать заново, записывается и хэш ключа.
6. В случае, когда структурой была цепочка а не дерево, и длина цепочки превысила 7 элементов – происходит процедура treeification – превращение списка в самобалансирующееся дерево. В случае коллизии это ускоряет доступ к элементам на чтение с O(n) до O(log(n)). У comparable-ключей для балансировки используется их естественный порядок. Другие ключи балансируются по порядку имен их классов и значениям identityHashCode-ов. Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением (см. п.8).

7. Если новая нода попала в пустую ячейку, заняла новый бакет – увеличивается счетчик структурных модификаций. Изменение этого счетчика сообщит всем итераторам контейнера, что при следующем обращении они должны выбросить ConcurrentModificationException.

8. Когда количество занятых бакетов массива превысило пороговое (capacity * load factor), внутренний массив увеличивается вдвое, а для всего содержимого выполняется рехэш – все имеющиеся ноды перераспределяются по бакетам по тем же правилам, но уже с учетом нового размера.
👍225🔥4
Какие есть преимущества у массива перед коллекцией?

Для хранения ссылочных типов массив подходит хуже чем ArrayList. В основе реализации коллекции лежит такой же массив, поэтому эффективность будет той же самой. Однако, вам придется самостоятельно реализовывать логику управления хранилищем: например, увеличение массива при переполнении. А значит, будет больше шансов на ошибку.

Если использовать массивы вместо коллекций для примитивов, можно получить выигрыш по эффективности. Коллекции – generic-типы, из-за этого простые значения хранятся в них в форме ссылочных типов-оберток.

1. Autoboxing выделяет память под новый объект, это дорогая операция;
2. Кроме данных, Object занимает дополнительную память под метаинформацию;
3. Ячейки массива лежат близко в оперативной памяти, это увеличивает шансы попадания в кэш процессора.

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

Когда сэкономить всё-таки хочется, стоит выбрать одну из множества готовых библиотек не-generic реализаций коллекций. Списки примитивов можно найти в Eclipse Collections. В Android есть HashMap с целочисленными ключами – SparseArray.
👍15🔥1
♨️ Тест на знание языка Java

— Ответьте на 21 вопрос
и проверьте, насколько хорошо вы знаете язык Java и готовы освоить Spring. Сможете сдать — пройдёте на продвинутый онлайн-курс "Разработчик на Spring" Framework со скидкой!

👉 ПРОЙТИ ТЕСТ ОНЛАЙН-КУРСА "Разработчик на Spring Framework": https://otus.pw/XTxR/

Курс доступен в рассрочку.

🎁 Пройдете успешно тест, получите доступ к открытым урокам курса.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Как обойти коллекцию?

for/while. Классический способ: целочисленная переменная-индекс, которая увеличивается от 0 до size(). Можно использовать для неполного обхода, с нестандартным шагом. Плата за это – возможность ошибиться в индексах и менее читабельный код.

Iterator. ООП-способ: методом iterator() получить объект-итератор, и вызывать у него next() пока hasNext() возвращает true. В реализации может быть дополнительная логика, такая как потокобезопасность. Такой «объект-итерацию» коллекции можно передать в сторонний код, не отдавая саму коллекцию. Всё еще требует слишком много кода.

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

Стримы. Создать от коллекции стрим и работать с элементами в нём. Кроме простого forEach(), можно воспользоваться всей мощью Java Steam API – фильтровать, преобразовывать и агрегировать элементы. За это создаются лишние объекты, а синтаксис гораздо более развесистый.

Функции Java 8. С этой версии появились удобные средства для обхода не только строк. У коллекций и хэш-таблиц добавились методы forEach для обхода и replaceAll для модификации. Как со стримами, они дают функциональный стиль, но без избыточного создания стримов. Внутри используются простые итераторы и циклы for.
👍18🔥4
Стартануть в IT быстро и эффективно — подготовительный курс по Java-разработке.

Начинаем уже 7 ноября!

Даем: 62 урока с практикой в браузере, 3 онлайн вебинара и 1 сессию лайвкодинга с практикующим разработчиком.
Получаем: крепкие знания базы языка, умение понимать код и первую программу на Java, написанную вместе с наставником.

Всего 990 ₽ и ваше жгучее желание начать. Приходите с любым бэкграундом: нам не важны возраст, пол, образование и текущая профессия.

Запишитесь прямо сейчас!

Реклама. ООО "ХЕКСЛЕТ РУС". ИНН 7325174845. erid: LjN8JzmLB
👍8
Что такое fail-fast и fail-safe итераторы?

Это не какие-то отдельные типы, а характеристики разных реализаций интерфейса Iterator. Они определяют, как поведет себя итератор при изменении перебираемой последовательности.

Fail-fast – «быстрый» итератор. Когда после его создания коллекция как-либо изменилась, он падает с ошибкой без лишних разбирательств. Так работает итератор класса ArrayList, при изменении он выбрасывает ConcurrentModificationException. Рекомендуется не основывать логику программы на fail-fast отказах, и использовать их только как признак ошибки реализации.

Fail-safe – «умный» итератор. Обычно плата за отказоустойчивость – возможная неконсистентность данных («слабая консистентность»). Итератор класса ConcurrentHashMap работает с копией данных, он не выбросит исключение при изменении коллекции, но может не увидеть часть свежих изменений. Плата за отсутствие ошибок других fail-safe итераторов может отличаться, детали всегда можно найти в документации коллекций.
👍16🔥4
Рабочий код != правильный код.
А вы точно пишите код правильно?

Школа программирования YKul приглашает пройти эффективное обучение Java, основанное на менторстве.

🎓Стать нашим студентом можно с любым уровнем подготовки!

💰Не нужно оплачивать весь курс сразу. При необходимости вы сможете сделать перерыв и не потерять деньги 😉

На обучении в школе YKul – все будет как на настоящей работе, только с поддержкой ментора - действующего разработчика.

Вы получите:

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

Хотите проверить подходит ли вам формат обучения

➡️Запишитесь на курс: https://clck.ru/36LGuR

Первые 7 дней – бесплатно❗️

Наша глобальная цель – увеличить число компетентных программистов.

Присоединяйтесь!

Реклама: ИП Кулагин Андрей Николаевич, ИНН: 740411652688
👍9🔥52
Также у нас есть группа Вконтакте https://vk.com/javatutorial в ней мы выкладываем видео, статьи, вакансии и книги. Не забудь подписаться 😉
👍6🔥2
Какие существуют примитивы?

В Java имеется 9 возможных типов значения переменной: ссылка на объект или один из восьми примитивных типов:
🔘 byte – знаковое целое число от -2^7 до 2^7-1;
🔘 short – знаковое целое число от -2^15 до 2^15-1;
🔘 int – знаковое целое число от -2^31 до 2^31-1;
🔘 long – знаковое целое число от -2^63 до 2^63-1;
🔘 float – знаковое число с плавающей точкой 32 бита стандарта IEEE 754;
🔘 double – то же, что и float, но 64 бита;
🔘 char – 16-битный символ Unicode, от '\u0000'(0) до '\uffff'(65535);
🔘 boolean – true или false;

По умолчанию поля примитивных типов принимают нулевые значения: 0, 0L, '\u0000', false. Про особенности работы, способ хранения и специальные значения чисел с плавающей точкой стоит почитать подробнее.

Отдельная интересная тема – boxing/unboxing. Каждый примитивный тип снабжен своей ссылочной версией. Примитивное значение заворачивается и разворачивается из него автоматически при необходимости. Это может приводить к большим затратам на выделение памяти, когда например int индекс цикла используется в качестве значения переменной Object и превращается в Integer без нужды – частая задача на собеседованиях. Еще классы-обертки содержат набор утилитарных методов для их примитивов.

Сколько памяти занимает примитив – вопрос с подвохом. Спецификация требует, чтобы размер был достаточным для всех значений. Конкретный размер определяется реализацией JVM, он может быть больше. Например в 64-bit HotSpot переменная boolean занимает не 1 бит, а 8.
👍19🔥5
💻 Профессия «Java-разработчик»

Освойте язык крупного бизнеса и финансовых технологий и научитесь разрабатывать веб-приложения на фреймворке Spring.

Уже во время обучения вы вступите в программу «Карьерный трек», чтобы найти свою первую работу в IT. 

COSMO чёрная пятница: успейте получить скидку до 120 000р.

Расширяем горизонты Вселенной - добавим +6 месяцев сопровождения наставника и карьерного консультанта после завершения обучения.

Другого такого предложения в этой Вселенной вы не найдете!

Переходите по ссылке, выбирайте скидку и забирайте подарки🎁

Реклама. АНПОО "ХЕКСЛЕТ КОЛЛЕДЖ". ИНН 7839056670. erid: LjN8JwMmz
👍6🔥1
Какой результат выведет следующая программа?
👍15🔥2🎉2
👍18🔥52
⚡️ Как написать REST-клиента на Spring?

Узнаете на бесплатном открытом уроке «Разработка REST-клиентов на Spring» от OTUS.

На эфире рассмотрим Rest Template и WebClient, SOAP-сервисы и SOAP-клиентов на Spring.

📢📢 Занятие пройдёт 14 ноября в 20:00 мск и будет приурочено к старту курса «Разработчик на Spring Framework».

🎫 После урока вы сможете приобрести полный курс в рассрочку.

Это отличная возможность совершенно бесплатно протестировать формат обучения и задать преподавателю любые вопросы в режиме реального времени.

➡️ Регистрируйтесь на мероприятия прямо сейчас: https://otus.pw/wbB6/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
Что такое static?

Ключевое слово static используется для объявления вложенных классов, статических методов, полей, блоков инициализации и статических импортов.

Статические поля и методы – члены класса а не экземпляра, потому к ним можно обращаться через имя класса. Код статического блока или метода имеет доступ только к статическим членам. Статические поля не участвуют в сериализации.

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

Статический блок инициализации выполняется потокобезопасно, один раз сразу после загрузки класса класслоадером. Инициализаторы статических полей выполняются в неявном статическом блоке. Блоков может быть несколько, выполнятся они в порядке объявления.

Статический импорт (static import) импортирует статические члены классов в .java-файл.
👍21🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Бэкенд-команды Яндекса отправляются в тур по городам России

С 13 по 17 ноября ребята из наших команд проведут встречи в Москве, Нижнем Новгороде, Екатеринбурге, Новосибирске и Санкт-Петербурге. Мы хотим рассказать местным разработчикам о себе: как устроены наши сервисы, что за технологии мы используем, почему гордимся тем, что делаем. Участвуют представители 14 разных сервисов Яндекса. После официальной части вместе отдохнём: послушаем стендап Севы Ловкачева и поболтаем о жизни в неофициальной обстановке.

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

Вот расписание встреч:

🔸 13 ноября онлайн-трансляция

🔸 13 ноября офлайн-встреча в Москве

🔸 14 ноября офлайн-встреча в Нижнем Новгороде

🔸 15 ноября офлайн-встреча в Екатеринбурге

🔸 16 ноября офлайн-встреча в Новосибирске

🔸 17 ноября офлайн-встреча в Санкт-Петербурге

А с 20 по 26 ноября мы проведём Week Offer Backend: предложим всего за одну неделю получить офер в одну из 14 участвующих команд. Приглашаем кандидатов с опытом разработки от трёх лет на одном из этих языков программирования: С++, С#, Python, Java, Go и Scala. Принимаем заявки до 19 ноября.

Узнать подробности и зарегистрироваться можно здесь.

Реклама. ООО "Яндекс". erid: 2VtzqwfRiE2
👍9🤣3🍌3🔥1
В чем разница между разными модификаторами доступа?

🔘 private – доступ только непосредственно из этого класса и его внутренних/вложенных классов;
🔘 package-private – доступ из всех классов этого пакета. Наследники доступа не имеют. Применяется когда модификатор не указан;
🔘 protected – доступ из всех классов этого пакета и всех наследников;
🔘 public – никаких ограничений доступа;

Модификаторы доступа применяются к классам, интерфейсам, методам и полям. Они нужны для реализации принципа наименьших привилегий и для отделения внутренней реализации от частей публичного API.
👍19🔥41😁1
🌟 Открываем двери в мир Scala-разработки! 🚀

Присоединяйтесь к бесплатному онлайн-занятию «Применение механизма implicits в Scala» от OTUS: регистрация

В рамках вебинара:
— Познакомимся с историей возникновения и мотивацией за разными компонентами данного механизма.
— Разберем возможности и опасности которые таят в себе implicit преобразования
— Узнаем, как использовать и для чего служат implicit параметры
— Рассмотрим правила, по которым Scala ищет подходящего implicit кандидата и какие требования к нему предъявляются.

Вебинар подойдет тем, кто имеет первичный опыт работы со Scala и хочет разобраться, как работает механизм implicit.

💼 По завершении урока вы сможете оформить полный курс в беспроцентную рассрочку

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: LjN8KMAqX
👍5🔥1
Опишите процесс создания экземпляра класса

Сначала класс и цепочка его предков должны быть загружены, сверху вниз. Рассмотрим ClassLoader и процесс загрузки классов в будущих постах. Здесь важно сказать, что класс загружается только один раз, при первом к нему обращении в рамках одного класслоадера.

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

Далее инстанциируется сам экземпляр. Как и с загрузкой классов, процесс выполняется для всей цепочки наследования, с самого дальнего родителя:
1. Выделяется память в куче для экземпляра, получается ссылка на этот экземпляр;
2. Выполняются инициализации нестатических полей и блоков инициализации в порядке объявления;
3. Вызывается конструктор;

Статические поля интерфейсов не инициализируются при создании объекта, а другого состояния интерфейс не имеет – это исключает вопрос порядка инициализации предков при множественном наследовании.

В процессе конструирования объекта может возникать проблема виртуального вызова в конструкторе, свойственная для многих языков.
Effective Java Item 17 рекомендует не использовать переопределяемые методы в расширяемом классе. Иллюстрация неочевидного поведения в результате приведена выше на картинке
👍131
REST, Spring, SQL, ООП — это не что-то на айтишном, а ежедневная рутина, с которой сталкивается любой Java-бэкендер. Если вы ищите фундаментальных знаний и высоких зарплат, то нам по пути.

14 и 16 ноября в 19:00 по Москве в рамках недели Java в школе Smartup пройдут два бесплатных вебинара. Мы собрали 40 лет опыта IT-экспертов и упаковали их в два вечера.

На вебинаре «От заката до рассвета. Один день из жизни разработчика»
- Узнаете больше о буднях разработчика 
- Поймете, что разработчик гораздо больше чем кодер.

На вебинаре «Как пройти путь от первой строчки кода до оффера в международную компанию?»
- Узнаете, как пройти путь от студента до всезнающего разработчика.
- Получите план развития на первый год.

📆 Ближайший вебинар уже 14.11! Регистрируйтесь                                                                                    
Всем участникам дарим чек-лист «Как вырасти от Джуна до Сеньора».➡️   Записаться на вебинары 

Реклама. ООО "СМАРТАП ТЕХНОЛОДЖИ". ИНН 5501278983. erid: LjN8KHQ3t
👍5🔥2
Какой результат выведет следующая программа?
👍8🔥4