Frame
Frame — это класс, представляющий окно приложения без каких-либо элементов управления.
Фрейм используется для создания простых GUI приложений.
При запуске этого кода отобразится пустое окно приложения с заголовком "My Frame" размером 300x200 пикселей, расположенное по центру экрана. При закрытии окна приложение завершит работу.
#код
Frame — это класс, представляющий окно приложения без каких-либо элементов управления.
Фрейм используется для создания простых GUI приложений.
При запуске этого кода отобразится пустое окно приложения с заголовком "My Frame" размером 300x200 пикселей, расположенное по центру экрана. При закрытии окна приложение завершит работу.
#код
Observability в Spring Boot 3
Отдел Observability Spring уже довольно долго работает над поддержкой наблюдаемости в Spring-приложениях, и мы рады сообщить вам, что в Spring Framework 6 и Spring Boot 3 вы наконец-то увидите результаты этой работы!
Читать статью
Отдел Observability Spring уже довольно долго работает над поддержкой наблюдаемости в Spring-приложениях, и мы рады сообщить вам, что в Spring Framework 6 и Spring Boot 3 вы наконец-то увидите результаты этой работы!
Читать статью
Phaser
Phaser используется для синхронизации потоков.
Он позволяет группе потоков дожидаться друг друга в определенной точке выполнения программы перед тем, как продолжить работу.
В этом примере создаётся объект Phaser и инициализируется значением 1 (основной поток). Далее создаются два потока Worker, которые регистрируются в phaser при создании.
Каждый поток имитирует некоторую работу, а по завершении вызывает метод arriveAndAwaitAdvance() — это сообщает phaser о том, что поток закончил работу и останавливает его до тех пор, пока не завершатся все зарегистрированные потоки.
После завершения обоих потоков управление возвращается в основной поток, который также вызывает arriveAndAwaitAdvance(). Этот вызов разблокирует Worker-потоки и программа завершается, выведя "All threads finished".
#код
Phaser используется для синхронизации потоков.
Он позволяет группе потоков дожидаться друг друга в определенной точке выполнения программы перед тем, как продолжить работу.
В этом примере создаётся объект Phaser и инициализируется значением 1 (основной поток). Далее создаются два потока Worker, которые регистрируются в phaser при создании.
Каждый поток имитирует некоторую работу, а по завершении вызывает метод arriveAndAwaitAdvance() — это сообщает phaser о том, что поток закончил работу и останавливает его до тех пор, пока не завершатся все зарегистрированные потоки.
После завершения обоих потоков управление возвращается в основной поток, который также вызывает arriveAndAwaitAdvance(). Этот вызов разблокирует Worker-потоки и программа завершается, выведя "All threads finished".
#код
Какие преобразования называются нисходящими и восходящими?
Восходящее преобразование (Upcasting) — это преобразование объекта дочернего класса в объект родительского класса. Преобразование может быть выполнено неявно, так как дочерний класс является подтипом родительского класса. Восходящее преобразование позволяет нам получить доступ к членам родительского класса, но не ко всем членам дочернего класса.
Нисходящее преобразование (Downcasting) — это преобразование объекта родительского класса в объект дочернего класса. Это преобразование не может быть выполнено неявно и требует явного указания типа. Нисходящее преобразование может быть опасным, так как оно может привести к ошибке ClassCastException, если типы не совместимы.
#вопросы_с_собеседований
Восходящее преобразование (Upcasting) — это преобразование объекта дочернего класса в объект родительского класса. Преобразование может быть выполнено неявно, так как дочерний класс является подтипом родительского класса. Восходящее преобразование позволяет нам получить доступ к членам родительского класса, но не ко всем членам дочернего класса.
Нисходящее преобразование (Downcasting) — это преобразование объекта родительского класса в объект дочернего класса. Это преобразование не может быть выполнено неявно и требует явного указания типа. Нисходящее преобразование может быть опасным, так как оно может привести к ошибке ClassCastException, если типы не совместимы.
#вопросы_с_собеседований
🔎💼🗺️ Как программисту искать (и найти) работу за границей в 2023 году
Разбираемся: где искать работу за рубежом, как и где откликаться на вакансии, плюс несколько лайфхаков по составлению резюме.
Читать статью
#поискработы
Разбираемся: где искать работу за рубежом, как и где откликаться на вакансии, плюс несколько лайфхаков по составлению резюме.
Читать статью
#поискработы
PipedOutputStream
PipedOutputStream используется для организации потоковой передачи данных между потоками.
Он работает совместно с PipedInputStream. Один поток записывает данные в PipedOutputStream, а другой считывает их из соответствующего PipedInputStream.
Это позволяет организовать обмен данными между потоками по принципу "производитель-потребитель".
Для связи PipedOutputStream и PipedInputStream нужно использовать метод connect().
Метод write() используется для записи данных, как и в обычных потоках вывода.
PipedOutputStream полезен, когда нужен простой способ организовать обмен данными между потоками в одной программе.
Он часто используется для подключения вывода одного потока к вводу другого.
#код
PipedOutputStream используется для организации потоковой передачи данных между потоками.
Он работает совместно с PipedInputStream. Один поток записывает данные в PipedOutputStream, а другой считывает их из соответствующего PipedInputStream.
Это позволяет организовать обмен данными между потоками по принципу "производитель-потребитель".
Для связи PipedOutputStream и PipedInputStream нужно использовать метод connect().
Метод write() используется для записи данных, как и в обычных потоках вывода.
PipedOutputStream полезен, когда нужен простой способ организовать обмен данными между потоками в одной программе.
Он часто используется для подключения вывода одного потока к вводу другого.
#код
Ключевое слово new
new используется для создания нового экземпляра класса. После ключевого слова new указывается название класса, затем в круглых скобках — параметры конструктора, если они нужны.
При вызове new выделяется память для нового объекта, вызывается конструктор класса для инициализации объекта, и возвращается ссылка на созданный объект.
Ссылка на объект должна быть сохранена в переменной соответствующего класса.
Если new используется внутри класса, то создается новый объект этого класса. А если new используется снаружи класса, то создается объект указанного класса.
#код
new используется для создания нового экземпляра класса. После ключевого слова new указывается название класса, затем в круглых скобках — параметры конструктора, если они нужны.
При вызове new выделяется память для нового объекта, вызывается конструктор класса для инициализации объекта, и возвращается ссылка на созданный объект.
Ссылка на объект должна быть сохранена в переменной соответствующего класса.
Если new используется внутри класса, то создается новый объект этого класса. А если new используется снаружи класса, то создается объект указанного класса.
#код
Очередной #дайджест по Java:
☕ В Java 21 собираются реализовать сопоставление с образцом
Выпуск Java 21 состоялся 19 сентября 2023 года. В этой версии поддерживаются паттерны записи в switch-блоках и выражениях. Такой синтаксис выглядит монументально (как минимум, по меркам Java).
☕ Protobuf или Reflection в JNI
Вы когда-нибудь задумывались, насколько grpc быстрый?
☕ Все плохое в Java хорошо для вас
Автор говорит о философии Java: «Раннюю пташку проглатывает змея».
☕ Почему Lombok все еще присутствует в каждом наборе инструментов Java-разработчика?
Почему Lombok по-прежнему занимает почетное место среди опытных разработчиков на Java.
☕ Как работает память Java?
Это отправная точка для каждого разработчика, который хочет изучить и настроить производительность, чтобы увеличить скорость.
☕ В Java 21 собираются реализовать сопоставление с образцом
Выпуск Java 21 состоялся 19 сентября 2023 года. В этой версии поддерживаются паттерны записи в switch-блоках и выражениях. Такой синтаксис выглядит монументально (как минимум, по меркам Java).
☕ Protobuf или Reflection в JNI
Вы когда-нибудь задумывались, насколько grpc быстрый?
☕ Все плохое в Java хорошо для вас
Автор говорит о философии Java: «Раннюю пташку проглатывает змея».
☕ Почему Lombok все еще присутствует в каждом наборе инструментов Java-разработчика?
Почему Lombok по-прежнему занимает почетное место среди опытных разработчиков на Java.
☕ Как работает память Java?
Это отправная точка для каждого разработчика, который хочет изучить и настроить производительность, чтобы увеличить скорость.
На каком языке вы пишите сейчас и на какой хотели бы перейти?
#интерактив
#интерактив
📊 Как я входил в IT? Результаты опроса «Библиотеки программиста»
Вы когда-нибудь задумывались о том, как входят в IT люди, у которых нет технического образования? Насколько тяжело начать карьеру с чистого листа в зрелом возрасте? Вот и мы решили выяснить это.
Читать статью
Вы когда-нибудь задумывались о том, как входят в IT люди, у которых нет технического образования? Насколько тяжело начать карьеру с чистого листа в зрелом возрасте? Вот и мы решили выяснить это.
Читать статью
Для ArrayList или для LinkedList операция добавления элемента в середину (list.add(list.size()/2, newElement)) медленнее?
Для ArrayList:
• проверка массива на вместимость. Если вместимости недостаточно, то увеличение размера массива и копирование всех элементов в новый массив (O(N));
• копирование всех элементов, расположенных правее от позиции вставки, на одну позицию вправо (O(N));
• вставка элемента (O(1)).
Для LinkedList:
• поиск позиции вставки (O(N));
• вставка элемента (O(1)).
В худшем случае вставка в середину списка эффективнее для LinkedList. В остальных — скорее всего, для ArrayList, поскольку копирование элементов осуществляется за счет вызова быстрого системного метода System.arraycopy().
#вопросы_с_собеседований
Для ArrayList:
• проверка массива на вместимость. Если вместимости недостаточно, то увеличение размера массива и копирование всех элементов в новый массив (O(N));
• копирование всех элементов, расположенных правее от позиции вставки, на одну позицию вправо (O(N));
• вставка элемента (O(1)).
Для LinkedList:
• поиск позиции вставки (O(N));
• вставка элемента (O(1)).
В худшем случае вставка в середину списка эффективнее для LinkedList. В остальных — скорее всего, для ArrayList, поскольку копирование элементов осуществляется за счет вызова быстрого системного метода System.arraycopy().
#вопросы_с_собеседований
ExecutorService
ExecutorService — это API JDK, который упрощает запуск задач в асинхронном режиме. В общем смысле, ExecutorService автоматически предоставляет пул потоков и API для назначения задач.
Лучший вариант использования ExecutorService — это обработка независимых задач, таких как транзакции или запросы по схеме "один поток для одной задачи".
В этом примере создается ExecutorService с помощью фабричного метода Executors.newSingleThreadExecutor(). Затем запускается задача с помощью метода submit(). В конце работы ExecutorService завершается с помощью метода shutdown().
#код
ExecutorService — это API JDK, который упрощает запуск задач в асинхронном режиме. В общем смысле, ExecutorService автоматически предоставляет пул потоков и API для назначения задач.
Лучший вариант использования ExecutorService — это обработка независимых задач, таких как транзакции или запросы по схеме "один поток для одной задачи".
В этом примере создается ExecutorService с помощью фабричного метода Executors.newSingleThreadExecutor(). Затем запускается задача с помощью метода submit(). В конце работы ExecutorService завершается с помощью метода shutdown().
#код
Разбираемся с GraalVM, AOT и JIT
Если вы хотите разобраться, что такое GraalVM, как он работает, и в чем различия между Just-In-Time (JIT) компиляцией и Ahead-Of-Time (AOT) компиляцией, то это руководство — именно то, что вы искали.
Смотреть статью
Если вы хотите разобраться, что такое GraalVM, как он работает, и в чем различия между Just-In-Time (JIT) компиляцией и Ahead-Of-Time (AOT) компиляцией, то это руководство — именно то, что вы искали.
Смотреть статью
Что лучше: ООП или функциональный подход?
#интерактив
#интерактив
PhantomHashMap
PhantomHashMap — это еще одна реализация интерфейса Map, которая использует призрачные ссылки для хранения ключей и значений.
Отличие PhantomHashMap от обычной HashMap заключается в том, что она не хранит реальные значения, а только призрачные ссылки на них.
Как только ссылка на значение становится призрачной, оно может быть удалено сборщиком мусора.
PhantomHashMap чаще всего используется для отслеживания жизненного цикла объектов. Например, чтобы понять, какие объекты все еще используются, а какие можно удалить.
#код
PhantomHashMap — это еще одна реализация интерфейса Map, которая использует призрачные ссылки для хранения ключей и значений.
Отличие PhantomHashMap от обычной HashMap заключается в том, что она не хранит реальные значения, а только призрачные ссылки на них.
Как только ссылка на значение становится призрачной, оно может быть удалено сборщиком мусора.
PhantomHashMap чаще всего используется для отслеживания жизненного цикла объектов. Например, чтобы понять, какие объекты все еще используются, а какие можно удалить.
#код
Очередной #дайджест по Java:
☕ Подтверждение электронной почты с помощью Spring Boot & Angular
О том, как сделать это с использованием Spring Boot и Angular, двух мощных инструментов для создания современных веб-приложений.
☕ jenv — удобный инструмент для управления версиями Java
Иногда может возникнуть необходимость использовать какую-то определенную версию Java для вашего проекта. Решение нашлось в виде использования менеджера версий Java.
☕ Spring Cloud Config и Git. Хранение и распространение конфигураций приложений
Еще одна статья о том, как можно применять Spring Cloud Config Server при выборе Git репозитория как хранилища конфигураций приложений в облаке и не только в облаке.
☕ Аннотации и рефлексия в Java
Аннотации и рефлексия являются ключевыми концепциями в Java, предоставляя разработчикам мощные инструменты для создания более гибких, адаптивных и понятных приложений.
☕ Подтверждение электронной почты с помощью Spring Boot & Angular
О том, как сделать это с использованием Spring Boot и Angular, двух мощных инструментов для создания современных веб-приложений.
☕ jenv — удобный инструмент для управления версиями Java
Иногда может возникнуть необходимость использовать какую-то определенную версию Java для вашего проекта. Решение нашлось в виде использования менеджера версий Java.
☕ Spring Cloud Config и Git. Хранение и распространение конфигураций приложений
Еще одна статья о том, как можно применять Spring Cloud Config Server при выборе Git репозитория как хранилища конфигураций приложений в облаке и не только в облаке.
☕ Аннотации и рефлексия в Java
Аннотации и рефлексия являются ключевыми концепциями в Java, предоставляя разработчикам мощные инструменты для создания более гибких, адаптивных и понятных приложений.
Please open Telegram to view this post
VIEW IN TELEGRAM
Атомарные переменные в Java.util.concurrent
Пакет java.util.concurrent.atomic определяет классы, которые поддерживают атомарные операции над отдельными переменными. Все классы имеют методы get и set, которые работают как чтение и запись волатильных переменных. То есть set имеет отношение happens-before с любым последующим get на той же переменной.
Ниже перечислены все переменные, определенные в пакете: AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference.
В этом примере создается AtomicInteger со значением 0. Затем значение инкрементируется с помощью метода incrementAndGet(). В конце значение получается с помощью метода get().
#код
Пакет java.util.concurrent.atomic определяет классы, которые поддерживают атомарные операции над отдельными переменными. Все классы имеют методы get и set, которые работают как чтение и запись волатильных переменных. То есть set имеет отношение happens-before с любым последующим get на той же переменной.
Ниже перечислены все переменные, определенные в пакете: AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference.
В этом примере создается AtomicInteger со значением 0. Затем значение инкрементируется с помощью метода incrementAndGet(). В конце значение получается с помощью метода get().
#код
Как я делал солнечную зарядку для своего моноколеса и вот что получилось
Получилось так, что с недавнего времени, я обзавелся личным электротранспортом, который называется моноколесо. Долго я шел к этому, но всё же решился и ни о чем не жалею, даже наоборот, испытываю полный восторг от поездок на этом сногсшибательном транспорте. А еще очень люблю поезки на природу, а езда на моноколесе на природу умножают эту любовь на 100500. Но есть одно «НО» и об этом далее...
Читать статью
Получилось так, что с недавнего времени, я обзавелся личным электротранспортом, который называется моноколесо. Долго я шел к этому, но всё же решился и ни о чем не жалею, даже наоборот, испытываю полный восторг от поездок на этом сногсшибательном транспорте. А еще очень люблю поезки на природу, а езда на моноколесе на природу умножают эту любовь на 100500. Но есть одно «НО» и об этом далее...
Читать статью
Понимание и использование Kubernetes Custom Controllers и Custom Resource Definitions с использованием Java
Kubernetes позволяет создавать собственные API-ресурсы и дополнять его функциональность, что особенно полезно при работе со сложными или специфическими для вашей системы задачами. Custom Resource Definitions (CRDs) позволяют определить новые типы ресурсов, а Custom Controllers предоставляют логику управления этими ресурсами.
Давайте представим, что мы хотим внедрить новый тип ресурса в Kubernetes, назовем его CustomApp. Вначале мы должны создать CRD для CustomApp.
Теперь мы можем создать Custom Controller на Java, который будет управлять ресурсами CustomApp. Для этого мы можем использовать библиотеку Fabric8's Kubernetes Client.
В примере CustomAppController использует Fabric8's Kubernetes Client для отслеживания событий, связанных с ресурсами CustomApp. В зависимости от действия, можно реализовать логику для создания, обновления, удаления или других событий, связанных с CustomApp.
#код
Kubernetes позволяет создавать собственные API-ресурсы и дополнять его функциональность, что особенно полезно при работе со сложными или специфическими для вашей системы задачами. Custom Resource Definitions (CRDs) позволяют определить новые типы ресурсов, а Custom Controllers предоставляют логику управления этими ресурсами.
Давайте представим, что мы хотим внедрить новый тип ресурса в Kubernetes, назовем его CustomApp. Вначале мы должны создать CRD для CustomApp.
Теперь мы можем создать Custom Controller на Java, который будет управлять ресурсами CustomApp. Для этого мы можем использовать библиотеку Fabric8's Kubernetes Client.
В примере CustomAppController использует Fabric8's Kubernetes Client для отслеживания событий, связанных с ресурсами CustomApp. В зависимости от действия, можно реализовать логику для создания, обновления, удаления или других событий, связанных с CustomApp.
#код
Как работает сравнение двух строк?
Чтобы сравнить две строки, используется метод equals() класса String. Этот метод сравнивает строки по символам и возвращает логическое значение — true если строки одинаковые, false если строки разные.
Также можно использовать метод compareTo(), который возвращает 0, если строки одинаковые, положительное число, если первая строка больше в лексикографическом порядке, и отрицательное, если вторая строка больше.
#вопросы_с_собеседований
Чтобы сравнить две строки, используется метод equals() класса String. Этот метод сравнивает строки по символам и возвращает логическое значение — true если строки одинаковые, false если строки разные.
Также можно использовать метод compareTo(), который возвращает 0, если строки одинаковые, положительное число, если первая строка больше в лексикографическом порядке, и отрицательное, если вторая строка больше.
#вопросы_с_собеседований