Получи случайную криптовалюту за регистрацию!

Java: fill the gaps

Логотип телеграм канала @java_fillthegaps — Java: fill the gaps J
Логотип телеграм канала @java_fillthegaps — Java: fill the gaps
Адрес канала: @java_fillthegaps
Категории: Технологии
Язык: Русский
Количество подписчиков: 10.33K
Описание канала:

Привет! Меня зовут Диана, и я занимаюсь java разработкой с 2013г.
Делюсь опытом/знаниями по темам:
- Java Core
- Вопросы с собеседований
- Best practices
Комплименты, вопросы, предложения: @utki_letyat

Рейтинги и Отзывы

4.50

2 отзыва

Оценить канал java_fillthegaps и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

1

3 звезд

0

2 звезд

0

1 звезд

0


Последние сообщения 3

2022-05-24 09:00:05 Статистика вакансий HeadHunter (Мск+Спб)

Проанализировала 1120 вакансий java разработчиков на HH с точки зрения зарплат и основных технологий.

Junior

Вакансий: 39 или 3% от общего количества
Половина вакансий в категории "без опыта", половина требует опыт "от года до трёх".
Зарплата указана в 36% случаев, диапазон 15-110к

Что используется:
Реляционные БД: Postgres, Oracle, общение с ними через Hibernate и JPA
Spring: MVC, Boot
Системы сборки: maven/gradle примерно поровну
git
Devops-штуки: docker, Openshift, Jenkins, Ansible
Kafka
В каждой третьей вакансии упоминается фронтэнд: JS/React/CSS
В каждой пятой — Kotlin

Middle (от года до трёх лет)

Вакансий: 382 или 34% от общего количества
Здесь самые секретные зарплаты — конкретные цифры указаны только в 27% вакансий, диапазон 32-400к

Что используется:
Реляционные БД: Postgres, Oracle, общение через Hibernate
Spring: Boot, Cloud, Data
Devops: docker, Kubernetes, Openshift, Linux, Jenkins
Системы сборки: maven встречается в 2 раза чаще gradle
Kafka
Kotlin в 15% вакансий

Senior (3-6 лет опыта)

Вакансий: 648 или 58% от общего количества
Зарплаты указаны в 45% случаев, диапазон 120-700к

Что используется:
Реляционные БД: Postgre, Oracle
NoSQL: Redis
Spring: Boot, Data, Security, Cloud
Devops: docker, Kubernetes, Openshift, Linux, Jenkins)
Kafka
Kotlin в каждом пятом проекте

Stars (6+ лет)

Вакансий: 51 или 4% от общего количества
Зарплата указана в 71% случаев, диапазон 160-1050к

Много вакансий на английском, что накладывает свой отпечаток Кандидат должен быть strong and passionate, ловить opportunity и отвечать за evolution. Упор на soft skills, много обязанностей по менторингу, архитектуре и общению с бизнесом. Каждая пятая вакансия упоминает релокацию.

Из технического:
В реляционных БД доминирует Postgre
NoSQL — Redis, MongoDB
Брокеры: Kafka и RabbitMQ
Docker, Kubernetes
Spring
Kotlin — 27% вакансий

Общее впечатление — вакансий стало раза в полтора больше, чем год назад. Технологии в вакансиях стали скучнее — редко упоминается AWS и GCP, список NoSQL заметно похудел. Зато Kotlin и Gradle набирают обороты.

Годы идут, но самый популярный стек остаётся тем же: Spring + Postgre + Kafka (+ иногда Redis)
2.0K views06:00
Открыть/Комментировать
2022-05-19 09:00:09 BigDecimal

В этом посте обсудим, зачем нужен этот класс и как не ошибиться при использовании.

Ответ на первый вопрос перед постом — false. Сумма 0.1 и 0.2 равна 0.30000000000000004.

Запустим тот же пример на Python 2.7:
print(0.1 + 0.2)
0.3

Почему python справился с примером, а java — нет? Как писать на java высоконагруженные приложения, если она не может сложить 0.1 и 0.2?

Oracle подробно объясняет этот феномен на 80 страницах. Главная проблема в том, как десятичная часть хранится в двоичном формате.

Целые числа записываются через степень двойки однозначно:
9 = 8 + 1 = 2^3 + 2^0 → 1001

Десятичная часть выражается через отрицательную степень двойки. Иногда получается нормально:
0.5 = 2^(-1) → 0.1

