Media is too big
VIEW IN TELEGRAM
Модель памяти Java процесса
Рассуждаем о Java Memory Model и Garbage Collection'е.
Визуализируем память Java приложения.
Смотрим на красочный VisualGC.
Всё ради того, чтобы разобраться как работает JVM с памятью.
0:00 - Введение
0:39 - Тестовое приложение
1:34 - VisualVM
3:25 - Структура памяти
8:54 - Tenure Threshold
10:12 - Что ещё есть в VisualGC plugin?
12:24 - Завершение
👉 @BookJava
Рассуждаем о Java Memory Model и Garbage Collection'е.
Визуализируем память Java приложения.
Смотрим на красочный VisualGC.
Всё ради того, чтобы разобраться как работает JVM с памятью.
0:00 - Введение
0:39 - Тестовое приложение
1:34 - VisualVM
3:25 - Структура памяти
8:54 - Tenure Threshold
10:12 - Что ещё есть в VisualGC plugin?
12:24 - Завершение
👉 @BookJava
👍5
Зачем нужна Java Serialization? Как сделать класс сериализуемым?
Сериализация – это сохранение типа и состояния объекта в бинарном виде для последующего сохранения/передачи и десериализации. Для сериализации используется интерфейс
Класс сериализуем, если:
🔘 Реализует маркерный интерфейс
🔘 Все поля сериализуемые или помечены модификатором
Протокол стандартной сериализации описан в документации.
Сериализационная форма может, и в некоторых случаях для корректной работы должна быть кастомизирована. Правильная форма содержит только логическое представление данных, без деталей о физической реализации.
Для описания полей сериализационной формы в javadoc-документации используется тэг
Нестатические внутренние классы не должны быть сериализуемыми. Статические поля как поля класса а не инстанса несериализуемы.
Сериализации посвящен целый раздел Effective Java. Доклад для ознакомления с темой.
#Сериализация
Сериализация – это сохранение типа и состояния объекта в бинарном виде для последующего сохранения/передачи и десериализации. Для сериализации используется интерфейс
Serializable
(Externalizable
), и цель записи/источник чтения ObjectInputStream
/ObjectOutputStream
(ObjectInput
/ObjectOutput
).Класс сериализуем, если:
🔘 Реализует маркерный интерфейс
Serializable
;🔘 Все поля сериализуемые или помечены модификатором
transient
(иначе рантайм выбросит NotSerializableException
).Протокол стандартной сериализации описан в документации.
Сериализационная форма может, и в некоторых случаях для корректной работы должна быть кастомизирована. Правильная форма содержит только логическое представление данных, без деталей о физической реализации.
Для описания полей сериализационной формы в javadoc-документации используется тэг
@serial
. Для документации генерирующего нестандартную сериализационную форму метода используется @serialData
. Эти тэги имеют смысл и для приватных членов, так как эффективно такие члены – часть публичного API.Нестатические внутренние классы не должны быть сериализуемыми. Статические поля как поля класса а не инстанса несериализуемы.
Сериализации посвящен целый раздел Effective Java. Доклад для ознакомления с темой.
#Сериализация
👍4
Введение в Java Process Memory Model
Каждое Java приложение, после запуска, создаёт десятки, сотни, тысячи объектов в памяти компьютера на котором оно запущено. Память, при этом, ресурс не бесконечный, и поэтому необходимо использовать его эффективно. Виртуальная Машина Java (Java Virtual Machine, далее JVM) умеет граммотно распоряжаться памятью и помогает нам, разработчикам, управляя ею автоматически.
О том, как именно JVM работает с памятью во время работы Java приложения мы поговорим в этой статье.
👉 @BookJava
Каждое Java приложение, после запуска, создаёт десятки, сотни, тысячи объектов в памяти компьютера на котором оно запущено. Память, при этом, ресурс не бесконечный, и поэтому необходимо использовать его эффективно. Виртуальная Машина Java (Java Virtual Machine, далее JVM) умеет граммотно распоряжаться памятью и помогает нам, разработчикам, управляя ею автоматически.
О том, как именно JVM работает с памятью во время работы Java приложения мы поговорим в этой статье.
👉 @BookJava
👍8
Руководство по Java 8 Optional
В этом учебном пособии мы рассмотрим класс Optional, который был представлен в Java 8.
Цель класса — предоставить решение на уровне типа для представления опциональных значений вместо null (нулевых) ссылок.
Для более глубокого понимания того, почему мы должны обратить внимание на класс Optional, ознакомьтесь с официальной статьей Oracle.
В этом учебном пособии мы рассмотрим класс Optional, который был представлен в Java 8.
Цель класса — предоставить решение на уровне типа для представления опциональных значений вместо null (нулевых) ссылок.
Для более глубокого понимания того, почему мы должны обратить внимание на класс Optional, ознакомьтесь с официальной статьей Oracle.
👍2👎1
Зачем используется Serial Version UID? Что если не определить его?
Сериализуемый класс явно или неявно, но всегда имеет
Для совпадающих версий работает мощная поддержка эволюции класса – совместимые изменения, такие как добавление или удаление полей, не приводят к
Неявное значение вычисляется автоматически в рантайме, и включает в себя информацию о имени типа, списке родителей и полей (с точностью до коллизии). По смыслу это похоже на хэш-сумму класса. Соответственно, при любом изменении класса значение изменится, и поддержка эволюции окажется бесполезной.
Всегда лучше явно указывать любое значение
Явное значение устанавливается в переменную
#Сериализация
Сериализуемый класс явно или неявно, но всегда имеет
serialVersionUID
. Это число типа long
, которое представляет собой «версию» сериализационной формы класса. Если при сериализации/десериализации значения serialVersionUID
не совпадают – будет выброшено InvalidClassException
.Для совпадающих версий работает мощная поддержка эволюции класса – совместимые изменения, такие как добавление или удаление полей, не приводят к
InvalidClassException
. Неявное значение вычисляется автоматически в рантайме, и включает в себя информацию о имени типа, списке родителей и полей (с точностью до коллизии). По смыслу это похоже на хэш-сумму класса. Соответственно, при любом изменении класса значение изменится, и поддержка эволюции окажется бесполезной.
Всегда лучше явно указывать любое значение
serialVersionUID
, и изменять только в тех редких случаях, когда требуется сломать совместимость с предыдущими версиями. Стандартная утилита JDK serialver
умеет «угадывать» авто-генерированное значение. Она используется чтобы зафиксировать значение для включения поддержки эволюции созданного ранее класса.Явное значение устанавливается в переменную
static final long serialVersionUID
.#Сериализация
👍5
Какими методами настраивается сериализация?
Интерфейс
Методы
Для подмены объекта при записи добавляется симметричный метод
Интерфейс
#Сериализация
Интерфейс
Serializable
пуст, но есть ряд методов, добавив которые в сериализуемый класс можно добиться изменения этапов процесса сериализации и десериализации.readObjectNoData()
используется для инициализации класса-родителя, который при сериализации оригинального объекта еще не был родителем. Подробное объяснение. readObject(ObjectInputStream s)
переопределяет стандартную десериализацию.Методы
readObject*
похожи на конструктор. Как и конструктор, они подвержены проблеме виртуального вызова. Как и конструктор, они используются для поддержания инвариантов класса (только для случая десериализации).writeObject(ObjectOutputStream s)
используется для записи собственной сериализационной формы.Object readResolve()
может использоваться для реализации какого-либо порождающего паттерна при десериализации. Даже при его использовании объект сначала будет десериализован, поэтому рекомендуется вместе с этим методом помечать все поля transient
. Видимость этого метода для наследника определяет, будет ли наследник вызывать его.Для подмены объекта при записи добавляется симметричный метод
Object writeReplace()
.Интерфейс
Externalizable
дает инструмент полной подмены реализации сериализации. Рассмотрим его в следующих постах.#Сериализация
👍3
Одна из многих причина нежелания идти учиться на курсы по разработке — отсутствие гарантий, что деньги за курс не будут выброшены на ветер.
В Kata Academy эти гарантии предоставляют.
В договоре с Kata четко прописано, что вам не нужно платить за обучение до тех пор, пока вы не устроитесь на работу в IT. То есть во время обучения вы ничего не платите.
Также в договоре указывается, что Kata гарантирует минимальную зарплату от 100 тысяч рублей в месяц.
Если вы вдруг не смогли устроиться на работу, то за обучение платить не нужно. Связано это с тем, что цель Kata — ваше трудоустройство разработчиком, а если вам не удалось, значит на курсе вас не смогли подготовить должным образом.
Записывайтесь на курс и получайте тестовое задание: https://clck.ru/hN2AE
Если не уверены в своих силах — не переживайте, Kata дадут неплохой FAQ, который поможет с выполнением тестового!
В Kata Academy эти гарантии предоставляют.
В договоре с Kata четко прописано, что вам не нужно платить за обучение до тех пор, пока вы не устроитесь на работу в IT. То есть во время обучения вы ничего не платите.
Также в договоре указывается, что Kata гарантирует минимальную зарплату от 100 тысяч рублей в месяц.
Если вы вдруг не смогли устроиться на работу, то за обучение платить не нужно. Связано это с тем, что цель Kata — ваше трудоустройство разработчиком, а если вам не удалось, значит на курсе вас не смогли подготовить должным образом.
Записывайтесь на курс и получайте тестовое задание: https://clck.ru/hN2AE
Если не уверены в своих силах — не переживайте, Kata дадут неплохой FAQ, который поможет с выполнением тестового!
🤮4👍3👎1
Как сериализация работает с наследованием?
Когда
При сериализации несериализуемые предки просто игнорируются.
Если класс несериализуемый и не предоставляет достаточного доступа к своему логическому состоянию для наследников, правильно реализовать его наследника сериализуемым может быть невозможно.
Популярный вопрос на тему – как когда сериализуешь объект класса-наследника, избежать сериализации его родительской части. Единственный способ добиться этого – кастомизировать сериализационную форму, определив собственную реализацию
Открытость класса для наследования делает неприменимым паттерн serialization proxy (который рассмотрим позднее).
#Сериализация
Когда
Serializable
класс имеет цепочку родителей, пока эти родители тоже Serializable
, десериализация объекта идет от родителя к наследнику, в обход конструктора. Вместо него вызываются методы readObject
(readObjectNoData
). Но как только встречается первый предок, не реализующий интерфейс Serializable
, инициализация для него возвращается в нормальное русло – вместо readObject
вызывается конструктор без аргументов. Если такого конструктора нет, или он объявлен private
, исполнение выбросит InvalidClassException
.При сериализации несериализуемые предки просто игнорируются.
Если класс несериализуемый и не предоставляет достаточного доступа к своему логическому состоянию для наследников, правильно реализовать его наследника сериализуемым может быть невозможно.
Популярный вопрос на тему – как когда сериализуешь объект класса-наследника, избежать сериализации его родительской части. Единственный способ добиться этого – кастомизировать сериализационную форму, определив собственную реализацию
writeObject()
, либо используя интерфейс Externalizable
.Открытость класса для наследования делает неприменимым паттерн serialization proxy (который рассмотрим позднее).
#Сериализация
👍7
Полезные потоки Java
В этой статье мы рассмотрим несколько полезных способов использования потоков Java для работы с различными данными.
https://theoneamin.medium.com/useful-java-streams-d48266effe59
👉 @BookJava
В этой статье мы рассмотрим несколько полезных способов использования потоков Java для работы с различными данными.
https://theoneamin.medium.com/useful-java-streams-d48266effe59
👉 @BookJava
👍4
Подборка каналов для IT специалистов 🎯
Системное администрирование 📌
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 Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Excel лайфхак📌
https://t.me/Excel_lifehack
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real 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 Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/java_360 Книги по Java Rus
https://t.me/python_360 Книги по Python Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Системное администрирование 📌
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 Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Excel лайфхак📌
https://t.me/Excel_lifehack
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real 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 Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/java_360 Книги по Java Rus
https://t.me/python_360 Книги по Python Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
👍1
В чем разница между Serializable и Externalizable?
При записи
Интерфейс
Этот интерфейс позволяет реализовать полностью свой механизм сериализации, стандартно запишется только идентификатор класса. Никакой автоматической работы с классом-родителем также не предусмотрено. Методы
Подробнее читайте в соответствующем вопросе на stackoverflow.
#Сериализация
При записи
Serializable
класса весь контроль над сериализацией достается JVM. С помощью определения специальных методов можно кастомизировать его части. Метод readObject
при этом обычно начинается с вызова стандартной части сериализации – ObjectInputStream.defaultReadObject()
.Интерфейс
Externalizable
расширяет Serializable
и добавляет методы записи и чтения writeExternal
и readExternal
. Входной и выходной потоки-аргументы в них представлены более абстрактно чем в специальных методах – интерфейсами ObjectInput
и ObjectOutput
.Этот интерфейс позволяет реализовать полностью свой механизм сериализации, стандартно запишется только идентификатор класса. Никакой автоматической работы с классом-родителем также не предусмотрено. Методы
readObject
и writeObject
игнорируются. Ключевое слово transient
эффекта на Externalizable
не имеет.Externalizable
объект в отличие от Serializable
десерализуется не в обход конструктора, так что должен иметь конструктор без аргументов. Подробнее читайте в соответствующем вопросе на stackoverflow.
#Сериализация
👍8
Каждому второму техническому специалисту в стартапе не хватает менеджерских навыков.
Как прокачать свои способности в области IT?
Присоединяйтесь к программе повышения квалификации для СТО от School of C!
За 3 месяца онлайн обучения вы:
— разберете несколько реальных кейсов вместе с основателями стартапов и получите персонализированный фидбек
— усовершенствуете свои лидерские и менеджерские навыки
— узнаете всю внутреннюю кухню стартапов и бизнесов: что нужно и когда нужно делать в различных ситуациях
Успейте подать заявку и получите доступ к стартап-экосистеме Starta VC!
➡️ПОДАТЬ ЗАЯВКУ⬅️
Как прокачать свои способности в области IT?
Присоединяйтесь к программе повышения квалификации для СТО от School of C!
За 3 месяца онлайн обучения вы:
— разберете несколько реальных кейсов вместе с основателями стартапов и получите персонализированный фидбек
— усовершенствуете свои лидерские и менеджерские навыки
— узнаете всю внутреннюю кухню стартапов и бизнесов: что нужно и когда нужно делать в различных ситуациях
Успейте подать заявку и получите доступ к стартап-экосистеме Starta VC!
➡️ПОДАТЬ ЗАЯВКУ⬅️
Что такое serialization proxy?
Serialization proxy (посредник сериализации) – это паттерн, который дает простой способ определить собственную сериализационную форму.
1. Внутри целевого класса объявляется вложенный класс-посредник;
2. В посреднике объявляются поля, описывающие логическую структуру объекта (собственно, сериализационную форму);
3. Добавляется конструктор посредника, принимающий экземпляр оригинального класса и инициализирующий все эти поля;
4. Оба класса помечаются интерфейсом
5. В методе
6. Симметричные действия совершаются для чтения – в классе-посреднике реализуется метод
7. В основном классе добавляется
Пример кода реализации.
#Сериализация
Serialization proxy (посредник сериализации) – это паттерн, который дает простой способ определить собственную сериализационную форму.
1. Внутри целевого класса объявляется вложенный класс-посредник;
2. В посреднике объявляются поля, описывающие логическую структуру объекта (собственно, сериализационную форму);
3. Добавляется конструктор посредника, принимающий экземпляр оригинального класса и инициализирующий все эти поля;
4. Оба класса помечаются интерфейсом
Serializable
;5. В методе
writeReplace
оригинального класса инстанциируется и возвращается прокси от this
;6. Симметричные действия совершаются для чтения – в классе-посреднике реализуется метод
readResolve
;7. В основном классе добавляется
readObject
, который выбрасывает исключение – это защитит от чтения без прокси.Пример кода реализации.
#Сериализация
👍2
Forwarded from Академия Кода
Как создать рандомную строку в java?
Как вариант используйте StringBuilder и цикл чтобы создать рандомную строку в Java, ниже пример кода как пример.
#java
Подписывайтесь на канал 👉@coddy_academy
Как вариант используйте 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
👍8
Назовите проблемы стандартной сериализации.
Стандартная сериализация Java при всей своей гибкости обладает рядом проблем.
Дефолтная сериализация фактически добавляет все приватные поля в экспортируемый интерфейс, и ограничивает будущую гибкость реализации. От этого спасает serialization proxy.
Десериализация работает как скрытый конструктор, мимо настоящего, который обеспечивает консистентность состояния. Не сработают даже инициализаторы: поле, определенное как
Сериализация усложняет тестирование – между разными версиями класса должна соблюдаться семантическая совместимость. Эта проблема актуальна для любой реализации персистентного хранения объектов.
Неаккуратно определенная десериализация создает дыры в безопасности. Например, сериализация объекта со слишком глубоким графом объектов-полей может привести к
Встроенная реализация сериализует все классы одинаково хорошо. Естественно, за универсальность нужно платить, и для каждого частного случая производительность не идеальна и может быть улучшена частной реализацией.
#Сериализация
Стандартная сериализация Java при всей своей гибкости обладает рядом проблем.
Дефолтная сериализация фактически добавляет все приватные поля в экспортируемый интерфейс, и ограничивает будущую гибкость реализации. От этого спасает serialization proxy.
Десериализация работает как скрытый конструктор, мимо настоящего, который обеспечивает консистентность состояния. Не сработают даже инициализаторы: поле, определенное как
int foo=42
, после десериализации будет хранить значение 0
.Сериализация усложняет тестирование – между разными версиями класса должна соблюдаться семантическая совместимость. Эта проблема актуальна для любой реализации персистентного хранения объектов.
Неаккуратно определенная десериализация создает дыры в безопасности. Например, сериализация объекта со слишком глубоким графом объектов-полей может привести к
StackOverflowError
. Злоумышленник положит вашу систему, подставив такой искусственный объект. Для защиты от различных уязвимостей в Java 8 добавлен механизм сериализационного фильтрования.Встроенная реализация сериализует все классы одинаково хорошо. Естественно, за универсальность нужно платить, и для каждого частного случая производительность не идеальна и может быть улучшена частной реализацией.
#Сериализация
👍5
Вам нужно обновить или купить новые компьютеры или их комплектующие для офиса?
Хотите, чтобы покупка была выгодной и удобной?
Сейчас в Ситилинк проходит акция «Идеальный ПК» специально для юридических лиц
До конца июня при заказе комплектующих на сайте Ситилинк вы получаете:
• 100% скидку на сборку заказанных машин
• до 3% бонусов на вашу клубную карту клиента
Переходи по ссылке ниже и соберите свой идеальный ПК https://clck.ru/pe3zN
Хотите, чтобы покупка была выгодной и удобной?
Сейчас в Ситилинк проходит акция «Идеальный ПК» специально для юридических лиц
До конца июня при заказе комплектующих на сайте Ситилинк вы получаете:
• 100% скидку на сборку заказанных машин
• до 3% бонусов на вашу клубную карту клиента
Переходи по ссылке ниже и соберите свой идеальный ПК https://clck.ru/pe3zN
👍1
Forwarded from Книги по Java | Books Java 📚
Классические задачи Computer Science на языке Java
Копец Дэвид (2021)
Cтолкнулись с «неразрешимой» проблемой при разработке программного обеспечения? Скорее всего, кто-то уже справился с этой задачей, и вы можете не ломать голову. Дэвид Копец собрал наиболее полезные готовые решения, принципы и алгоритмы. «Классические задачи Computer Science на языке Java» — это мастер-класс по программированию, содержащий 55 практических примеров, затрагивающих самые актуальные темы: базовые алгоритмы, ограничения, искусственный интеллект и многое другое.
В этой книге:
- Рекурсия, мемоизация и битовые манипуляции.
- Поисковые, графовые и генетические алгоритмы.
- Проблемы ограничений.
- Кластеризация методом k-среднего, нейронные сети и состязательный поиск.
Скачать
👉 @java_360
Копец Дэвид (2021)
Cтолкнулись с «неразрешимой» проблемой при разработке программного обеспечения? Скорее всего, кто-то уже справился с этой задачей, и вы можете не ломать голову. Дэвид Копец собрал наиболее полезные готовые решения, принципы и алгоритмы. «Классические задачи Computer Science на языке Java» — это мастер-класс по программированию, содержащий 55 практических примеров, затрагивающих самые актуальные темы: базовые алгоритмы, ограничения, искусственный интеллект и многое другое.
В этой книге:
- Рекурсия, мемоизация и битовые манипуляции.
- Поисковые, графовые и генетические алгоритмы.
- Проблемы ограничений.
- Кластеризация методом k-среднего, нейронные сети и состязательный поиск.
Скачать
👉 @java_360
👍4
Ты Java программист и устал серфить интернет в поисках вакансий? Тяжело найти ту самую работу, которая будет соответствовать и отвечать требованиям твоего уровня?
Java Job - канал, который поможет решить эти вопросы
На канале ты найдешь:
• свежие и актуальные вакансии, с достойными зарплатами и условиями труда
• стажировки, бесплатные курсы, работа для джунов, мидлов и сеньеров по всему миру
• примеры вопросов с собеседований, интересные задачи и обучающий материал для повышения скилла
Подписывайся на наш канал, цени свое время!
Java Job - канал, который поможет решить эти вопросы
На канале ты найдешь:
• свежие и актуальные вакансии, с достойными зарплатами и условиями труда
• стажировки, бесплатные курсы, работа для джунов, мидлов и сеньеров по всему миру
• примеры вопросов с собеседований, интересные задачи и обучающий материал для повышения скилла
Подписывайся на наш канал, цени свое время!
👍1
Чем анонимный внутренний класс отличается от лямбды?
Лямбда-выражение имеет более легковесный синтаксис. Не нужно явно указывать тип функционального интерфейса, который лямбда реализует – он автоматически выведется из контекста. Лямбда-выражения добавлены в язык в первую очередь как синтаксический сахар.
С другой стороны, у класса есть поля. Экземпляр анонимного класса сохраняет свое состояние между вызовами, и меняет его при необходимости. Для лямбды доступен лишь захват и effectively final использование внешних переменных.
Лямбдой реализуется только функциональный интерфейс. Функциональный интерфейс – это тип с единственным абстрактным методом. Анонимным классом же можно расширить любой расширяемый класс или реализовать интерфейс с любым количеством абстрактных методов.
Анонимный класс создает новый скоуп, лямбда работает в текущем. Это значит, что объявление переменной с именем, которое уже используется снаружи, в лямбде вызовет ошибку компиляции «variable is already defined», в анонимном классе скроет (shadowing) внешнюю переменную.
С точки зрения реализации JVM, для лямбды не создается дополнительного .class файла, как это происходит для анонимного класса. Соответственно, не происходит и обычной загрузки и верификации класса. Вместо этого используется механизм
Лямбда-выражение имеет более легковесный синтаксис. Не нужно явно указывать тип функционального интерфейса, который лямбда реализует – он автоматически выведется из контекста. Лямбда-выражения добавлены в язык в первую очередь как синтаксический сахар.
С другой стороны, у класса есть поля. Экземпляр анонимного класса сохраняет свое состояние между вызовами, и меняет его при необходимости. Для лямбды доступен лишь захват и effectively final использование внешних переменных.
Лямбдой реализуется только функциональный интерфейс. Функциональный интерфейс – это тип с единственным абстрактным методом. Анонимным классом же можно расширить любой расширяемый класс или реализовать интерфейс с любым количеством абстрактных методов.
Анонимный класс создает новый скоуп, лямбда работает в текущем. Это значит, что объявление переменной с именем, которое уже используется снаружи, в лямбде вызовет ошибку компиляции «variable is already defined», в анонимном классе скроет (shadowing) внешнюю переменную.
С точки зрения реализации JVM, для лямбды не создается дополнительного .class файла, как это происходит для анонимного класса. Соответственно, не происходит и обычной загрузки и верификации класса. Вместо этого используется механизм
invokedynamic
и класс генерируется на лету с помощью LambdaMetafactory
. Так что лямбда-выражения обычно работают быстрее. Внутренности реализации подробно разобраны например в этой статье.👍10
Сегодня паттерн Посетитель в Java уже не нужен – лучше использовать переключатели паттернов
В современном языке Java паттерн Посетитель (Visitor) уже не нужен. Он отлично компенсируется использованием запечатанных типов и переключателей, использующих сопоставление с шаблоном – в таком случае те же цели достигаются проще и меньшим объемом кода. Далее
В современном языке Java паттерн Посетитель (Visitor) уже не нужен. Он отлично компенсируется использованием запечатанных типов и переключателей, использующих сопоставление с шаблоном – в таком случае те же цели достигаются проще и меньшим объемом кода. Далее
👍3👎1