В каких случаях разумно использовать массив, а не ArrayList?
Использование обычных массивов вместо ArrayList имеет смысл в следующих ситуациях:
— Нужен предсказуемый и строгий контроль размера массива. Массивы имеют фиксированный размер, в отличие от ArrayList.
— Требуется максимальная производительность при работе с примитивными типами данных (int, double и т. д.). Доступ к элементам массива быстрее, чем в ArrayList.
— Нужно создать структуру данных, которая должна быть неизменяемой.
— Требуется тесная интеграция с существующим кодом на основе обычных массивов. Переход на ArrayList может потребовать значительный рефакторинг.
— Не нужны динамические функции ArrayList, такие как автоматическое изменение размера, методы вставки/удаления и т. д.
— Ограничения на использование дополнительной памяти. Массивы компактнее ArrayList за счет фиксированного размера.
#вопросы_с_собеседований
Использование обычных массивов вместо ArrayList имеет смысл в следующих ситуациях:
— Нужен предсказуемый и строгий контроль размера массива. Массивы имеют фиксированный размер, в отличие от ArrayList.
— Требуется максимальная производительность при работе с примитивными типами данных (int, double и т. д.). Доступ к элементам массива быстрее, чем в ArrayList.
— Нужно создать структуру данных, которая должна быть неизменяемой.
— Требуется тесная интеграция с существующим кодом на основе обычных массивов. Переход на ArrayList может потребовать значительный рефакторинг.
— Не нужны динамические функции ArrayList, такие как автоматическое изменение размера, методы вставки/удаления и т. д.
— Ограничения на использование дополнительной памяти. Массивы компактнее ArrayList за счет фиксированного размера.
#вопросы_с_собеседований
Зубчатый массив в Java
Зубчатый массив (BitSet) — это специальная структура данных для эффективного хранения и манипулирования наборами битов.
Представляет собой массив битов, который увеличивается динамически по мере добавления элементов. Занимает меньше памяти, чем обычные структуры данных для хранения булевых значений.
Позволяет выполнять операции над битами: установка, сброс, инверсия, логические операции.
Зубчатый массив полезен при решении задач: поиск в множествах, хранение состояний и флагов, оптимизация расхода памяти и в целом при необходимости эффективно хранить и манипулировать большим количеством булевых значений.
#код
Зубчатый массив (BitSet) — это специальная структура данных для эффективного хранения и манипулирования наборами битов.
Представляет собой массив битов, который увеличивается динамически по мере добавления элементов. Занимает меньше памяти, чем обычные структуры данных для хранения булевых значений.
Позволяет выполнять операции над битами: установка, сброс, инверсия, логические операции.
Зубчатый массив полезен при решении задач: поиск в множествах, хранение состояний и флагов, оптимизация расхода памяти и в целом при необходимости эффективно хранить и манипулировать большим количеством булевых значений.
#код
Вышла Java 21
Вышла общедоступная версия Java 21. В этот релиз попало около 2500 закрытых задач и 15 JEP'ов. Release Notes можно посмотреть здесь. Изменения API – здесь.
Java 21 является LTS-релизом, а значит у него будут выходить обновления как минимум 5 лет с момента выхода.
Подробный обзор по ссылке.
Вышла общедоступная версия Java 21. В этот релиз попало около 2500 закрытых задач и 15 JEP'ов. Release Notes можно посмотреть здесь. Изменения API – здесь.
Java 21 является LTS-релизом, а значит у него будут выходить обновления как минимум 5 лет с момента выхода.
Подробный обзор по ссылке.
Что вы считаете самой большой своей неудачей за всю карьеру?
#интерактив
#интерактив
Начать курс «Алгоритмы и структуры данных» с вводной части можно уже сегодня бесплатно
Курс для разработчиков, которые хотят подготовиться к собеседованию в технологическую компанию или продвинуться по карьерной лестнице.
НАЧАТЬ С ДЕМО-ДОСТУПА
▪️ бессрочный доступ
▪️ 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) компиляцией, то это руководство — именно то, что вы искали.
Смотреть статью