Программист живёт нормально
2.16K subscribers
142 photos
7 videos
29 files
80 links
Канал о программировании, программистах и жизни с программистами

Автор: @tkach1380
Download Telegram
Итак, начнем с довольно остросоциальной темы☠️

#java #junior
Как передаются параметры в Java? По ссылке или по значению?

Очень часто люди отвечают как-то так: "Java передает примитивные типы по значению, а объекты по ссылке"
На самом деле ответ проще: Java всегда передает параметры по значению

Давайте разберемся в определениях:

Передача по значению (by value): Берется переменная, значение которой мы хотим использовать в методе. Значение этой переменной КОПИРУЕТСЯ и передается в метод.
Передача по ссылке (by reference): Берется переменная, значение которой мы хотим использовать в методе. Значение этой переменной НЕ КОПИРУЕТСЯ. В метод передается лишь УКАЗАТЕЛЬ на саму эту переменную (не на ОБЪЕКТ, а на ПЕРЕМЕННУЮ, которая указывает на ОБЪЕКТ)

С примитивными типами все понятно, в Java мы копируем значение переменных и считаем что-то в методе, самая настоящая передача по значению 👍

С ссылочными типами и возникают трудности. Часто под "передачей параметра по ссылке" люди имеют ввиду "передачу ссылки на объект".
Действительно, в Java в метод передается КОПИЯ ссылки на объект. Однако суть "передачи значения по ссылке" в том, что в метод передается НЕ ссылка на объект, а ссылка на переменную, которая уже ссылается на этот объект.

То есть при "передаче по ссылке" в методе мы получаем УКАЗАТЕЛЬ на ПЕРЕМЕННУЮ, которая в свою очередь указывает на ОБЪЕКТ.
А при "передаче по значению" в метод просто КОПИРУЕТСЯ ссылка на объект, и именно так и происходит в Java.

Java всегда передает параметры по значению 👩‍🎓
🔥31👍1
#java #junior
Где хранятся примитивные поля объектов? 🧳

Ответ односложен - в куче. Но почему же так происходит? Почему примитивные поля не могут храниться в стеке? 💆‍♀️

Для этого давайте откатимся назад и обсудим, что же такое стек?

Стековая память в Java работает по схеме LIFO (Последний зашел-Первый вышел)

Каждый раз, когда мы вызываем метод, в стеке формируется новый блок, который содержит все примитивы и ссылки на объекты (НЕ САМИ ОБЪЕКТЫ, они хранятся в куче)🧶

Как только метод завершается - этот блок УДАЛЯЕТСЯ из стека. Соответственно, все примитивы и ссылки на объекты удаляются из стека в этот же момент. Они больше нам не нужны, потому что все расчёты с ними мы завершили (как вы знаете, область доступности переменной в Java ограничивается блоком = фигурными скобками, в которых она объявлена)

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

Именно для сохранения целостности объекта все поля этого объекта сохраняются в КУЧЕ, и никак иначе🕶
👍4
#java #middle
Почему не всегда использование всех фишек подключаемых библиотек – это хорошо? 🌪

Зачастую, подключая какую-либо библиотеку к проекту, мы верим ей почти беспрекословно. Кажется, что всё, что мы подключаем к проекту, изначально не может содержать ошибок или недоработок.

Но это не так! Зачастую в библиотеках есть большое количество и неисправленных багов, и экспериментальных фишек ⚠️

Такая ситуация случилась со мной совсем недавно: я использовал библиотеку для автогенерации кода Lombok, которая позволяет не создавать конструкторы, сеттеры, геттеры самостоятельно, а генерирует их за счет добавления аннотаций. Например, при добавлении @Getter над классом, эта библиотека создаст геттеры для всех полей этого класса. Очень удобно.

И вот я разрабатываю класс-утилиту – вспомогательный класс, все члены которого статические, а экземпляры этого класса не могут существовать (создается приватный конструктор). Примером такого класса является java.lang.Math.

В этот момент мне приходит идея использовать аннотацию @UtilityClass, которая как раз создает, и приватный конструктор и запрещает создание любых других конструктор. И более того, помечает класс final. Жизнь сладка! 🍏

Ан нет! Я не прочитал документацию на эту аннотацию (а стоило): https://projectlombok.org/features/experimental/UtilityClass

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

То есть (на примере java.lang.Math) так бы сработало: import static java.lang.Math.*
А так нет: import static java.lang.Math.PI

Открыв документацию, мы сразу видим надпись «Experimental» и описание той самой проблемы, о которой я писал выше.
Используя библиотеки – будьте внимательны к экспериментальным фишкам! ♨️
🤔4
#junior #middle #Поговорим #Java
Многие знают, что первое, куда стоит заглядывать, если вы чего-то не понимаете в технологии или языке - это документация 🤖

