Как стать автором
Поиск
Написать публикацию
Обновить
204.92

Java *

Объектно-ориентированный язык программирования

Сначала показывать
Порог рейтинга

Почему в java нельзя отсортировать массив интов по убыванию?

Недавно решал задачку, предполагавшую сортировку int[] arr по убыванию.
Я пытался это сделать минут 5... Иии не отсортировал.

В джава нет вообще ни единого встроенного механизма сортировки массива примитивов по убыванию и вот почему.

Массивы сортируются с помощью метода Arrays.sort(arr), но сортирует он по возрастанию.
Для сортировки по убыванию нужно передать в него компаратор:

int[] arr = {1, 2, 3};
Arrays.sort(arr, (x, y) -> (y - x));

Не буду вдаваться в подробности работы компаратора, потому что такой код даже не скомпилируется! Компаратор не умеет работать с примитивами, ведь он использует дженерик:

public static <T> void sort(T[] a, Comparator<? super T> c);

А так выглядит sort для инта (и такой же метод есть отдельно для каждого примитива):

public static void sort(int[] a);

Невозможность использования с дженериками — одна из главных особенностей примитивов. Ну и причина, по которой массив интов нельзя отсортировать по убыванию)

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии13

Приглашаем вас на бесплатный вебинар, посвященный работе с Hibernate — самой популярной реализацией ORM-технологии. В рамках семинара поговорим о том, почему почти в каждом проекте используется Hibernate, разберемся какие плюсы и минусы у этой технологии. А также обсудим, почему Hibernate стал синонимом ORM в мире Java.

Содержание вебинара:
• ключевые принципы ORM концепции;
• связь между ООП и реляционной моделью в Hibernate;
• плюсы и минусы Hibernate;
• разработка приложения с использованием Hibernate.

Дата: 05.03.2024
Время: 16:00-17:00 по МСК

Спикер вебинара: Тарасевич Александр — ведущий разработчик с опытом коммерческой разработки на Java более 10 лет.

Регистрация доступна по ссылке.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Некоторые могут помнить, как в комментариях под одной из своих статей на тему Unsafe в Android я писал, что занимаюсь портированием FFM API на эту платформу. Не так давно API окончательно вышло из предварительного доступа и стало полноправной частью JDK 22. Я поймал за хвост вдохновение и с утроенными силами начал писать код и придумывать как перенести непереносимое. Так начались поиски способа рантайм генерации нативного кода под любую из поддерживаемых андроидом архитектур, и он был найден! Выходом стала системная библиотека libLLVM.so, которая умеет делать всё, что мне нужно. Осталось лишь подключить её к java коду без готового линкера. После серии экспериментов и кучи кода родилось это:

На данном скриншоте видно тестовый запуск генерации простенькой функции с выводом полученного машинного кода (он парсится из выходного ELF файла). Я планирую использовать что-то подобное как часть линкера для FFM API.

В общем, работа кипит, и никакие преграды не страшны, если хорошенько постараться. В будущем надеюсь осилить написание цикла статей про нюансы разработки, с которыми пришлось столкнуться.