Иногда не очень:
0.1 = 2^(-4) + 2^(-5) + 2^(-8) + … →
0.00111101110011001100110011001

Если перевести это обратно в десятичную форму, видно, что хранится там совсем не 0.1, а 0.100000001490116119384765625

С 0.2 похожая ситуация, поэтому результат получается искажённым.

Python 2.7 использует для вычислений ту же систему, но показывает меньше знаков после запятой. Поэтому ответ выглядит нормально. Python 3 выводит больше знаков и результат похож на результат java:
print(0.1 + 0.2)
0.30000000000000004

Зачем использовать такую неточную систему?

Если хранить целую и дробную часть одинаково, то для вычислений не нужно дополнительных преобразований. Результат считается быстро, а уровень погрешности на практике низкий. В нашем примере ошибка на 16 разрядов ниже основного значения, в большинстве случаев это ок.

Для точных вычислений используются три основных метода:
Ограниченная точность (limited-precision decimal)
Символьная логика (symbolic calculations)
Длинная арифметика (arbitrary-precision decimal)

BigDecimal использует последний подход. Число 12.345 хранится как пара:
целое значение: 12345
количество десятичных знаков: 3

За счёт этого BigDecimal хранит числа без потери точности. Целая часть хранится либо в переменной int, либо в массиве. Размер числа ограничен только количеством доступной памяти.

Из минусов:
Медленные вычисления
Большой расход памяти
Много промежуточных объектов
Менее выразительный код

Теперь ответ на второй вопрос перед постом:
объекты BigDecimal(0.2) и BigDecimal("0.2") НЕ равны.

В конструктор
BigDecimal(0.2)
передаётся примитив double, в котором вместо 0.2 лежит
0.20000000000000001110223...
Поэтому объект BigDecimal будет хранить это число, а не 0.2

Это самая частая ошибка при работе с BigDecimal. Для чисел с запятой надёжнее передавать в конструктор строку.
1.5K views06:00
Открыть/Комментировать
2022-05-19 09:00:09
Что выведется в консоль?
Anonymous Poll
73%
true
27%
false
855 voters1.6K views06:00
Открыть/Комментировать
2022-05-19 09:00:06 ​Вопрос 2: что выведется в консоль?
1.7K views06:00
Открыть/Комментировать
2022-05-19 09:00:04
Что выведется в консоль?
Anonymous Poll
24%
true
76%
false
900 voters1.7K views06:00
Открыть/Комментировать
2022-05-19 09:00:04 ​Вопрос 1: Что выведется в консоль?
1.7K views06:00
Открыть/Комментировать
2022-05-17 09:00:07 Исключения: сhecked или unchecked?

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

Основы

Checked исключения — наследники класса Exception:
class IOException extends Exception

Явно указываются в сигнатуре методов:
void write(int c) throws IOException

Код с обработкой исключения обязателен, иначе программа не скомпилируется

Unchecked исключения — наследники класса RuntimeException:
class NullPointerException extends RuntimeException

О них не пишут в сигнатуре методов и редко ловят в блоке try-catch. Компилятор не предупредит о возможных ошибках, но иногда о них предупреждает IDE.

Оба типа можно поймать в блоке try-catch. Единственная техническая разница между checked и unchecked — обязательная обработка checked исключений. На уровне JVM разницы нет — производительность обоих типов одинакова.

За что отвечают стандартные исключения JDK

checked говорят об ошибках с "внешними" причинами: файл не найден, поток прервали, сокет закрыт, указанный класс не найден. Исключения показывают возможные проблемы, которые в будущем могут повториться

unchecked указывают на ошибки в коде: передали null вместо объекта, пришёл некорректный аргумент, нельзя привести объект к указанному типу. Исправляются при обнаружении, и в будущем такая ошибка не ожидается

Ошибки бизнес-логики

Не найден пользователь, не хватает прав, превышен лимит снятия денег со счёта. Какие это исключения: checked или unchecked?

В старых статьях по java и на многих курсах ответ однозначен. Исключения должны быть checked, чтобы ошибка не дошла до пользователя.

На JavaRush и в других статьях пишут, что checked исключения никто не использует, потому что это неудобно.

Кто же прав?

Исключения бизнес-логики — ожидаемые события, которые нужно обработать. Пользователь должен увидеть не стектрейс, а красивое сообщение

Многие фреймворки облегчают работу с исключениями. Если в Spring задать обработчик для UserNotFoundException, то туда попадут UserNotFoundException из любой части сервиса. Spring в любом случае их поймает, поэтому исключения бизнес-логики делают unchecked. Код получается гораздо чище.

