Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
Какие существуют стандартные загрузчики классов?

В JVM встроено как минимум три стандартных загрузчика:

🔘 Bootstrap – встроенная в JVM нативная реализация, родитель для всех остальных загрузчиков. Загружает часть стандартных классов java.*;
🔘 Platform – отвечает за загрузку стандартных классов Java-рантайма. До Java 9 назывался Extension и занимался загрузкой расширений. Гарантируется, что ему будут видны (но не факт что загружены непосредственно им) все стандартные классы Java SE и JDK;
🔘 System (Application) – загружает классы из classpath) конкретного приложения;

Перед тем как загрузить класс, ClassLoader проверит, не может ли это сделать его родитель. Если класс уже загружен, то загрузка не потребуется.

Иллюстрация смысла этой иерархии – загрузчики web-сервера Apache Tomcat. Прикладной код каждого web-приложения работает на своем отдельном загрузчике изолированно от других приложений. Даже один и тот же класс-singleton у каждого приложения будет собственный. Системные классы и общие библиотеки при том грузятся их родительскими загрузчиками, только один раз для сервера.

#Классы
Давно думали над переходом от разработчика к тимлиду? Тогда успейте записаться на бесплатный вебинар от GeekBrains X AGIMA и узнайте, из кого получаются хорошие тимлиды.

- Почему тимлид в AGIMA считается отдельной профессией, а не ролью;
- Какие навыки тимлида ценятся на рынке и в компании AGIMA;
- Как разработчики становятся тимлидами и как мы выстраиваем институт тимлидерства.

За 1,5 часа вы сможете послушать выступление, задать интересующие вопросы и прокачать свои скиллы. Как бонус вы получаете методические материалы и запись вебинара.

Вебинар состоится 27 мая в 19:00. Узнавайте подробности и записывайтесь здесь. Перед началом вебинара отправляется уведомление.
Опишите процесс создания экземпляра класса

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

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

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

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

В процессе конструирования объекта может возникать проблема виртуального вызова в конструкторе, свойственная для многих языков. Effective Java Item 17 рекомендует не использовать переопределяемые методы в расширяемом классе. Иллюстрация неочевидного поведения в результате приведена ниже:
#вопросы_с_собеседований
Зачем нужен equals(). Чем он отличается от операции ==?
👨🏻‍💻Middle Java Developer, Serpstat, удалённо или в офис, Одесса, Киев

О компании:
🔸В команду Serpstat (международный HighLoad проект) ищем Middle Java Developer
🔸Технологии, которые используем в компании: Java, RabbitMQ, Kafka, ClickHouse, Apache Storm. Строим наш продукт по принципам SOLID, DRY, DIE, KISS, YAGNI.
🔸Serpstat — это 245 000+ пользователей, продукт представлен в 230 странах, базы данных Google для всех стран, 230 баз ключевиков, более 300 серверов, больше 250 Тб данных

Что мы ожидаем от Вас:
🔸Опыт разработки на Java от 2 лет.
🔸Знание и понимание принципов ООП.
🔸Знание, понимание и следование принципам SOLID, DRY, DIE, KISS, YAGNI.
🔸Отличные знания SQL, опыт проектирования баз данных и оптимизации запросов.
🔸Понимание работы DNS, HTTP 1/2.
🔸Опыт работы с RabbitMQ, Kafka.
🔸Знание Spring Boot, Spring Web, Spring Data.
🔸Знание Git / Maven.
🔸Знание Unix систем.

Что мы готовы предложить:
🔸Удобный график: с 8-10 до 17-19
🔸Зарплата по итогам собеседования.
🔸Возможность работать в офисе в Одессе, Киеве, или полностью удаленно
🔸Оплачиваемые больничные и отпуск
🔸Посещение профильных конференции за счет компании (мы оплачиваем 50% стоимости билета на мероприятие и проезда), а также участие в конференциях и семинарах организаторами которых является Netpeak Group
🔸Возможность обучения и развития: опыт и помощь наших сотрудников, помощь в профессиональной адаптации и обучение куратора на протяжении всего испытательного срока
🔸Карьерную лестницу и карту знаний, которые дают прозрачное понимание того, что надо сделать, чтобы перейти на новую ступеньку.

Подробности вакансии: https://career.netpeak.group/vacancy/middle-java-developer-serpstat/
Контакт: @twen_netpeak
Что такое ковариантность и контравариантность?

Формально, ковариантность/контравариантность типов – это сохранение/обращение порядка наследования для производных типов. Проще говоря, когда у ковариантных сущностей типами-параметрами являются родитель и наследник, они сами становятся как бы родителем и наследником. Контравариантные наоборот, становятся наследником и родителем.

