Начать курс «Алгоритмы и структуры данных» с вводной части можно уже сегодня бесплатно
Курс для разработчиков, которые хотят подготовиться к собеседованию в технологическую компанию или продвинуться по карьерной лестнице.
НАЧАТЬ С ДЕМО-ДОСТУПА
▪️ бессрочный доступ
▪️ 47 видеолекций
▪️ 150 практических заданий
▪️ бессрочная поддержка в чате студентов
▪️развернутая обратная связь по всем домашним заданиям
🔹Подробная программа – https://proglib.io/w/5af3212b
Переходите, оставляйте заявку на пробную версию и знакомьтесь с самым харизматичным спикером – Степаном Мацкевичем. Он определенно получил приз зрительских симпатий от наших студентов🥰
Курс для разработчиков, которые хотят подготовиться к собеседованию в технологическую компанию или продвинуться по карьерной лестнице.
НАЧАТЬ С ДЕМО-ДОСТУПА
▪️ бессрочный доступ
▪️ 47 видеолекций
▪️ 150 практических заданий
▪️ бессрочная поддержка в чате студентов
▪️развернутая обратная связь по всем домашним заданиям
🔹Подробная программа – https://proglib.io/w/5af3212b
Переходите, оставляйте заявку на пробную версию и знакомьтесь с самым харизматичным спикером – Степаном Мацкевичем. Он определенно получил приз зрительских симпатий от наших студентов🥰
Queue
Queue — это интерфейс в Java Collections Framework, который представляет собой коллекцию элементов, организованных в соответствии с принципом FIFO (First In, First Out). Это означает, что элементы добавляются в конец очереди и извлекаются из начала очереди.
Queue используется в ситуациях, когда необходимо управлять порядком обработки элементов.
В этом примере мы создаем очередь строк и добавляем в нее три элемента. Затем мы извлекаем элементы из очереди с помощью метода poll(), который возвращает и удаляет элемент из начала очереди. Элементы извлекаются в том же порядке, в каком и добавляются.
#код
Queue — это интерфейс в Java Collections Framework, который представляет собой коллекцию элементов, организованных в соответствии с принципом FIFO (First In, First Out). Это означает, что элементы добавляются в конец очереди и извлекаются из начала очереди.
Queue используется в ситуациях, когда необходимо управлять порядком обработки элементов.
В этом примере мы создаем очередь строк и добавляем в нее три элемента. Затем мы извлекаем элементы из очереди с помощью метода poll(), который возвращает и удаляет элемент из начала очереди. Элементы извлекаются в том же порядке, в каком и добавляются.
#код
Очередной #дайджест по Java:
☕ Добавление отзывов с фотографиями в S3 с помощью AWS SDK Java
Добавление отзывов пользователями с возможностью прикрепить фотографии, загрузить их в облако и получить ссылку файл из S3, а именно Yandex Object Storage, используя AWS SDK Java.
☕ OOM: direct memory при работе с сетью TCP/IP через NIO в Java
Об опыте увеличения производительности сетевого стэка и проблемах, с которыми можно столкнуться при использовании NIO в Java.
☕ Решаем задачу о секретном рукопожатии на Java
Интересная задача на знание Map и работу с пользовательским вводом, а также двоичное счисление.
☕ Продвинутый телеграмм бот на Java (Spring, postgres и free deploy)
Гайд по созданию полноценного бота с привязкой к базе данных.
☕ Добавление отзывов с фотографиями в S3 с помощью AWS SDK Java
Добавление отзывов пользователями с возможностью прикрепить фотографии, загрузить их в облако и получить ссылку файл из S3, а именно Yandex Object Storage, используя AWS SDK Java.
☕ OOM: direct memory при работе с сетью TCP/IP через NIO в Java
Об опыте увеличения производительности сетевого стэка и проблемах, с которыми можно столкнуться при использовании NIO в Java.
☕ Решаем задачу о секретном рукопожатии на Java
Интересная задача на знание Map и работу с пользовательским вводом, а также двоичное счисление.
☕ Продвинутый телеграмм бот на Java (Spring, postgres и free deploy)
Гайд по созданию полноценного бота с привязкой к базе данных.
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().
#код