Автоматический toString() в Record
Пример:
Если писать это же через класс, получится больше кода:
И в том и в другом случае мы получаем объект для хранения данных:
Но есть отличие
У
В обычном классе дефолтный
Пример:
Вывод:
То есть у record
👉 Java Portal
record
сравнительно новая фича в Java, которая позволяет описывать сущности без явного объявления полей и написания геттеров/сеттеров.Пример:
record User(String name, int age, String city) { }
Если писать это же через класс, получится больше кода:
class User {
public String name;
public int age;
public String city;
public User(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
}
И в том и в другом случае мы получаем объект для хранения данных:
new User("Nick", 20, "New York");
Но есть отличие
У
record
метод toString()
генерируется автоматически и выводит имена и значения всех полей в удобном формате.В обычном классе дефолтный
toString()
возвращает имя класса и хэш объекта.Пример:
record User(String name, int age, String city) { }
class SecondUser {
public String name;
public int age;
public String city;
public SecondUser(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
}
public static void main(String[] args) throws Exception {
User firstUser = new User("Nick", 20, "New York");
SecondUser secondUser = new SecondUser("Charley", 25, "New York");
System.out.println(firstUser);
System.out.println(secondUser);
}
Вывод:
User[name=Nick, age=20, city=New York]
org.example.SecondUser@68de145
То есть у record
toString()
сразу готов, а для обычного класса придётся переопределять вручную.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Ресурс для разработчиков, чтобы создавать изометрические диаграммы своей инфраструктуры или софта.
Open-source: https://github.com/stan-smith/FossFLOW
👉 Java Portal
Open-source: https://github.com/stan-smith/FossFLOW
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍3
Java Off-Heap Memory с DirectByteBuffer
Большинство Java-разработчиков работают только с объектами в куче JVM, управляемой Garbage Collector.
Но в системах с высокими требованиями к производительности — базах данных, игровых движках или messaging-системах — Java может использовать off-heap memory (память вне кучи JVM) через
Преимущества
- снижение пауз GC
- ускорение I/O операций
- возможность работать с большими наборами данных без раздувания кучи
👉 Java Portal
Большинство Java-разработчиков работают только с объектами в куче JVM, управляемой Garbage Collector.
Но в системах с высокими требованиями к производительности — базах данных, игровых движках или messaging-системах — Java может использовать off-heap memory (память вне кучи JVM) через
DirectByteBuffer
Преимущества
- снижение пауз GC
- ускорение I/O операций
- возможность работать с большими наборами данных без раздувания кучи
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Репозиторий kdn251/interviews на GitHub — это реально крутой ресурс, собранный Кевином Нонтоном
interviews был создан, чтобы прокачать подготовку к техсобесам, собрав в одном месте алгоритмы, структуры данных, статьи и ссылки на полезные материалы
Если давно хотел подтянуться в алгоритмах и кодинге для интервью, начни с этого репозитория
Там найдёшь задачи, видео, объяснения, ссылки на LeetCode и много практики😁
👉 Java Portal
interviews был создан, чтобы прокачать подготовку к техсобесам, собрав в одном месте алгоритмы, структуры данных, статьи и ссылки на полезные материалы
Если давно хотел подтянуться в алгоритмах и кодинге для интервью, начни с этого репозитория
Там найдёшь задачи, видео, объяснения, ссылки на LeetCode и много практики
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2❤1
Советы по работе с Spring Boot Scheduler
Пул потоков
По умолчанию все задачи выполняются в одном потоке, и длинный job может блокировать остальные.
Чтобы запускать задачи параллельно, увеличь пул:
Теперь одновременно могут работать до 4 задач.
Быстрая проверка
Во время разработки ставь короткие интервалы и добавляй логи, чтобы видеть, когда реально запускается job:
Частые ошибки
- забыли
- неверный
- долгие задачи блокируют другие (решается увеличением пула или оптимизацией кода)
Выбираем стратегию
Совет: выноси настройки во внешние properties и используй пул потоков для стабильной работы.
👉 Java Portal
Пул потоков
По умолчанию все задачи выполняются в одном потоке, и длинный job может блокировать остальные.
Чтобы запускать задачи параллельно, увеличь пул:
spring.task.scheduling.pool.size=4
Теперь одновременно могут работать до 4 задач.
Быстрая проверка
Во время разработки ставь короткие интервалы и добавляй логи, чтобы видеть, когда реально запускается job:
log.info("Job ran at {}", Instant.now());
Частые ошибки
- забыли
@EnableScheduling
→ задачи не запустятся- неверный
timezone
в cron
- долгие задачи блокируют другие (решается увеличением пула или оптимизацией кода)
Выбираем стратегию
fixedRate
→ с фиксированными интерваламиfixedDelay
→ ждёт после выполненияcron
→ точные даты и времяСовет: выноси настройки во внешние properties и используй пул потоков для стабильной работы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3
Первая статья из серии, где показывается как примеры AI-агентов из популярных Python-фреймворков можно переписать на Java и сделать гораздо лучше с помощью Embabel
Сегодняшняя цель CrewAI — читать
👉 Java Portal
Сегодняшняя цель CrewAI — читать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🌭3🤣3😁1🤯1
Интеграция ChatGPT в Java
С ростом интереса к нейросетям всё больше приложений начинают использовать ИИ в своей бизнес-логике. Встраивание ChatGPT может быть реализовано по-разному
1. Пользователь вводит текст, приложение отправляет его в ChatGPT и возвращает ответ
2. Ввод отправляется в ChatGPT для дополнения или расширения и сохраняется в базу
3. ChatGPT используется как помощник для следующих действий пользователя
Механика всегда одна и та же: отправляется HTTP-запрос к API, на который приходит HTTP-ответ. Браузер делает это напрямую, Java-код делает то же самое с любым HTTP-клиентом —
Отличие в том, что запросы из приложения должны содержать ваш API-ключ. Его передают в заголовке
Как подготовить проект
1. Зарегистрироваться на platform.openai.com, сгенерировать API Key в разделе API Keys
2. Подключить зависимости. Например, OkHttp для запросов и org.json для разбора ответа
Пример простого клиента
Что тут происходит
> создаём HTTP-клиент
> формируем JSON с сообщением
> добавляем заголовки и ключ
> отправляем POST-запрос на API
> парсим JSON-ответ и выводим текст
Таким образом, интеграция ChatGPT в Java-приложение сводится к обычной работе с HTTP API: собрать запрос, добавить ключ и обработать результат.
👉 Java Portal
С ростом интереса к нейросетям всё больше приложений начинают использовать ИИ в своей бизнес-логике. Встраивание ChatGPT может быть реализовано по-разному
1. Пользователь вводит текст, приложение отправляет его в ChatGPT и возвращает ответ
2. Ввод отправляется в ChatGPT для дополнения или расширения и сохраняется в базу
3. ChatGPT используется как помощник для следующих действий пользователя
Механика всегда одна и та же: отправляется HTTP-запрос к API, на который приходит HTTP-ответ. Браузер делает это напрямую, Java-код делает то же самое с любым HTTP-клиентом —
RestTemplate, WebClient, HttpClient, OkHttp
и т дОтличие в том, что запросы из приложения должны содержать ваш API-ключ. Его передают в заголовке
Authorization
Как подготовить проект
1. Зарегистрироваться на platform.openai.com, сгенерировать API Key в разделе API Keys
2. Подключить зависимости. Например, OkHttp для запросов и org.json для разбора ответа
<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20240303</version>
</dependency>
</dependencies>
Пример простого клиента
import okhttp3.*;
import org.json.JSONObject;
public class ChatGPTClient {
private static final String API_KEY = "your-api-key-here";
private static final String API_URL = "https://api.openai.com/v1/chat/completions";
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
JSONObject message = new JSONObject()
.put("role", "user")
.put("content", "Привет! Объясни, как работает JVM");
JSONObject body = new JSONObject()
.put("model", "gpt-3.5-turbo")
.put("messages", new org.json.JSONArray().put(message));
Request request = new Request.Builder()
.url(API_URL)
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.post(RequestBody.create(body.toString(), MediaType.get("application/json")))
.build();
try (Response response = client.newCall(request).execute()) {
JSONObject json = new JSONObject(response.body().string());
String reply = json.getJSONArray("choices")
.getJSONObject(0)
.getJSONObject("message")
.getString("content");
System.out.println("ChatGPT ответ: " + reply);
}
}
}
Что тут происходит
> создаём HTTP-клиент
> формируем JSON с сообщением
> добавляем заголовки и ключ
> отправляем POST-запрос на API
> парсим JSON-ответ и выводим текст
Таким образом, интеграция ChatGPT в Java-приложение сводится к обычной работе с HTTP API: собрать запрос, добавить ключ и обработать результат.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🤯2
7 шаблонов проектирования, которые должен знать каждый разработчик
Осознаёте вы это или нет, но большинство этих шаблонов вы уже используете.
Шаблоны проектирования — это переиспользуемые решения типовых задач в программировании. Они служат шаблонами, которые можно применять в разных языках и на разных платформах.
В 1994 году четверо разработчиков, известные как Gang of Four (Банда четырёх), написали книгу, где описали 23 шаблона проектирования. Эта книга стала классикой, и описанные в ней подходы актуальны до сих пор.
Шаблоны делятся на три группы:
🟢 Порождающие — управляют созданием объектов с гибкостью.
🟣 Структурные — помогают организовать объекты в более крупные структуры.
🟡 Поведенческие — определяют, как объекты взаимодействуют друг с другом.
Вот 7 ключевых шаблонов, которые стоит знать:
Знание этих шаблонов помогает писать более поддерживаемый код и делает проекты понятнее для других разработчиков.
Но важно помнить: не злоупотребляйте ими. Подходящий шаблон в нужной ситуации — это сила. Но если применять их там, где они не нужны, это только усложнит систему.
👉 Java Portal
Осознаёте вы это или нет, но большинство этих шаблонов вы уже используете.
Шаблоны проектирования — это переиспользуемые решения типовых задач в программировании. Они служат шаблонами, которые можно применять в разных языках и на разных платформах.
В 1994 году четверо разработчиков, известные как Gang of Four (Банда четырёх), написали книгу, где описали 23 шаблона проектирования. Эта книга стала классикой, и описанные в ней подходы актуальны до сих пор.
Шаблоны делятся на три группы:
Вот 7 ключевых шаблонов, которые стоит знать:
Singleton — гарантирует, что будет только один экземпляр класса.
Builder — пошагово конструирует сложные объекты.
Factory — создаёт объекты без указания точного класса.
Facade — упрощает работу со сложной системой через единый интерфейс.
Adapter — позволяет работать вместе несовместимым интерфейсам.
Strategy — позволяет динамически подменять алгоритмы.
Observer — поддерживает зависимость между объектами (реакция на события).
Знание этих шаблонов помогает писать более поддерживаемый код и делает проекты понятнее для других разработчиков.
Но важно помнить: не злоупотребляйте ими. Подходящий шаблон в нужной ситуации — это сила. Но если применять их там, где они не нужны, это только усложнит систему.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3
Spring Boot с AOP:
Spring Boot позволяет использовать аспектно-ориентированное программирование , чтобы вынести сквозную логику (например, логирование, безопасность или кеширование) отдельно от бизнес-логики.
Можно даже создавать свои аннотации, которые автоматически навешивают нужное поведение, сохраняя код чистым и декларативным
1. Создаётся аннотация
Её можно навесить на любой метод, чтобы включить замер времени выполнения.
2. Аспект
- Перехватывает вызов методов с аннотацией
- Сохраняет время старта → выполняет метод → считает разницу → выводит результат в лог.
3. Контроллер
- Метод hello() помечен
- При каждом запросе на /hello метод будет логироваться с замером времени.
AOP здесь убирает дублирование логики измерения времени.
Вместо того чтобы вставлять
👉 Java Portal
Spring Boot позволяет использовать аспектно-ориентированное программирование , чтобы вынести сквозную логику (например, логирование, безопасность или кеширование) отдельно от бизнес-логики.
Можно даже создавать свои аннотации, которые автоматически навешивают нужное поведение, сохраняя код чистым и декларативным
1. Создаётся аннотация
@LogExecutionTime
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {}
Её можно навесить на любой метод, чтобы включить замер времени выполнения.
2. Аспект
LoggingAspect
@Aspect
@Component
public class LoggingAspect {
@Around("@annotation(LogExecutionTime)")
public Object logExecution(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed(); // выполнить метод
long timeTaken = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " executed in " + timeTaken + " ms");
return result;
}
}
- Перехватывает вызов методов с аннотацией
@LogExecutionTime
- Сохраняет время старта → выполняет метод → считает разницу → выводит результат в лог.
3. Контроллер
TestController
@RestController
public class TestController {
@GetMapping("/hello")
@LogExecutionTime
public String hello() throws InterruptedException {
Thread.sleep(500); // имитация работы
return "Hello, World!";
}
}
- Метод hello() помечен
@LogExecutionTime
- При каждом запросе на /hello метод будет логироваться с замером времени.
AOP здесь убирает дублирование логики измерения времени.
Вместо того чтобы вставлять
System.currentTimeMillis()
в каждый метод, всё вынесено в один аспект.Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤2
JavaCV
Это Java-обёртка к OpenCV, FFmpeg и другим нативным библиотекам через JavaCPP Presets. Позволяет делать компьютерное зрение и обработку видео и аудио на JVM.
Умеет делать захват с камеры и из файлов, декодирование и кодирование, обработка изображений, интеграция с библиотеками вроде OpenCV, FFmpeg, Tesseract, librealsense и др. Работает на Windows, macOS, Linux и Android.
Пакет есть в Maven Central. Готовые бинари подтянутся автоматически.
Примеры кода есть в репозитории с демо
Домашняя страница проекта с деталями про JavaCPP и пресеты
👉 Java Portal
Это Java-обёртка к OpenCV, FFmpeg и другим нативным библиотекам через JavaCPP Presets. Позволяет делать компьютерное зрение и обработку видео и аудио на JVM.
Умеет делать захват с камеры и из файлов, декодирование и кодирование, обработка изображений, интеграция с библиотеками вроде OpenCV, FFmpeg, Tesseract, librealsense и др. Работает на Windows, macOS, Linux и Android.
Пакет есть в Maven Central. Готовые бинари подтянутся автоматически.
Примеры кода есть в репозитории с демо
Домашняя страница проекта с деталями про JavaCPP и пресеты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Boolean-функции в Java Stream API
При работе со Stream API часто нужно проверить, подходят ли элементы под какое-то условие. Для этого есть методы, которые возвращают true или false.
Основные такие методы:
1.
Возвращает true, если в потоке есть хотя бы один элемент, который проходит проверку.
2.
Возвращает true, если все элементы удовлетворяют условию.
3.
Даёт true, если в потоке нет ни одного элемента, соответствующего условию.
👉 Java Portal
При работе со Stream API часто нужно проверить, подходят ли элементы под какое-то условие. Для этого есть методы, которые возвращают true или false.
Основные такие методы:
1.
anyMatch(Predicate)
Возвращает true, если в потоке есть хотя бы один элемент, который проходит проверку.
List<String> names = List.of("Alice", "Bob", "Anna");
boolean hasShortName = names.stream()
.anyMatch(name -> name.length() < 4);
// → true (подходит "Bob")
2.
allMatch(Predicate)
Возвращает true, если все элементы удовлетворяют условию.
List<String> names = List.of("Alice", "Bob", "Anna");
boolean allStartWithA = names.stream()
.allMatch(name -> name.startsWith("A"));
// → false
3.
noneMatch(Predicate)
Даёт true, если в потоке нет ни одного элемента, соответствующего условию.
List<String> names = List.of("Alice", "Bob", "Anna");
boolean noneEmpty = names.stream()
.noneMatch(String::isEmpty);
// → true
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤2🔥2
Java Portal | Программирование
Первая статья из серии, где показывается как примеры AI-агентов из популярных Python-фреймворков можно переписать на Java и сделать гораздо лучше с помощью Embabel Сегодняшняя цель CrewAI — читать 👉 Java Portal
Второй пост в блоге показывает, как примеры AI-агентов из популярных Python-фреймворков можно переписать на Java и сделать лучше с помощью Embabel.
Сегодня в фокусе: Pydantic AI — читать
👉 Java Portal
Сегодня в фокусе: Pydantic AI — читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3
image_2025-08-22_08-09-28.png
587.6 KB
Наткнулся на такой пост от сеньора, про предварительные условия для System Design:
👉 Java Portal
1. Понимание цели
Разберись, что именно ты строишь, кто будет пользоваться и для чего это нужно.
2. Профиль трафика (read-heavy vs write-heavy)
Если система в основном читает (много пользователей просматривают данные), делай упор на кэширование, индексацию, реплики для чтения. Пример: каталог Netflix, карточки товаров Amazon.
Если в основном пишут (много аплоадов, входящих данных), подойдут очереди, пакетная запись, eventual consistency. Пример: сообщения WhatsApp, данные IoT-датчиков.
3. Консистентность vs доступность
Строгая консистентность нужна там, где ошибка недопустима (банки, бронирование).
Eventual consistency подходит там, где можно жить с устаревшими данными (Instagram, аналитика).
4. Требования к задержке
Реалтайм — оптимизация под низкую задержку через кэш или предвычисления. Примеры: гейминг, Zoom, подтверждение платежей.
Асинхронно — очередь и фоновые воркеры. Примеры: e-mail рассылка, генерация отчётов.
5. Масштабируемость
Закладывай рост ×10. Пример: Google Docs начинался маленьким, но сейчас обрабатывает миллионы правок одновременно. Uber — тысячи поездок в минуту. Используй stateless-сервисы и горизонтальное масштабирование.
6. Паттерны доступа
Оптимизируй под то, какие данные и как часто читаются: поиск по гео/локации (geo-hash + ElasticSearch), быстрый доступ к часто используемым ID (Redis/Memcached).
7. Рост данных и партиционирование
Продумывай шардинг заранее (по пользователю, времени, гео). Пример: комментарии YouTube шардуются по ID видео.
Холодные данные сжимай или архивируй (Gmail, Google Drive).
8. Обработка отказов
Используй ретраи, фоллбэки, circuit breakers.
Если API падает по таймауту → повтор + настройка таймаута (пример: Amazon payment retry).
Если кэш недоступен → фоллбэк в БД (пример: Reddit загружает комментарии из БД).
9. Безопасность и авторизация
Авторизация: OAuth / JWT (пример: логин через Google или Spotify).
Защита от абузов и ботов: rate limiting, CAPTCHA (пример: Gmail signup, формы).
10. Нужно ли писать всё самому?
Некритичные фичи лучше вынести в SaaS или сторонние API:
Платежи — Stripe, PayPal.
Хранение медиа — Cloudinary, S3.
Уведомления — Firebase, SendGrid.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1😁1
Какие языки программирования самые «зелёные»?
Обычно при выборе языка мы смотрим на синтаксис, производительность или простоту обучения.
Но несколько лет назад группа португальских исследователей изучила энергопотребление 27 популярных языков программирования, измеряя время выполнения, энергозатраты и пиковое использование памяти.
Результаты показали компромиссы: быстрый код не всегда самый энергоэффективный, а работа с памятью сильно влияет на энергопотребление. Эти выводы могут помочь инженерам при выборе языка, когда важна энергоэффективность.
Выводы исследования:
Cи оказался самым энергоэффективным языком.
Python и Perl — наименее экологичные языки программирования.
Источник: читать
👉 Java Portal
Обычно при выборе языка мы смотрим на синтаксис, производительность или простоту обучения.
Но несколько лет назад группа португальских исследователей изучила энергопотребление 27 популярных языков программирования, измеряя время выполнения, энергозатраты и пиковое использование памяти.
Результаты показали компромиссы: быстрый код не всегда самый энергоэффективный, а работа с памятью сильно влияет на энергопотребление. Эти выводы могут помочь инженерам при выборе языка, когда важна энергоэффективность.
Выводы исследования:
Cи оказался самым энергоэффективным языком.
Python и Perl — наименее экологичные языки программирования.
Источник: читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👀4😁3🏆2🤯1
Как Java передаёт объекты по сети или сохраняет их для последующего использования?
Для этого есть сериализация. Она преобразует объект в набор байтов, чтобы его можно было передать или сохранить. Обратная операция — десериализация, которая восстанавливает объект из этих байтов.
Каждый класс, поддерживающий
Что будет, если класс изменился после того, как некоторые объекты уже были сериализованы?
- Добавлено поле → старые объекты работают, новое поле получает значение по умолчанию (0, null, false).
- Удалено поле → старые данные для него игнорируются.
- Изменён тип поля → ломается.
- Изменён UID → ломается.
Если UID не определить явно, JVM сгенерирует его автоматически на основе деталей класса (поля, методы, модификаторы). Даже небольшое изменение, например переименование поля, изменит UID и сделает старые данные несовместимыми.
Рекомендую всегда задавать
👉 Java Portal
Для этого есть сериализация. Она преобразует объект в набор байтов, чтобы его можно было передать или сохранить. Обратная операция — десериализация, которая восстанавливает объект из этих байтов.
Каждый класс, поддерживающий
Serializable
, имеет serialVersionUID
. Это идентификатор версии. При десериализации Java проверяет, совпадает ли UID в данных с тем, что в классе. Если совпадает — объект принимается. Если нет — выбрасывается InvalidClassException
.Что будет, если класс изменился после того, как некоторые объекты уже были сериализованы?
- Добавлено поле → старые объекты работают, новое поле получает значение по умолчанию (0, null, false).
- Удалено поле → старые данные для него игнорируются.
- Изменён тип поля → ломается.
- Изменён UID → ломается.
Если UID не определить явно, JVM сгенерирует его автоматически на основе деталей класса (поля, методы, модификаторы). Даже небольшое изменение, например переименование поля, изменит UID и сделает старые данные несовместимыми.
Рекомендую всегда задавать
serialVersionUID
вручную. Это даёт контроль над совместимостью и избавляет от неожиданных ошибок.Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤4🔥4
Как вам эта джавовская мудрость:
- Используй
- Не создавай потоки вручную - - используй
- Всегда закрывай JDBC-ресурсы - - иначе база останется без коннекшенов.
- Не глотай checked-исключения - - хотя бы логируй их.
- Не игнорируй
- Не используй
- Кэшируй
- Дженерики защищают тебя на этапе компиляции - - не убивай их, приводя к
👉 Java Portal
- Используй
enum
, а не строковые константы - - компилятор сам поймает ошибки.- Не создавай потоки вручную - - используй
executors
.- Всегда закрывай JDBC-ресурсы - - иначе база останется без коннекшенов.
- Не глотай checked-исключения - - хотя бы логируй их.
- Не игнорируй
InterruptedException
- - это ломает координацию потоков.- Не используй
SimpleDateFormat
в многопоточном коде - - он не потокобезопасен.- Кэшируй
prepared
statements
- - парсить SQL каждый раз слишком дорого.- Дженерики защищают тебя на этапе компиляции - - не убивай их, приводя к
Object
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥1💊1
Большинство Java-разработчиков форматируют числа вручную. Но в Java есть форматтеры с поддержкой локали, которые подстраиваются автоматически.
Одно и то же значение будет выглядеть по-разному в зависимости от региона.
В США это будет 12,000.75.
Во Франции — 12 000,75.
В Индии используется группировка по лакхам и крор.
В России — 12 000,75.
А в компактном формате то же самое число станет 12K на английском или 12 हज़ार на хинди.
И всё это доступно из коробки. Вместо того чтобы изобретать велосипед, можно просто использовать стандартные API Java.
👉 Java Portal
Одно и то же значение будет выглядеть по-разному в зависимости от региона.
В США это будет 12,000.75.
Во Франции — 12 000,75.
В Индии используется группировка по лакхам и крор.
В России — 12 000,75.
А в компактном формате то же самое число станет 12K на английском или 12 हज़ार на хинди.
И всё это доступно из коробки. Вместо того чтобы изобретать велосипед, можно просто использовать стандартные API Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Вышла неплохая статья про Big O
Big O помогает разобраться, как ведут себя алгоритмы, и показывает, где можно выжать кратный прирост производительности даже с мелкими правками в коде.
В статье есть наглядные визуализации, интерактив и простые объяснения.
👉 Java Portal
Big O помогает разобраться, как ведут себя алгоритмы, и показывает, где можно выжать кратный прирост производительности даже с мелкими правками в коде.
В статье есть наглядные визуализации, интерактив и простые объяснения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3❤1
Вот задача для собеседования по Java
У вас есть два потока.
Поток 1 печатает нечётные числа.
Поток 2 печатает чётные числа.
Как их синхронизировать так, чтобы вывод всегда шёл по порядку:
1 2 3 4 5…
Звучит просто, но заставляет внимательно подумать о координации потоков.
Ответ
Самый аккуратный способ это использовать семафоры.
Семафор управляет набором разрешений (токенов). Поток, вызывающий
Мы создаём два семафора: один для нечётных, другой для чётных.
Семафор для нечётных изначально имеет 1 разрешение, чтобы первый поток мог стартовать, а для чётных — 0, чтобы он ждал. После того как нечётный поток печатает число, он делает
Такое чередование гарантирует точную последовательность 1 2 3 4 … без активного ожидания, без
👉 Java Portal
У вас есть два потока.
Поток 1 печатает нечётные числа.
Поток 2 печатает чётные числа.
Как их синхронизировать так, чтобы вывод всегда шёл по порядку:
1 2 3 4 5…
Звучит просто, но заставляет внимательно подумать о координации потоков.
Ответ
Самый аккуратный способ это использовать семафоры.
Семафор управляет набором разрешений (токенов). Поток, вызывающий
acquire
, забирает разрешение, и если его нет — ждёт. Поток, вызывающий release
, возвращает разрешение, чем будит ожидающий поток.Мы создаём два семафора: один для нечётных, другой для чётных.
Семафор для нечётных изначально имеет 1 разрешение, чтобы первый поток мог стартовать, а для чётных — 0, чтобы он ждал. После того как нечётный поток печатает число, он делает
release
для чётного. Чётный поток делает acquire
, печатает, и отдаёт разрешение обратно нечётному.Такое чередование гарантирует точную последовательность 1 2 3 4 … без активного ожидания, без
sleep
и без гонок.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍8👀4❤2🏆2
В этой статье рассказывается, как внутри работает новый профайлер по CPU-времени в Java, включая обработку сигналов, устройство очередей и асинхронное сэмплирование. Подробный разбор основных компонентов, скрытых за кулисами.
Подробнее читайте здесь
После узнайте о том, как в новом CPU-тайм профайлере Java 25 устроена очередь для запросов на сэмплинг: зачем она нужна, почему её размер критичен для баланса между потерей сэмплов и расходом памяти, и по каким правилам JVM выбирает этот размер в зависимости от интервала сэмплинга.
Подробнее: читать
👉 Java Portal
Подробнее читайте здесь
После узнайте о том, как в новом CPU-тайм профайлере Java 25 устроена очередь для запросов на сэмплинг: зачем она нужна, почему её размер критичен для баланса между потерей сэмплов и расходом памяти, и по каким правилам JVM выбирает этот размер в зависимости от интервала сэмплинга.
Подробнее: читать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Задумывались, почему оператор
Дело в механизме, который называется Integer Caching.
JVM кэширует объекты Integer в диапазоне от -128 до 127. Когда вы присваиваете значение в этом диапазоне, Java переиспользует один и тот же объект из кэша. Поэтому две переменные с одинаковым числом в этом диапазоне указывают на одну и ту же ссылку, и
Но за пределами диапазона, например для 128 или 1000, каждый раз создается новый объект. Ссылки разные, поэтому
Главное, что стоит запомнить:
Этот трюк с кэшированием также работает для Byte, Short, Character (до 127) и Long (от -128 до 127)
👉 Java Portal
==
в Java работает для одних значений Integer, а для других — нет?Дело в механизме, который называется Integer Caching.
JVM кэширует объекты Integer в диапазоне от -128 до 127. Когда вы присваиваете значение в этом диапазоне, Java переиспользует один и тот же объект из кэша. Поэтому две переменные с одинаковым числом в этом диапазоне указывают на одну и ту же ссылку, и
==
возвращает true
Но за пределами диапазона, например для 128 или 1000, каждый раз создается новый объект. Ссылки разные, поэтому
==
вернет false
, даже если значения совпадают.Главное, что стоит запомнить:
==
сравнивает ссылки на объекты, а не сами значения. Чтобы сравнить числа, всегда используйте .equals()
Этот трюк с кэшированием также работает для Byte, Short, Character (до 127) и Long (от -128 до 127)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3🤯3❤1🌭1