Библиотека Java разработчика
10.8K subscribers
1.14K photos
563 videos
58 files
1.44K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
Какие в Java бывают виды ссылок?

Кроме обычной жесткой ссылки на объект существуют варианты ссылок, которые обрабатываются сборщиком мусора особым образом. Это наследники класса java.lang.ref.Reference. Все они реализуют разного рода слабые ссылки. Технически это обертки над объектом, который доступен по методу get(), и может быть удален сборщиком мусора пока объект-обертка еще не удален. Используются они для экономии памяти, для реализации кэшей, для финализации внешних ресурсов. Например в Android слабые ссылки иногда используются для борьбы с утечкой Activity.

Виды ссылок в порядке убывания «жесткости»:

Обычная жесткая ссылка – любая переменная ссылочного типа. Очистится сборщиком мусора не раньше, чем станет неиспользуемой (перестанет быть доступной из GC roots, подробнее в следующих постах).
SoftReference – мягкая ссылка. Объект не станет причиной израсходования всей памяти – гарантированно будет удален до возникновения OutOfMemoryError. Может быть раньше, зависит от реализации сборщика мусора.
WeakReference – слабая ссылка. Слабее мягкой. Не препятствует утилизации объекта, сборщик мусора игнорирует такие ссылки.
PhantomReference – фантомная ссылка. Используется для «предсмертной» обработки объекта: объект доступен после финализации, пока не очищен сборщиком мусора.

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

#JVM
👍12
Выкладывать информацию по Kotlin?
Anonymous Poll
68%
Да
32%
Нет
Из чего состоит .class-файл?

.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:

🔘 Свойства файла: определяющее тип файла «волшебное слово» 0xCAFEBABE и версия формата;
🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;

Для внутренних классов тоже создаются отдельные файлы с названиями формата OuterClass$InnerClass.class. Если класс анонимный, вместо имени используются номера с 1.

#JVM
👍12🔥2
Из чего состоит .class-файл?

.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:

🔘 Свойства файла: определяющее тип файла «волшебное слово» 0xCAFEBABE и версия формата;
🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;

Для внутренних классов тоже создаются отдельные файлы с названиями формата OuterClass$InnerClass.class. Если класс анонимный, вместо имени используются номера с 1.

#JVM
🔥4👍2
Когда изучаешь Java, в ход идет всё: книжки, видео с Ютюба и комменты на
Хабре. И все же системные знания и практику тяжело заменить информацией из интернета.

В KATA Academy можно выучиться на Java-разработчика бесплатно, а

заплатить уже после трудоустройства — это прописано в договоре.

👉 Что это за модель и чем отличается от кредита:

— мы инвестируем в своих учеников: бесплатно обучаем их, а затем получаем процент от зарплаты разработчиков;

— нам не все равно, в кого вкладывать деньги — чтобы попасть на курсы,
нужно пройти отбор и выполнить тестовое;

— мы развиваем навыки ребят и после курсов: проводим выездные
мероприятия и мастер-классы — и доходы наших ребят растут;

— мы не зависим от банков и их рассрочек — кризис не повлиял на
доступность курсов.

С самого начала у нас была тактика: «После обучения в KATA Academy
выпускники получают работу, а не бумажку о том, что их пытались учить» — и мы ее придерживаемся.

Переходи по ссылке и оставляй заявку — пришлем тестовое задание.
👎8👍4
Для чего используется оператор assert?

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

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

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

Т.к. утверждения могут быть удалены на этапе компиляции либо во время исполнения программы, они не должны менять поведение программы. Если в результате удаления утверждения поведение программы может измениться, то это явный признак неправильного использования assert. Таким образом, внутри assert нельзя вызывать методы, изменяющие состояние программы, либо внешнего окружения программы.

В Java проверка утверждений реализована с помощью оператора assert, который имеет форму:

[Выражение типа boolean]; или assert [Выражение типа boolean] : [Выражение любого типа, кроме void];

Во время выполнения программы в том случае, если поверка утверждений включена, вычисляется значение булевского выражения, и если его результат false, то генерируется исключение java.lang.AssertionError. В случае использования второй формы оператора assert выражение после двоеточия задаёт детальное сообщение о произошедшей ошибке (вычисленное выражение будет преобразовано в строку и передано конструктору AssertionError).
👍8
События последнего месяца изменили рынок труда. Часть компаний приостановили подбор сотрудников, другие распустили команду, а третьи наоборот активно нанимают. Оценить масштаб перемен пока сложно. Чтобы это сделать, AGIMA проводит круглый стол.

14 апреля в прямом эфире эксперты из Альфа-Банка, Tochka, Хабра, HeadHunter, Kaspersky и другие разберутся, чего ждать разработчикам:

- кого и где сокращают;
- какие компании начали активно нанимать;
- что будет с зарплатами;
- что делать уехавшим разработчикам;
- как  компании помогают сотрудникам пережить кризис.