Легче всего осознать эти понятия на примерах:
🔘 Ковариантность: List<Integer> можно присвоить в переменную типа List<? extends Number> (как будто он наследник List<Number>).
🔘 Контравариантность: в качестве параметра метода List<Number>#sort типа Comparator<? super Number> может быть передан Comparator<Object> (как будто он родитель Comparator<Number>)

Отношение типов «можно присвоить» – не совсем наследование, такие типы называются совместимыми (отношение «is a»).

Существует еще одно связанное понятие – инвариантность. Инвариантность – это отсутствие свойств ковариантности и контрвариантности. Дженерики без вайлдкардов инвариантны: List<Number> нельзя положить ни в переменную типа List<Double>, ни в List<Object>.

Массивы ковариантны: в переменную Object[] можно присвоить значение типа String[].

Переопределение методов начиная с Java 5 ковариантно относительно типа результата и типов исключений.

#Язык
#Дженерики
Метод equals() - определяет отношение эквивалентности объектов.

При сравнении объектов с помощью == сравнение происходит лишь между ссылками. При сравнении по переопределённому разработчиком equals() - по внутреннему состоянию объектов.
От написания кода до релиза — DevOps-инженер все держит под контролем! Поэтому спрос на этих специалистов всего лишь за 2 года вырос на 70%

Хочешь освоить по-настоящему востребованную профессию? Образовательная платформа GeekBrains открывает набор на Факультет DevOps

Даже если вы никогда не работали в IT, вы получите востребованную и высокооплачиваемую специальность. Сможете использовать методологии Agile и Scrum, оптимизировать CI/CD и работать с облачными технологиями.

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

Первый платеж за обучение можно совершить через 6 месяцев. Скорее регистрируйтесь, ведь сейчас на курс действует скидка 35% → https://gb.ru/link/p_7ItX
Пришло время подвести итоги конкурса на лучший контент #proglib_contest. Искренне благодарим всех, кто принял активное участие, без вашей поддержки конкурс бы не получился.

Победителем канала Библиотека джависта становится автор поста — барабанная дробь 🥁https://yangx.top/javaproglib/2513.

Победитель определен по количеству лайков под постом среди других конкурсных сообщений. За победный пост автор получает 20 000 ₽. В ближайшее время мы свяжемся с победителем и отправим приз — оставайтесь на связи.

Спасибо, что читаете нас!
Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс PushbackInputStream представляет механизм «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации.

У класса есть дополнительный метод unread().
Вакансия: Java – разработчик, middle – senior
Компания: #Usetech
Локация: офисы Москва, Ростов-на-Дону, Барнаул, Томск или удаленная работа.
ЗП: от 200 до 300 K NET
Контакты: [email protected]
@SofiaGardash

Откликнуться

C 2006 года Usetech осуществляет полный спектр работ в области заказной разработки ПО для своих Заказчиков в отраслях: ритейл, финансы, телеком, ИТ и государственном секторе.

На протяжении последних лет компания активно участвует в создании цифровой экосистемы страны. Нашими прорывными решениями пользуются миллионы людей по всему миру, а мировые тренды находят отражение в разработанном нами ПО (Ml, Al, Blockchain, Big Data, нейросети, роботизированные сервисы и многое другое).

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

Задачи:
• Выполнение технической декомпозиции задач;
• Оценка трудозатрат по тикетам;
• Наставничество новых / начинающих разработчиков в команде;
• Реализация и ревью ключевой функциональности в системе;
• Участие в планировании и высокоуровневой оценке новых фич;
• Документирование своего кода, участие в разработке технических документов для сопровождения и сдачи системы;
• Разработка системы, построенную на микросервисной архитектуре;
• Разработка новых сервисов, рефакторинг и развитие существующих;
• Доработка существующую функциональность;
• Работать в команде по методологии Scrum.

Мы ожидаем:
• Высшее техническое образование;
• Опыт разработки 3-хзвенных приложений от 5 лет;
• Отличное знание и опыт программирования на языке Java (JavaSE 8-11, Spring);
• Умение и опыт планирования, декомпозиции, распределения и контроля работ разработки и развертывания ППО;
• Умение и опыт проектирования программного обеспечения;
• Хорошее знание и опыт работы со средствами сборки;
• Знание и опыт работы: со средствами непрерывной интеграции, с системой отслеживания ошибок, юнит-тестирования и оценки покрытия тестами, использования технологий интеграции приложений;
• Глубокие знания и опыт коммерческой работы со Spring Framework, JDBC, Spring JDBC Templates/MyBatis;
• Отличные знания SQL: оптимизация запросов, проектирование модели данных для соответствия требованиям по производительности.