Документация Java и Spring:
https://docs.oracle.com/en/java/javase/19/
https://docs.spring.io/spring-framework/docs/current/reference/html/

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

Возьмем HashMap - удобный способ хранения в Java данных в виде ассоциативного массива, то есть пар "ключ-значение". Например, в нем мы можем хранить оценки учеников: ["Петров": 5, "Иванов": 3, "Сидоров": 2]

Поиск в таком ассоциативном массиве осуществляется по ключу (в нашем случае, фамилия школьника). А сам алгоритм поиска основан на работе корзин (buckets) и хэшкодов (hashcode). Количество таких корзин по-умолчанию задано в Java жестко. Более того, часто на собеседованиях я слышал вопрос: "Может быть, помните изначальное количество корзин в HashMap?" 😳

Давайте постараемся "вспомнить"

Есть три варианта это сделать. Я называю их первичным, вторичным и третичным ♨️

Третичным вариантом пользуемся мы все: бежим в гугл и ищем информацию о количестве корзин. Я уверен, что вы найдете информацию на первом же сайте (как ее нашел я).
Чем хороша такая информация? Она написана на вашем родном языке и, скорее всего, написана на вашем уровне. Более того, наш с вами канал - тоже источник третичной информации. Минусы тоже очевидны: информация может быть неактуальной или вовсе неверной. Стоит все перепроверять ⚠️

Вторичным источником можно назвать официальную документацию. Чаще всего такая документация описана на английском, но иногда она переводится и на другие языки (пример: документация по vue.JS). Из плюсов: шансы найти в ней ошибку минимальны. Минусы: чаще всего это прямое пересказывание кода.

Первичным источником информации является КОД. Да, написанный разработчиками код, в котором есть и описания на английском языке, и, что самое важное, все переменные, методы и функции 🌪

Хороший код, во многом, самодокументируемый. Это значит, что открывая его, вы в целом будете понимать, о чем идет речь (если у вас есть достаточно опыта в разработке). Посмотрите на третий скриншот, тут напрямую говорится о том, что "вместимость HashMap" равна 16. Это и есть ответ на наш вопрос.
Изучая настоящий код Java (или любого другого языка), вы получаете сразу три бенефита:

⚠️ Ответ на свой вопрос
🐣 Понимание устройства языка, его структуры
♨️ Способность читать чужой код

И третий из них, по моему мнению, просто невероятно важен каждому программисту.

Да, ключевым минусом тут является то, что вам придется разбираться даже не в английском тексте, а напрямую в коде, но вы же для этого и учились?

Читайте первичные источники информации!
👍4
#junior #middle #МокИнтервью #java

Настал этот момент! Загружаю для вас первую часть Mock-интервью с Феликсом - нашим сегодняшним соискателем.

https://youtu.be/mZMsNA4DlsU

00:00 - Знакомство с Феликсом
6:00 - Самая сложная задача в работе
10:00 - Начало технического собеседования
10:10 - JVM, JRE, JDK
12:00 - final, finally, finalize
14:30 - equals и hashcode
15:40 - контракт между equals и hashcode
16:30 - почему хэшкоды могут быть равны?
17:25 - модель памяти в Java
19:30 - когда stream начинает свое выполнение?
20:40 - пул строк
22:00 - коллекции
22:50 - разница ArrayList, LinkedList
25:45 - реклама книги для начинающего разработчика
26:40 - устройство HashMap и HashSet
30:00 - по какому принципу увеличивается количество бакетов?
32:55 - сложный вопрос про HashMap
34:00 - какие базы данных использовал
35:05 - первичный и внешние ключи
36:25 - ограничения на ключи
🔥8👍5😍2👏1
#junior #middle #МокИнтервью #java
А вот и вторая часть Mock-собеседования с Феликсом. В нем разобрали вопросы по sql и Spring, было круто!

https://youtu.be/l47cQGiDq_g

0:15 - типы Join
2:45 - having, where
4:20 - Задача на собеседовании на SQL
8:10 - Индексы
12:35 - куда будет вставляться строка быстрее
15:30 - партиционирование и explain
16:10 - какие есть scope в Spring?
17:50 - какой скоуп используется по умолчанию?
18:15 - где использовал прототайп?
20:40 - аннотации, в чем их разница?
22:35 - разница RestController и Controller?
23:00 - где используется Bean?
25:00 - конфигурация Spring-приложений
27:00 - конец технического собеседования
🔥6🎉2❤‍🔥1