Если вас заинтересовала тема, за процессом можно следить на github`е проекта

Теги:
Всего голосов 8: ↑8 и ↓0+8
Комментарии0

Проклятие дженериков 💀

Дженерики могут показаться очень простой темой.
Например, вот так в Java выглядят классные и простые методы интерфейса List:

interface List<E> extends Collection<E> {
	boolean add(E e);
	E set(int index, E element);
}

Но у обобщений много нюансов: вложенность, вариантность, границы и т.д. Это сильно усложняет их использование.
Вот не менее классный, но совсем непростой flatMap интерфейса Stream🙈:

interface Stream<T> extends BaseStream<T, Stream<T>> {
	<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
}

Также, реализация дженериков - всегда трейдоф. Мы либо получаем большой исполняемый файл, из-за того, что приходится генерировать код для разных типов. Либо получаем дополнительную нагрузку в рантайме, из-за различных проверок.

Из-за таких сложностей, в языке Go (философия которого - простота и минимализм) дженерики появились аж через 12 лет после релиза языка. А первый коммент про то что нужны дженерики появился меньше чем через 24 часа🙃

Во многих популярных языках дженерики появились не с первой версии, но рано или поздно, разработчики были вынуждены их ввести:

  • С++ вышел в 1979, дженерики - 1986

  • Java - 1996, дженерики - 2004

  • C# - 2001, дженерики - 2005

  • Go - 2009, дженерики - 2021

Теги:
Всего голосов 5: ↑3 и ↓2+1
Комментарии8

Вы Java-программист и ищите возможность оптимизировать разработку? Тогда вебинар "Java-проекты с ChatGPT: от идеи до реализации" будет вам интересен! Узнайте, как создавать, рефакторить и тестировать код с помощью ChatGPT. Вас ждёт практический гайд и знакомство с JAIG – инструментом, упрощающим генерацию кода.

Дата: 21.02.2024
Время: 16:00 по МСК

Спикер вебинара: Игорь Судакевич – сертифицированный Java-разработчик, инструктор Oracle и Udemy, методист c 15-летним опытом, консультант-репетитор.

Теги:
Всего голосов 6: ↑4 и ↓2+2
Комментарии0

Как IT-директору выбрать подрядчика для усиления команды бэкенд-разработки: практический вебинар

Новость для руководителей IT-отделов, техлидов и продукт-оунеров.

Часто внутри компании не хватает компетенций или сотрудников для реализации проектов в срок. В такой ситуации выгодно обратиться за услугами внешних разработчиков для временного усиления команды.

С чего начать поиск подрядчика? Как подготовиться к выводу на проект внешнего разработчика? Как сформулировать требования к программисту и проверить удаленную команду на благонадежность — на эти и другие вопросы ответят руководители компании Programming Store на бесплатном онлайн-вебинаре.

6 февраля, 16:00 МСК

Зарегистрируйтесь, чтобы получить доступ к вебинару и напоминание накануне.

Зарегистрироваться

Длительность — 1 час.

  • 5 критериев готовности команды к работе с внешними разработчиками

  • Как оценить благонадежность подрядчика

  • Кейсы из практики: ритейл, производство, медицина

Спикер — Роман Огородников, руководитель проектов по backend-разработке в Programming Store.

Также вы сможете задать вопросы и получить ответы напрямую от директора компании и руководителя backend-направления Алексея Петухова.

После мероприятия все зарегистрированные участники получат на почту инструкцию с ключевыми тезисами из вебинара для эффективного выбора подрядчика.

Programming Store — центр удаленной разработки на платформах 1С, Python, Java, MS Dynamics 365. Уже 10 лет мы работаем по всей России и за рубежом с компаниями- внедренцами и крупными клиентами

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии0

25 января 2024 года стартовала онлайн-конференция Java Champions 2024. Мероприятие продлится в виртуальной среде до 30 января. Каждый день будет состоять из 7 сессий. Они начнутся в 9:00 EST и закончатся в 17:00 EST. После каждой презентации участникам будет предоставлено время для общения с докладчиками.

Чемпионы Java — это разработчики со всего мира, получившие признание за вклад в сообщество Java. Чемпионы на конференции J Champions делятся своими знаниями с разработчиками. Аудитория проекта — 14 миллионов Java-разработчиков по всему миру.

Теги:
Рейтинг0
Комментарии0

Только что вышли две библиотеки с одним номером:

  • Spring for Apache Kafka 3.1

  • Spring AMQP (Spring for RabbitMQ) 3.1

Как следует из названия, это нативная поддержка Kafka и Rabbit в Spring.

Подробности — в релиз ноутах на GitHub. Здесь по Кафке, здесь по Рэббиту.

По сути, это минорные обновления и апгрейд до актуального Spring Framework 6.1.

Подробности должны быть в следующем дайджесте.

Теги:
Рейтинг0
Комментарии0

Только что вышел Spring Authorization Server 1.2

Это фреймворк, реализующий  OAuth 2.1 and OpenID Connect 1.0 поверх Spring Security.

Подробности — в релиз ноутах на GitHub.
Как им пользоваться написано в документации, но лучше всего изучить конкретные примеры.

Теги:
Рейтинг0
Комментарии0

Java-разработчики, мы вас ждём на One day offer!

Что такое One day offer?
Мероприятие, на котором можно стать частью нашей команды: без лишних собесов, тестовых заданий и бюрократии

Кто может участвовать?
Мы ищем java-разработчиков middle+ и senior уровня. Неважно, в каком городе ты живешь, главное находиться на территории России

Когда и где?
9 ноября в онлайне

Как попасть?

  1. Оставь заявку на участие

  2. Пройди предварительное онлайн-интервью и получи приглашение на ивент

  3. Подключайся на ивент, чтобы познакомиться с проектами поближе, пройти финальное собеседование и получить свой оффер

Узнать подробности и подать заявку по ссылке
❗️Последний день подачи заявки на участие — 7 ноября

Теги:
Всего голосов 7: ↑7 и ↓0+7
Комментарии0

Про Youtube-канал для технарей и подкаст про Java в 2023 году 📺

Привет! Пришло время познакомить вас с каналом Cloud.ru Tech. Здесь беседуем с интересными гостями в формате подкастов, делимся новостями из мира IT-технологий и обсуждаем карьеру в IT.

🎧 Сегодня предлагаем посмотреть подкаст про Java — тема будет интересна как заядлым джавистам, так и Junior-разработчикам. 

Вместе с Петром Хаустовым — тимлидом из команды СБОЛ.про мы обсудили, зачем и как изучать Java в 2023 году, что делать с синдромом самозванца, а также как джавистам проходить собеседования и находить для себя лучшие условия. 

Подписывайтесь на Youtube-канал Cloud.ru Tech, чтобы быть в курсе IT-трендов!

Теги:
Рейтинг0
Комментарии0

Прочитал тут заметку про красоту замыканий и у меня появились смутные сомнения по поводу того, как появилось эта, в разных смыслах, положительных и отрицательных (я не к тому, чтобы встать на какую-то сторону, я за разумное разнообразие), хитрая техника построения кода.

В большинстве языков является естественным распространение области видимости переменных из внешнего блока во все внутренние блоки кода. Приведу пример, чтобы не было сомнений (псевдо-код намеренно нарушает синтаксис известных мне языков, чтобы не быть отнесенным явно к одному из них):

Function(type par)
{//outer block(see“inner block”father)
  Int X = 123;
  If(par == someConst)       
  {//inner block
	We can use X here!
  }
}

Определение для Лямбда-функции тоже создает внутренний блок кода:

Action Function(type par)
{//outer block (see “inner block” father)
  Int X = 123;
  If(par == someConst)       
  goto Label; //we need goto just to escape definition of extra inner block
  Return lambda=>
  {// inner block
  some code that uses X in the block
  };
Label:
  We can still use X here!
}

Интересно! Это только мне кажется, что передача переменных из окружающего кода в код Лямбда-функции, ВОЗМОЖНО, изначально была ошибкой при разработке компилятора, когда стандартный способ распространения области видимости переменных по недосмотру применили к вновь появившимся инлайн реализациям функций? Но потом кто-то нашел применение такой возможности и, как это часто бывает, «Бага»(bug) превратилась в «Фичю» (feature)?

Теги:
Рейтинг0
Комментарии2

Сезон Java — всё! Сегодня последний день приёма заявок для участия в сезоне Java one love, и совсем скоро мы узнаем победителя.

А пока встречайте последних участников со статьями о работе с байт-кодом, сборке Java-приложения, задачах фильтрации и гибридных системах мониторинга данных.

? Делаем свою простейшую систему сборки для Java

? Перестаём бояться генерировать байт-код

? FizzBuzz и искусство фильтрации

? FizzBuzz и искусство фильтрации: Stream API и предикаты

? Ad-hoc мониторинг: сбор, хранение и визуализация данных

? Компилирование «железного» бинарника Java-программы Google Closure Stylesheets с GraalVM

Если вы как раз дописываете свою статью — поторопитесь: с завтрашнего дня статьи в сезон не принимаются. Ваши голоса могут повлиять на итоговый рейтинг — голосуем и выбираем победителя сезона по ссылке ? → https://u.habr.com/java1love

Сезон длится до 15 сентября. Спонсор Сезона Java one love — Мир Plat.Form.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии2

Ближайшие события

Существует ли совершенный Java-код?

В реальной жизни не всегда можно сделать так, чтобы код был красивым, читаемым, без «костылей» и оптимизированным. А статьи в сезоне Java one love помогут примирить внутреннего перфекциониста с реалистом (или хотя бы облегчить боль первого).

Итак, учимся на чужих граблях, когда лучше послушать совет «‎Работает? Не трогай!», а когда, наоборот, экспериментировать и пробовать новые подходы:

? Ускоряем java-рефлексию в 2023

? Динамическое создание слушателей в Kafka 

? Релиз Jmix 2.0 — новой версии платформы для быстрой разработки бизнес-приложений на Java

? Байки джависта

?️ Нагрузочное тестирование API без использования UI

Если у вас есть Java-опыт — делитесь им на Хабре и получайте призы. Поторопитесь — осталась всего неделя до конца → https://u.habr.com/java1love 

Сезон длится до 15 сентября. Спонсор Сезона Java one love — Мир Plat.Form.

Теги:
Рейтинг0
Комментарии0

До конца сезона Java one love осталась всего пара недель!

Наш новый участник написал пошаговую инструкцию по созданию нагрузочных тестов для API с генерацией динамических значений. Самое время ворваться в сезон со статьей про интеграционные тесты, если вам есть что о них рассказать ?

Топ самых популярных туториалов в сезоне Java one love:

?️ Нагрузочное тестирование API без использования UI

?️ Как скомпилировать приложение Spring Boot в native image с помощью GraalVm и развернуть его с помощью Docker

? Поднимаем кластер PostgreSQL в Docker и Testcontainers

? Авторизация в приложении Spring Boot с Spring Security 3.1.0 и PostgreSQL

? Магия Spring Framework своими руками

? Одна из возможных версий переезда с MySQL на PostgreSQL

Если у вас есть Java-опыт — делитесь им на Хабре и получайте призы → https://u.habr.com/java1love

Сезон длится до 15 сентября. Спонсор Сезона Java one love — Мир Plat.Form.

Теги:
Рейтинг0
Комментарии0

О чем пишут участники сезона Java one love

Тут есть и туториалы «бери и делай», и сложные кейсы промышленной эксплуатации, и небезопасные эксперименты. Есть даже философские статьи, основанные на эмпирическом анализе и опыте разработки.

?️ Почему WebAssembly плохо годится для Java

?️ Как скомпилировать Spring Boot приложение в native image с помощью GraalVm и развернуть его с помощью Docker

?️ Фундаментальное руководство по пакетам в Java

? Поднимаем кластер PostgreSQL в Docker и Testcontainers

? Авторизация в приложении Spring Boot с Spring Security 3.1.0 и PostgreSQL

Если у вас есть Java-опыт— делитесь им на Хабре и получайте призы → https://u.habr.com/java1love

Сезон длится до 15 сентября. Спонсор Сезона Java one love — Мир Plat.Form.

Теги:
Рейтинг0
Комментарии0

Самое ценное в сезоне Java One Love — это обмен опытом. 

Джуны пишут свои первые статьи о реализации Java-приложений, ищут советы и рекомендации, а опытные джависты демонстрируют редкие решения для серьёзной промышленной эксплуатации:

? Поднимаем кластер PostgreSQL в Docker и Testcontainers

? Авторизация в приложении Spring Boot с Spring Security 3.1.0 и PostgreSQL

? Использование Kotlin и WebFlux для выполнения задач ML в Apache Spark на GPU

? Магия Spring Framework своими руками

? Исчерпывающее руководство по одномерным массивам в Java 

Новый взгляд на Maven-plugin для IDEA — GMaven  

Если у вас есть Java-опыт— делитесь им на Хабре и получайте призы → https://u.habr.com/java1love

Сезон длится до 15 сентября. Спонсор Сезона Java one love — Мир Plat.Form.

Теги:
Рейтинг0
Комментарии0

В прошлом сезоне Java выиграла статья про Spring Framework, и первую статью о Spring нового сезона мы попросили прокомментировать победителя.

Олег Чирухин, победитель прошлого сезона Java, о статье «‎Магия Spring Framework своими руками»: 

Что под капотом у Spring — подробности в стиле Spring-потрошителя Жени Борисова. Статья начинается исследованием Proxy-объектов, связи прокси-объекта с принципом Лисков и существующими прокси в JDK, и продолжается обсуждением BeanPostProcessor’ов и JMX. Всё это на хороших практических примерах, с кодом на гитхабе, выжимкой по смыслу из этого кода и скриншотами.

Участники сезона Java one love:

? Магия Spring Framework своими руками

? Исчерпывающее руководство по одномерным массивам в Java

Новый взгляд на Maven-plugin для IDEA — GMaven

?‍?‍?‍? Разница между загрузкой и инициализацией классов в Java на любопытном примере

? Одна из возможных версий переезда с MySQL на PostgreSQL 

Если у вас тоже есть Java-опыт, ждём ваших статей на Хабре. Хотим ещё прочитать про реактивную джаву, архитектурные фреймворки для DDD, PaaS/FaaS/Multitenansy в облаках, интеграционные тесты → https://u.habr.com/java1love 

Сезон длится до 15 сентября. Спонсор Сезона Java one love — Мир Plat.Form.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Нужно ли быть хабраавтором-старожилом, чтобы участвовать в новом сезоне Java one love? Нет, надо просто любить джаву, жабу, жаву.

Эти статьи вырвались в лучшие прямо из «Песочницы». Смотрите сами, рейтинги впечатляют:

? Передача цифровых данных по рации с помощью мобильного приложения  

?️ Пишем приложение на Mi Band 7 с сервисной частью

?‍? Строим свой SSO сервер используя Spring Authorization Server

? Как новичку подарить жизнь telegram-боту на java

?️ DoZer — сцинтилляционный гамма-спектрометр с bluetooth

? Юнга, стоп, у нас кончились ресурсы. Или как мы оптимизировали наши микросервисы

Сезон идёт до 15 сентября. Если у вас есть Java-опыт— делитесь им на Хабре и получайте призы → https://u.habr.com/java1love

Сезон длится до 15 сентября. Спонсор Сезона Java one love — Мир Plat.Form.

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Первые статьи сезона Java one love прибыли! Не далее чем на этой неделе стартовал новый сезон Java, а у нас уже два хардкорных джависта.

Правда ли, что загрузка класса не всегда сопровождается его проверкой и инициализацией? Или как осуществить переезд с MySQL на PostgreSQL с вынесением независимых бизнес-процессов из монолита в микросервисы?

Наш первые участники сезона проясняют весьма тонкие нюансы устройства Java-мира и выполняют невероятные трюки over-engineering’а:

?‍?‍?‍? Разница между загрузкой и инициализацией классов в Java на любопытном примере

? Одна из возможных версий переезда с MySQL на PostgreSQL

Если вы тоже хотите поделиться опытом, ждём ваших статей на Хабре. Сезон длится до 15 сентября.

Спонсор Сезона Java one love — Мир Plat.Form.

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Вклад авторов