Мы предлагаем:
• Работу в стабильной и активно развивающейся IT-компании, где нет бюрократии, и все сотрудники знают друг друга в лицо;
• Интересные и сложные проектные задачи на основе современного стека технологий;
• Социальный пакет (полис медицинского страхования (ДМС), оплата обучения);
• Регулярные внутренние семинары, посвященные новым технологиям и самым актуальным темам в области разработки, аналитики и тестирования;
• Прозрачная система профессионального роста, ежегодный пересмотр заработной платы в сторону увеличения.
• Гибкое начало рабочего дня (старт работы с 08.00 – 12.00);
• Свободный стиль одежды.
#вопросы_с_собеседований
Для чего в стримах предназначен метод sorted()?
Метод sorted() является промежуточной операцией, которая позволяет сортировать значения либо в натуральном порядке, либо задавая Comparator.

Порядок элементов в исходной коллекции остается нетронутым - sorted() всего лишь создает его отсортированное представление.
Data Structures and Algorithms in Java (2014)
Авторы: Michael T. Goodrich, Roberto Tamassia, Michael H. Goldwasser
Количество страниц: 720

Разработка и анализ эффективных структур данных уже давно признаны ключевыми компонентами учебной программы по информатике. Подход Гудрича, Томассии и Голдвассера к этой классической теме основан на объектно-ориентированной парадигме проектирования структур данных. Для каждой абстракции, представленной в тексте, авторы реализуют соответствующий интерфейс на Java. Конкретные структуры данных предоставляются как классы Java, реализующие интерфейсы. Код на Java, реализующий основные структуры данных в этой книге, организован в один пакет net.datastructures. Этот пакет формирует согласованную библиотеку структур данных и алгоритмов на языке Java, специально разработанную для образовательных целей и дополняющую Java Collections Framework.

Скачать книгу
Чем отличается ReentrantLock от обычного Lock?

Lock – это интерфейс, ReentrantLock – его реализация. «Reentrant» говорит о том, что один и тот же поток может перезахватывать уже захваченный лок. Интерфейс не требует этого свойства. Обычный блок synchronized тоже является reentrant – вложенная синхронизация на том же мониторе отработает без проблем.

Примеры не-reentrant локов из стандартной библиотеки – представления класса StampedLock, возвращаемые его методами asReadLock() и asWriteLock().
#вопросы_с_собеседований
Какие подклассы класса OutputStream вы знаете, для чего они предназначены?
#вакансия #Java #JS #Javascript #удаленка #Luxoft

Вакансия: Senior/Tech Lead Full Stack (Java+JS)
Формат работы: Remote
З/п: 380 000 – 480 000 руб

Работа в международной IT-компании Luxoft в проекте по созданию абсолютно нового современного веб портала клиентского кабинета для инвестиционного брокера.

Обязанности:
• разработка масштабируемого архитектурного решения и согласование её с заказчиком
• управление командой разработки
• реализация работающего прототипа и полноценного решения
• контроль качества разработанного решения

Требования:
• Опыт разработки архитектуры web приложений
• Java, Spring 5+ years
• TypeScript, React and/or Angular 3+ years
• Database: MySQL, PostgreSQL
• Понимание, как создавать интеграцию между приложениями
• Понимание, как создавать CI / CD с нуля
• Знание SQL, Kafka, XML, XSD, Json, FIX
• Английский язык не ниже уровня b2 (intermediate)

Условия:
• Официальное трудоустройство
• Расширенный социальный пакет
• Профессиональное обучение
• Корпоративные скидки
• Гибкий график работы
• Возможность удаленной работы
• Участие в конференциях, митапах и подкастах
• Корпоративные мероприятия

Подробности и контакты:
телеграм @anyameschanova, почта [email protected], сайт
☕️ OutputStream - это абстрактный класс, определяющий потоковый байтовый вывод;
☕️ BufferedOutputStream - буферизированный выходной поток;
☕️ ByteArrayOutputStream - все данные, посылаемые в этот поток, размещаются в предварительно созданном буфере;
☕️ DataOutputStream - выходной поток байт, включающий методы для записи стандартных типов данных Java;
☕️ FileOutputStream - запись данных в файл на физическом носителе;
☕️ FilterOutputStream - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства;
☕️ PrintStream - выходной поток, включающий методы print() и println();
☕️ ObjectOutputStream - выходной поток для записи объектов;
☕️ PipedOutputStream реализует понятие выходного канала.