▶️ Более 70 000 учеников уже присоединились к beONmax!
https://beonmax.com
Изучайте самые популярные онлайн профессии на практике. Более 50+ курсов по верстке и созданию сайтов, программированию, базам данных, мобильной разработке, дизайну, продвижению и др.
🔹 HTML / CSS
🔹 JavaScript, React JS
🔹 PHP / MySQL
🔹 Python, Django
🔹 Java, Kotlin, Android, C#
🔹 WordPress
🔹 Figma, Photoshop, Illustrator
🔹 Реклама Yandex, Google, VK
и многое другое…
Удобно и выгодно ⏩Обучайтесь на любом курсе по единой подписке - от 90 руб. в месяц!
Вы получите:
☑️ Обучение от экспертов-практиков с реальным опытом
☑️ Десятки крутых проектов в свое портфолио
☑️ Сертификаты по итогам каждого курса
☑️ Рекомендации по трудоустройству или поиску заказов
☑️ Вопросы и обмен опытом в сообществе
☑️ Доступ онлайн 24/7
Отзывы реальных учеников, прошедших обучение на beONmax 🚀
▶️ Начать легко и доступно каждому, даже если вы новичок. Просто регистрируйтесь и проходите первые открытые уроки — Присоединяйтесь к beONmax!
На какие области делится память JVM?
Следует помнить, что это внутренние особенности HotSpot (и её opensource-версии OpenJDK). В других виртуальных машинах (например в Android) всё может быть абсолютно по-другому. Области-поколения кучи вообще зависят от используемого алгоритма сборки мусора, и могут отличаться в рамках одной и той же реализации виртуальной машины. Как было сказано в предыдущих постах, некоторые сборщики не пользуются понятием поколений совсем.
Stack – место под примитивы и ссылки на объекты (но не сами объекты). Хранит локальные переменные и возвращаемые значения функций. Здесь же хранятся ссылки на объекты пока те конструируются. Все данные в стеке – GC roots. Освобождается сразу на выходе из функции. Принадлежит потоку, размер по-умолчанию указывается параметром виртуальной машины -Xss, но при создании потока программно можно указать отличное значение. Подробнее.
PermGen – В этой области хранятся загруженные классы (экземпляры класса Class<T>). Здесь же с Java 7 хранится пул строк. Изначально размера -XX:PermSize, растет динамически до -XX:MaxPermSize. Не считается частью кучи.
Metaspace – с Java 8 заменяет permanent generation. Отличие в том, что по умолчанию metaspace ограничен только размерами доступной на машине памяти, но так же как PermGen может быть ограничен, параметром -XX:MaxMetaspaceSize.
Heap – куча, вся managed-память, в которой хранятся все пользовательские объекты. Все следующие разделы – части кучи. Параметры -Xms, -Xmn и -Xmx устанавливают начальный, минимальный и максимальный размеры хипа соответственно.
Eden, New Generation, Old Generation и другие – специфичные для сборщика мусора части кучи, поколения. Могут быть разные, но общий подход сохраняется: долго живущий объект постепенно двигается во всё более старое поколение; сборка мусора в разных поколениях происходит раздельно; чем поколение старше, тем сборка в нём реже, но и дороже. Подробнее.
Хотя устройство памяти – это детали реализации виртуальной машины, для Java-разработчика знания о них несут практическую пользу. Эти знания необходимы для передачи правильных значений параметров JVM, что в свою очередь спасает от просадок производительности GC и остановок с OutOfMemoryError.
#JVM
Что такое Reflection и как его использовать?Reflection, рефлексия – это средства манипуляции данными на основе знания о структуре классов этих данных, инструменты метапрограммирования.
Класс Class<T> используется как точка входа в мир рефлекшена. Его экземпляры предоставляют саму метаинформацию о содержимом класса и основные методы для работы с ним. Все классы относящиеся Java Reflection находятся в пакетах java.lang и java.lang.reflect.
Экземпляр класса Class можно получить тремя способами:
🔘 Литералом .class;
🔘 Статическим фабричным методом Class.forName();
🔘 Методом getClass() экземпляров класса.
Использование Reflection API медленное и небезопасное. Оно позволяет ломать инвариантность состояний экземпляра, нарушать инкапсуляцию, и даже менять финальные поля.
Использовать рефлексию естественно в тестовом коде, в инструментах разработки, в фреймворках (особенно в связке с runtime-аннотациями). Рефлекшн в ординарном бизнес-коде обычно говорит о больших проблемах проектирования.
Нередко на интервью просят продемонстрировать пример использования рефлекшна. Один из самых близких для backend-разработчика примеров – инициализация классов-конфигураций в Spring Framework. Фреймворк с помощью рефлекшна сканирует внутренности таких классов. Поля и методы, помеченные специальными аннотациями, воспринимаются как объявления элементов экосистемы фреймворка.
#Классы
🔥Хардкорный тест по Java🔥
⭕️Осторожно! Из-за этого курса можно стать супервостребованным Java-разработчиком! Пройди тест из 20 вопроса и испытай себя.
🦸🏼♂️62 компании-партнера ждут, когда ты овладеешь этим мастерством. Проходи вступительный тест курса "Java Developer. Professional" и помни большая сила — большая ответственность!
📌ПРОЙТИ ТЕСТ - https://otus.pw/dvKm/
Сегодня паттерн Посетитель в Java уже не нужен – лучше использовать переключатели паттернов
В современном языке Java паттерн Посетитель (Visitor) уже не нужен. Он отлично компенсируется использованием запечатанных типов и переключателей, использующих сопоставление с шаблоном – в таком случае те же цели достигаются проще и меньшим объемом кода. Далее
Чем анонимный внутренний класс отличается от лямбды?
Лямбда-выражение имеет более легковесный синтаксис. Не нужно явно указывать тип функционального интерфейса, который лямбда реализует – он автоматически выведется из контекста. Лямбда-выражения добавлены в язык в первую очередь как синтаксический сахар.
С другой стороны, у класса есть поля. Экземпляр анонимного класса сохраняет свое состояние между вызовами, и меняет его при необходимости. Для лямбды доступен лишь захват и effectively final использование внешних переменных.
Лямбдой реализуется только функциональный интерфейс. Функциональный интерфейс – это тип с единственным абстрактным методом. Анонимным классом же можно расширить любой расширяемый класс или реализовать интерфейс с любым количеством абстрактных методов.
Анонимный класс создает новый скоуп, лямбда работает в текущем. Это значит, что объявление переменной с именем, которое уже используется снаружи, в лямбде вызовет ошибку компиляции «variable is already defined», в анонимном классе скроет (shadowing) внешнюю переменную.
С точки зрения реализации JVM, для лямбды не создается дополнительного .class файла, как это происходит для анонимного класса. Соответственно, не происходит и обычной загрузки и верификации класса. Вместо этого используется механизм invokedynamic и класс генерируется на лету с помощью LambdaMetafactory. Так что лямбда-выраженияобычноработают быстрее. Внутренности реализации подробно разобраны например в этой статье.
Ты Java программист и устал серфить интернет в поисках вакансий? Тяжело найти ту самую работу, которая будет соответствовать и отвечать требованиям твоего уровня?
Java Job - канал, который поможет решить эти вопросы
На канале ты найдешь:• свежие и актуальные вакансии, с достойными зарплатами и условиями труда
• стажировки, бесплатные курсы, работа для джунов, мидлов и сеньеров по всему миру
• примеры вопросов с собеседований, интересные задачи и обучающий материал для повышения скилла
Подписывайся на наш канал, цени свое время!
Классические задачи Computer Science на языке Java
Копец Дэвид (2021)
Cтолкнулись с «неразрешимой» проблемой при разработке программного обеспечения? Скорее всего, кто-то уже справился с этой задачей, и вы можете не ломать голову. Дэвид Копец собрал наиболее полезные готовые решения, принципы и алгоритмы. «Классические задачи Computer Science на языке Java» — это мастер-класс по программированию, содержащий 55 практических примеров, затрагивающих самые актуальные темы: базовые алгоритмы, ограничения, искусственный интеллект и многое другое.
В этой книге:
- Рекурсия, мемоизация и битовые манипуляции.
- Поисковые, графовые и генетические алгоритмы.
- Проблемы ограничений.
- Кластеризация методом k-среднего, нейронные сети и состязательный поиск.
Скачать
👉 @java_360
Вам нужно обновить или купить новые компьютеры или их комплектующие для офиса?
Хотите, чтобы покупка была выгодной и удобной?
Сейчас в Ситилинк проходит акция «Идеальный ПК» специально для юридических лиц
До конца июня при заказе комплектующих на сайте Ситилинк вы получаете:
• 100% скидку на сборку заказанных машин
• до 3% бонусов на вашу клубную карту клиента
Переходи по ссылке ниже и соберите свой идеальный ПК https://clck.ru/pe3zN
Назовите проблемы стандартной сериализации.
Стандартная сериализация Java при всей своей гибкости обладает рядом проблем.
Дефолтная сериализация фактически добавляет все приватные поля в экспортируемый интерфейс, и ограничивает будущую гибкость реализации. От этого спасает serialization proxy.
Десериализация работает как скрытый конструктор, мимо настоящего, который обеспечивает консистентность состояния. Не сработают даже инициализаторы: поле, определенное как int foo=42, после десериализации будет хранить значение 0.
Сериализация усложняет тестирование – между разными версиями класса должна соблюдаться семантическая совместимость. Эта проблема актуальна для любой реализации персистентного хранения объектов.
Неаккуратно определенная десериализация создает дыры в безопасности. Например, сериализация объекта со слишком глубоким графом объектов-полей может привести к StackOverflowError. Злоумышленник положит вашу систему, подставив такой искусственный объект. Для защиты от различных уязвимостей в Java 8 добавлен механизм сериализационного фильтрования.
Встроенная реализация сериализует все классы одинаково хорошо. Естественно, за универсальность нужно платить, и для каждого частного случая производительность не идеальна и может быть улучшена частной реализацией.
#Сериализация
Как создать рандомную строку в java?
Как вариант используйте StringBuilder и цикл чтобы создать рандомную строку в Java, ниже пример кода как пример.
import java.security.SecureRandom;
public class Main {
public static void main(String args[]) {
// Символы строки
String alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
// Длина строка
int len = 5;
StringBuilder sb = new StringBuilder(len);
SecureRandom rnd = new SecureRandom();
for (int i = 0; i < len; i++) {
sb.append(alpha.charAt(rnd.nextInt(alpha.length())));
}
// Вывод: 5ezs1
System.out.println(sb.toString());
}
}
#java
Подписывайтесь на канал 👉@coddy_academy
Газпромбанк приглашает тебя на онлайн-лекцию о старте карьеры в IT!
9 июня в 18:00 (по МСК) Ян Ашенкампф поделится инсайтами о поиске идеального работодателя и преодоления трудностей на первой работе. На примере личного опыта Ян расскажет про путь до руководителя разработки департамента ИТ инвестиционного бизнеса Газпромбанка.
Что тебя ждет:
• лекция о построении карьеры в IT, лайфхаки для прохождения собеседований и адаптации на рабочем месте для джунов;
• возможность задать вопросы лектору и завести полезные знакомства;
• мерч и сертификат об участии!
Лекция пройдет в Zoom (только live) – регистрируйся: https://vk.cc/cdZ3PU
Что такое serialization proxy?
Serialization proxy (посредник сериализации) – это паттерн, который дает простой способ определить собственную сериализационную форму.
1. Внутри целевого класса объявляется вложенный класс-посредник;
2. В посреднике объявляются поля, описывающие логическую структуру объекта (собственно, сериализационную форму);
3. Добавляется конструктор посредника, принимающий экземпляр оригинального класса и инициализирующий все эти поля;
4. Оба класса помечаются интерфейсом Serializable;
5. В методе writeReplace оригинального класса инстанциируется и возвращается прокси от this;
6. Симметричные действия совершаются для чтения – в классе-посреднике реализуется метод readResolve;
7. В основном классе добавляется readObject, который выбрасывает исключение – это защитит от чтения без прокси.
Пример кода реализации.
#Сериализация
🔥 OTUS приглашает 9 июня в 19:00 мск на бесплатный вебинар «Архитектура приложения и модуль бизнес-логики» оналйн-курса «Kotlin Backend Developer»!
📚На вебинаре мы обсудим, как поддерживать чистую архитектуру приложения и контролируемо внедрять изменения. Так же мы исследуем библиотеку для реализации бизнес-процессов, написанную на Kotlin.
👉Регистрация на вебинар: https://otus.pw/B1Sg/Бонус: пройдите вступительный тест и получите курс по Git в записи бесплатно!
Как сериализация работает с наследованием?
Когда Serializable класс имеет цепочку родителей, пока эти родители тоже Serializable, десериализация объекта идет от родителя к наследнику, в обход конструктора. Вместо него вызываются методы readObject (readObjectNoData). Но как только встречается первый предок, не реализующий интерфейс Serializable, инициализация для него возвращается в нормальное русло – вместо readObject вызывается конструктор без аргументов. Если такого конструктора нет, или он объявлен private, исполнение выбросит InvalidClassException.
При сериализации несериализуемые предки просто игнорируются.
Если класс несериализуемый и не предоставляет достаточного доступа к своему логическому состоянию для наследников, правильно реализовать его наследника сериализуемым может быть невозможно.
Популярный вопрос на тему – как когда сериализуешь объект класса-наследника, избежать сериализации его родительской части. Единственный способ добиться этого – кастомизировать сериализационную форму, определив собственную реализацию writeObject(), либо используя интерфейс Externalizable.
Открытость класса для наследования делает неприменимым паттерн serialization proxy (который рассмотрим позднее).
#Сериализация
Одна из многих причина нежелания идти учиться на курсы по разработке — отсутствие гарантий, что деньги за курс не будут выброшены на ветер.
В Kata Academy эти гарантии предоставляют.
В договоре с Kata четко прописано, что вам не нужно платить за обучение до тех пор, пока вы не устроитесь на работу в IT. То есть во время обучения вы ничего не платите.
Также в договоре указывается, что Kata гарантирует минимальную зарплату от 100 тысяч рублей в месяц.
Если вы вдруг не смогли устроиться на работу, то за обучение платить не нужно. Связано это с тем, что цель Kata — ваше трудоустройство разработчиком, а если вам не удалось, значит на курсе вас не смогли подготовить должным образом.
Записывайтесь на курс и получайте тестовое задание: https://clck.ru/hN2AE
Если не уверены в своих силах — не переживайте, Kata дадут неплохой FAQ, который поможет с выполнением тестового!