Цель встречи — найти тенденции в найме и дать прогнозы. Полезно будет для веб- и мобильных разработчиков, тимлидов, QA, DevOps.

Регистрируйтесь!
👍3
Можем ли мы перегружать статические методы?

Ответ - да. У нас может быть два или более статических метода с одинаковым именем, но с разными входными параметрами.

Можем ли мы перегрузить методы, которые отличаются только ключевым словом static?

Мы не можем перегрузить два метода в Java, если они отличаются только ключевым словом static (количество параметров и типы параметров одинаковы).

Можем ли мы перегрузить main() в Java?
Как и другие статические методы, мы можем перегрузить main() в Java.

#вопросыссобеседований
👍7
Сколько памяти занимает объект?

Размер экземпляров ссылочных типов, как и примитивов, зависит от конкретной реализации JVM и параметров ее запуска. Обычно в вопросе подразумевается самая популярная машина – HotSpot от Oracle.

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

Как говорилось ранее, ссылка в Java – не то же самое что указатель в C++, это не адрес в памяти. Из-за этого размер поля-ссылки может не совпадать с размером машинного слова, например когда HotSpot использует оптимизацию «сжатие ссылок» (Compressed OOP).

Кроме полей и промежутков, каждый объект в HotSpot начинается с заголовка – runtime-метаинформации. Заголовок занимает от 8 до 16 байт.

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

#JVM
👍7
Программа на Java, убирающая все переносы в строке

Для замены всех переносов («\n») можно использовать функцию replace(). String replace() возвращает новый объект String, который содержит ту же последовательность символов, что и исходная строка, но с замененным символом.

Таким образом с помощью функции replace() можно заменять любые символы в строке на нужные.

#вопросыссобеседований
👍10👎5
Media is too big
VIEW IN TELEGRAM
Уроки Java с нуля

- Введение и установка. Что пишут на Java
- Условные операторы If, Else If, Switch case
- Циклы For, While, Do while
- Массивы. Перебор массива
- Методы, как их писать и что делают
- Работа со строками. Методы строк
- Введение в ООП. Создание класса. Конструкторы. This
- Основы ООП. Наследование

https://www.youtube.com/playlist?list=PLVfMKQXDAhGVWEKi2wKx4y-yNLk7QKam3
👍4👎1
Подборка каналов для IT специалистов 🎯


Вакансии 📌
https://t.me/progjob Вакансии для программистов

Системное администрирование 📌
https://t.me/i_DevOps Все для DevOps
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов

Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика

Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка

Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков

Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика

Разработка игр 📌
https://t.me/game_devv GameDev: разработка игр

Программирование, Биг дата, книги 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/coddy_academy Академия кода

Шутки программистов 📌
https://t.me/itumor ITumor | программисты шутят

Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности

Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров

Английский 📌
https://t.me/UchuEnglish Английский с нуля

Математика 📌
https://t.me/Pomatematike Канал по математике

Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика

Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
2
Как работает сборка мусора?

Очередной вопрос, ответ на который нужно начинать с уточнения: в каком именно сборщике мусора? Понятие сборщика мусора вводится в спецификации JVM, но внутренности зависят от реализации. Одна JVM может содержать несколько сборщиков, один сборщик может применять разные алгоритмы в разных случаях. Вообще говоря, в теории GC может делать ничего. Метод System.gc() обещает, что сборщик сделает «лучшую попытку» освободить память, то есть по факту не дает никаких гарантий.

GC (garbage collector) – центральная тема шуток про «джава тормозит». Это необходимая плата за стабильное автоматическое управление памятью. Поэтому это одна из самых бурлящих и меняющихся областей мира Java.

Основные подходы к сборке мусора – подсчет ссылок (reference counting) и обход графа достижимых объектов (mark-and-sweep, copying collection). Первый подход испытывает трудности с циклическими ссылками, в Java в основном используется второй.

Большинство сборщиков опирается на слабую гипотезу о поколениях. Гипотеза предполагает, что молодые объекты умирают чаще. Для этого куча делится на регионы по времени жизни объектов – поколения. Сборка мусора в них выполняется раздельно.

Общий для большинства сборщиков алгоритм описан во множестве статей, например, в этой. Суть его в том, что достижимые объекты помечаются и группируются, а недостижимые удаляются.



GC Roots – то, с чего начинается обход графа объектов на вопрос достижимости. Множество корневых объектов (root set) считается достижимым безусловно. Часто на интервью просят их перечислить.

Важное понятие для сборщиков мусора – Stop The World пауза. Это полная остановка потоков программы для безопасной сборки мусора и других системных операций. Происходит в специальных местах программы, которые называются safepoint.

Конкретный сборщик в HotSpot указывается в параметре запуска JVM. Каждый сборщик имеет много специфичных для него настроек. В Java 10 HotSpot доступно 4 сборщика:

🔘 Serial – однопоточный, с поколениями. Дает большой throughput (маленькая сумма задержек);
🔘 Parallel – многопоточный вариант Serial;
🔘 CMS (Concurrent Mark-Sweep) – дает меньшую latency (маленькие отдельные паузы), выполняя часть сборки вне Stop The World. Плата за это – меньший throughput. Способ сборки примерно как в предыдущих, работает с поколениями. В Java 9 уже объявлен deprecated;
🔘 G1 (Garbage First) – тоже направлен на уменьшение latency. Вместо поколений оперирует регионами;
🔘 Скоро будет добавлен новый сборщик Shenandoah;

Настоятельно рекомендуется к изучению очередной доклад Шипилёва (с продолжением) и цикл статей на хабре.

#JVM
👍14🔥3
Почему char[] предпочтительнее String для хранения пароля?

С момента создания строка остаётся в пуле, до тех пор, пока не будет удалена сборщиком мусора. Поэтому, даже после окончания использования пароля, он некоторое время продолжает оставаться доступным в памяти и способа избежать этого не существует. Это представляет определённый риск для безопасности, поскольку кто-либо, имеющий доступ к памяти сможет найти пароль в виде текста. В случае использования массива символов для хранения пароля имеется возможность очистить его сразу по окончанию работы с паролем, позволяя избежать риска безопасности, свойственного строке.
👍22🔥5👎2
Что можно делать с переменной хранящей null?

Во-первых, если переменная не финальная, использовать как L-value этого типа – присваивать новое значение.

Во-вторых, то же, что со значением null, но с учетом типа:
🔘 Сравнивать с null или переменной этого же класса;
🔘 Приводить к типу-родителю (upcast) или типу-наследнику (downcast), учитывая границы generic-параметров при наличии;
🔘 Обращаться к членам экземпляра и получать NullPointerException;
🔘 Применять instanceof и получать false
🔘 Использовать как параметр для методов и других совместимых с типом операторов

В-третьих, можно обращаться к статическим членам класса. В вопросе подразумевается именно эта интересная часть. Это безопасно, NullPointerException не возникнет, но для упрощения отладки и из-за отсутствия переопределения статических членов рекомендуется так не делать. Вместо этого обращайтесь к статике явно через имя класса, либо неявно, добавив для класса import static.

#Классы
👍3👎3
Как вернуть два значения из метода в java?

Вы можете возвращать массив значений из метода.

class Main {
public static int[] get_summ_and_diff(int x, int y){
int summ = x + y;
int diff = x - y;

return new int[]{summ, diff};
}

public static void main(String[] args) throws Exception {
int[] diff_and_summ = get_summ_and_diff(10, 5);

System.out.println(diff_and_summ[0]);
System.out.println(diff_and_summ[1]);

// Вывод :
// 15
// 5
}
}


#java

Подписывайтесь на канал 👉@coddy_academy
👎15👍7🤬1
Что такое enum?

enum – тип-перечисление. Бывает много разных формулировок вопроса, все они сводятся к разговору о перечислениях вообще. Технически это финальный класс со статическими финальными полями-экземплярами. enum Foo всегда неявно наследуется от Enum<Foo> – то есть перечислением нельзя расширить другой класс, но всё еще можно реализовать интерфейсы. Из-за generic-параметра разные перечисления не имеют общего предка кроме Object.

Является Comparable (сравнивается позиция по порядку объявления значений) и Serializable (сериализуется только имя константы).

Имеет только заранее заданный набор значений. Значения неявно public static final и это нельзя переопределить. Для инициализации констант действуют все правила статической инициализации.

Копии элементов перечисления не создаются даже при десериализации. Вот почему Effective Java предлагает использовать для сериализуемого синглтона enum.

Экземпляры хранят свойства name и ordinal – имя и порядковый номер константы. Статический метод values вернет список всех констант, valueOf – константу по имени. Спецификация.

Финализация и клонирование перечислений запрещены.

#Классы
👍8
Зачем нужен загрузчик классов?

В Java используется динамическая загрузка классов. Ее выполняют загрузчики – наследники абстрактного класса ClassLoader. Кроме того, они же загружают и файлы-ресурсы.

Загрузка класса (точнее любого ссылочного типа) и всех его предков происходит автоматически перед его инициализацией. При этом используется тот лоадер, который загрузил текущий код. Таким образом, загрузка всех, даже встроенных классов – ленивая.

Вручную класс можно загрузить из конкретного загрузчика, передав аргументом его метода loadClass бинарное имя класса.

В URLClassLoader и стандартных загрузчиках JVM источником класса служит .class-файл. Другие загрузчики в своей реализации используют и другие источники: это может быть сетевой ресурс, или класс может генерироваться в рантайме. К примеру загрузчик из javassist специализируется на создании классов на лету.

В результате загрузки создается экземпляр класса Class. В отличие от обычных объектов, такие экземпляры хранятся не в куче, а в permgen/metaspace. Class может быть выгружен, когда загрузивший его ClassLoader стал мусором.

#Классы
👍71