По этой же причине checked иногда переводят в unchecked:
catch (SQLException e)
{ throw new IllegalStateException(e); }

Резюме
Если приложение написано на чистой java, то исключения бизнес-логики будут скорее всего checked
Если приложение использует фреймворк, который перехватывает исключения, их можно сделать unchecked

Правильные ответы на вопросы перед постом:
Вопрос 1: обработка checked исключений обязательна и проверяется на этапе компиляции
Вопрос 2: на практике чаще встречается
extends RuntimeException
но вариант extends Exception тоже ок
1.4K views06:00
Открыть/Комментировать
2022-05-17 09:00:07
Вопрос 2: рассмотрим простое веб-приложение на Spring. В запросах часто передается ID пользователей. Если ID некорректный, бросается UserNotFoundException. Как его реализовать?
Anonymous Poll
7%
class UserNotFoundException extends Throwable
1%
class UserNotFoundException extends Error
31%
class UserNotFoundException extends Exception
60%
class UserNotFoundException extends RuntimeException
746 voters1.6K views06:00
Открыть/Комментировать
2022-05-17 09:00:05
Вопрос 1: в чём разница checked и unchecked исключений?
Anonymous Poll
9%
checked можно ловить в блоке try-catch, unchecked — нельзя
3%
checked ожидаются JVM, поэтому затраты на поддержку ниже
83%
Обработка checked исключений обязательна и проверяется во время компиляции
5%
checked исключения показывают ошибки бизнес-логики, unchecked — плохо написанный код
764 voters1.6K views06:00
Открыть/Комментировать
2022-04-29 09:00:09 Задачи на сообразительность

Иногда на собеседованиях дают "задачку на сообразительность". Перевернуть строку, поделить торт на части, бросить шар из окна и так далее.

Когда я была джуниором, то не любила такие задачи. От волнения мыслительные способности опускались на уровень обезьянки. Я могла минуту смотреть на задачу с абсолютной пустотой в голове.

У сеньоров тоже бывает ступор. Человек несколько лет заботился о микросервисах, проводил сложные интеграции и вникал в запутанные бизнес-требования. Задачи вроде "сколько шариков вытащить из ящика" для него крайне непривычны.

Что мне помогало: решить перед собеседованием несколько подобных задач. Тогда на самом собесе мозг включается быстрее.

Ниже — плейлист для практики

Программистские

Развернуть строку: abc → cba

Развернуть число: 123 → 321

Для массива чисел и заданного числа найти пары элементов, которые в сумме равны этому числу
Пример: массив [5,7,8,2,12,30,10,16], требуемая сумма — 15
Ответ: 5 и 10, 7 и 8

Найти в массиве числа, у которых нет дубликата в этом же массиве: [1,2,3,1,2] → 3

Проверить, является ли строка палиндромом (читается одинаково слева направо и справа налево)

Проверить, является ли число палиндромом

Проверить, являются ли строки анаграммами (состоят из одних и тех же букв)

Проверить, является ли числа анаграммами

Вывести слова в строке в обратном порядке

Реализовать игру FizzBuzz. Написать алгоритм, который выводит числа от 1 до N. Если число делится на 3 — выводить fizz, если на 5 — buzz, если на 3 и 5 — fizz buzz

Посчитать статистику символов в строке
java → j:1, a:2, v:1

Найти наибольший общий делитель двух чисел

Написать конвертер систем счисления: обычных чисел в римские, десятеричную систему в двоичную, 8- и 16-ричную

Больше задач ищите на LeetCode, уровень Easy и Medium. Учить решения бесполезно, так как у задач много вариаций

Предметные

В ящике 100 белых и 100 черных шаров. Сколько шаров нужно вытащить, чтобы среди них было 2 одноцветных?

Есть 15 одинаковых с виду шариков, но один чуть тяжелее других. Сколько нужно взвешиваний, чтобы найти этот шар?

Как из полного сосуда ёмкостью в 12л отлить половину, пользуясь двумя пустыми сосудами ёмкостью в 8л и 5л?

Есть 8 батареек, 4 из них рабочие. Фонарику нужно 2 батарейки. Сколько пар нужно протестировать, чтобы найти рабочую?

Задачки такого типа классно решать в компании или вместе с детьми Ссылка на 50 других задач
2.2K views06:00
Открыть/Комментировать