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

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


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

2021-10-15 09:00:57 Как войти в айти, часть 2: полезные материалы

В среду я выставляла опрос про java курсы и их эффективность. Большинство ответивших устроились на работу сразу после курсов.

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

В основном это те, кто проходил интенсивные курсы: job4j, JavaMentor. Ребята учились по 20-40 часов в неделю несколько месяцев, часто с неравнодушным ментором.

Три человека прошли все уровни JavaRush со стажировкой и написали, что этого хватило.

Меня больше интересовали курсы типа скиллбокс, где обещают обучить с нуля до сеньора за 3 месяца. Мне написали несколько ребят, которые получили оффер джуниора после такого обучения. Что им помогло:

Инженерный или математический бэкграунд, высокий интерес к компьютерам и IT
Дисциплина и самостоятельность. Ребята сами углубляли темы с курсов - читали книги, статьи, смотрели видео с конференций
Скромность - готовность работать на старте за 30к, а не требовать сразу 100

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

Итак, как войти в айти за 6 шагов:

Шаг 1. Начать писать java код

Вариант А: если вы никогда не писали код

Курс на степике - бесплатный
JavaRush - 1800 рублей в месяц, огромное количество заданий для тренировки
Книга Head First Java как дополнение

Вариант Б: вы уже писали код

Знаете питон, ходили в кружок программирования в школе и тд. Этот курс на степик поможет привыкнуть к синтаксису java.

Шаг 2. Углубляемся в ООП и библиотеки
Многие хвалят трек Java Backend Developer в Jet Brains Academy

Шаг 3. Изучаем важное

Git: Теория, тренажёр на русском, тренажёр на английском
Что такое системы сборки
Spring: посмотрите видео, например, такое по темам Spring Core, Spring MVC, Spring Boot, Spring Data
Паттерны GoF
SQL: учебник-тренажёр 1, учебник-тренажер 2
Курс по алгоритмам

Вы вряд ли будете использовать сложные алгоритмы в работе, но рекомендую пройти курс. Потому что
Алгоритмы спрашивают на собеседованиях
Это отличный тест на профпригодность. Справитесь с курсом - справитесь с большинством энтерпрайзных задач

Шаг 4: Шлифуем теорию и готовимся к собеседованиям

Списков миллион, можно для начала пройтись по этому, к нему прилагается телеграм бот с вопросами @DevInterviewBot

Бонусный шаг: найти ментора и сделать сервис, где будет Spring, базы данных, JUnit и HTTP-запросы. Выложить проект на гитхаб и прикрепить ссылку к резюме.

Шаг 5: прокачиваем навык собеседований

Идем по циклу:
Сходить на собеседование
Проработать вопросы, на которые не ответили

Повторяем, пока не найдём работу
1.8K views06:00
Открыть/Комментировать
2021-10-13 09:01:18 Как войти в айти, часть 1

Сразу начну с горячей темы - эффективны ли java курсы за 100-200к?

Вообще учиться на курсах очень комфортно:
Чёткая программа и расписание
Группа единомышленников
Обратная связь преподавателя

Но минусы текущих предложений настолько сильные, что затмевают плюсы:

Завышенные обещания

Реклама обещает, что после курса за 100к легко найти работу за 100к. По факту рекрутеры часто отбрасывают резюме, если в нём только прохождение курсов. Потому что знаний у таких кандидатов обычно недостаточно.

Группы 30-40 человек, слабая обратная связь
Программа везде одна и та же, часто устаревшая

Если вы отметили пункт "Устроился на работу сразу после курсов", то напишите мне! Вдруг я неправа, и хорошие варианты тоже встречаются.

Что же делать?

Для начала рассмотрите другие пути.

Любая профессия при переходе в IT оплачивается больше. Зарплата IT рекрутёра может быть в 2 раза больше, чем у коллеги из другой сферы.

В IT полно других профессий: аналитик, тестировщик, automation тестировщик или UX/UI дизайнер. У многих входной порог ниже, и можно больше общаться с людьми.

Если вас привлекает именно программирование, то в следующем посте я дам список бесплатных и недорогих материалов.

Но просмотреть список недостаточно, их нужно изучить:) Построить план и встроить учёбу в привычное расписание.

Что может помочь:

Напарник. Учитесь вместе, обсуждайте проблемы, мотивируйте друг друга. Дело пойдёт быстрее 100%
Ментор. Самый эффективный путь. Ментор - это человек, который уже дошёл до вашей точки Б и готов помочь вам пройти этот путь. Как найти ментора и договориться с ним - отдельный вопрос. Когда-нибудь напишу об этом пост.

Сколько времени займёт подготовка?
— Зависит от многих факторов, но ориентируйтесь на регулярные занятия 30-60 минут в день в течение года.

Я юрист/пекарь/бухгалтер, мне 30/40/50 лет, могу ли я стать программистом?
— Сможете, если у вас есть:
Интерес к самому программированию, а не только к деньгам в IT
Английский язык на уровне чтения технической документации

А меня возьмут? Я юрист/пекарь/бухгалтер, мне 30/40/50
— Если вы хорошо знаете основы java, приятны в общении и сообразительны, то вам будут рады. Последние два пункта не менее важны, чем первый!
2.0K views06:01
Открыть/Комментировать
2021-10-13 09:01:17 Мини-новость: стартовал 3 поток курса по многопоточке. Кто записался, но пропустил - проверьте почту! Если не нашли письмо, напишите мне.

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

Что по постам.

На этой неделе поговорим о том, как перейти в айти из других сфер. Я получаю много таких вопросов, будут теперь отвечать ссылкой на посты.
1.9K views06:01
Открыть/Комментировать
2021-09-30 09:00:03 Compact String в java 9

По данным OpenJDK более 25% объектов в памяти занимают строки. По той же статистике 95% строк содержат только латинские символы и цифры, числовое значение которых умещается в 1 байт, а до 15% памяти заняты бесполезными нулями.

В java 8 символы хранятся в типе char и кодировке UTF-16. Занимают 8 или 16 бит. Экземпляр String содержит массив символов char[].

В java 9 вышло обновление Compact Strings. Символы теперь лежат в byte[] и хранятся в одной из двух кодировок. Кодировка записана в новом поле coder.

Это может быть:
ASCII кодировка Latin-1. Используется, если все символы строки умещаются в 1 байт. Т.е в тексте только латиница и цифры.
UTF-16 - если хотя бы один символ требует 16 бит.

Строки в разных кодировках по-разному лежат в памяти, и работать с ними нужно по-разному. Каждый метод в классе String начинается с проверки кодировки и разделяется на две ветки — для Latin-1 и UTF-16. Их код вынесен в отдельные классы StringLatin1 и StringUTF16.

Почему не UTF-8? Он же занимает ещё меньше места.

— UTF-8 действительно занимает меньше памяти, но работает он медленнее. Если символы в массиве одной длины, то адрес символа в памяти быстро ищется по индексу. Если элементы с переменной длиной - адрес вычисляется на основе предыдущих элементов, а это долго. Все методы класса String работали бы дольше.

Память сэкономили, кода стало в 3 раза больше. Стало ли быстрее?

— Любая дополнительная проверка снижает скорость работы, особенно при работе с маленькими строками. Поэтому на уровне JVM много оптимизаций по проверкам кодировки и сравнению строк, изменён механизм конкатенации и других операций. Именно за счёт внутренних оптимизаций компактные строки работают в среднем на 20% быстрее и создают на 30% меньше промежуточных объектов.

Самое главное - эти изменения никак не отразились на интерфейсе String. I/O классы, StringBuilder, StringBuffer тоже адаптированы без внешних изменений.

Нужно просто перейти на java 9 и приложение будет занимать на 5-15% меньше памяти.
1.5K viewsedited  06:00
Открыть/Комментировать
2021-09-28 09:00:52 Чем отличаются кодировки?

Продолжаем тему прошлой недели и снова поговорим о классе String. В java 9 вышло интересное обновление - компактные строки. Чтобы лучше понять, в чём была проблема и как она решена, разберём в этом посте отличия между кодировками. А в четверг обсудим уже сами компактные строки.

Итак, символы хранятся в памяти в виде чисел. Кодировки отвечают за формат хранения и правила перевода символов в числа и обратно. Кодировки условно делятся на две группы:
ASCII-based
Unicode-based

ASCII
В большинстве ASCII кодировок символ занимает 1 байт и содержит число от 0 до 256. Первые 128 значений транслируются одинаково во всех кодировках:
0-31: управляющие последовательности - перенос строки, конец файла и т.д.
32-127: латинский алфавит, цифры, знаки препинания

Значения 128-255 отображаются на специфичные символы языков. Разные кодировки - разные наборы символов:
Кириллица: ISO-8859-5, Windows-1251
Греческий алфавит: ISO-8859-7, Windows-1253
Исландские символы: OEM 861

200 может стать Ш, Θ, È или чем-то ещё. Фраза Я люблю Java в другой кодировке отобразится как Ď ŰîŃŰî Java.

Компактный формат: 1 символ — 1 байт
Всего 256 значений — нет места для эмодзи
Неоднозначность трактовки
Нельзя использовать украинский и норвежский язык в одном тексте

Unicode
В основе преобразований лежит гигантская таблица с большинством символов, которые используются в мире. Первые 127 символов полностью совпадают с ASCII.

Но ASCII-кодировки не умеют читать символы больше 255. Если подсунуть им юникод, то непонятные значения превратятся в и текст Я люблю Java отобразится как ? ????? Java.

Как хранится юникод.

Ранние версии используют отображение 1 к 1. Все символы хранятся одинаково и занимают одинаковое количество памяти.

Одна из первых кодировок UCS-2 хранила один символ в двух байтах. После ASCII с их диапазоном 0-256 казалось, что диапазона 0-65536 хватит навсегда.

Со временем в таблицу добавилось больше символов и встал вопрос об эффективном хранении данных. Сегодня, чтобы однозначно представить символ юникода нужно 32 бита — так символы хранятся в UTF-32:
Прямое отображение
Простота обработки
Очень много символов
Неэффективный расход памяти — если использовать только латиницу с кодами типа 0..045 и 0...077, три четверти памяти будет занято нулями.

Чтобы решить проблему выше, появились кодировки с переменной длиной: UTF-8 и UTF-16.

Они используют не отображение 1 к 1, а схему с флажками и вычислениями.

В UTF-8 символ занимает 1, 2, 3 или 4 байта. В UTF-16 популярные символы занимают 2 байта, а непопулярные - 4.

Экономный расход памяти для латинских символов
Обработка и поиск происходят чуть медленнее, тк надо делать преобразования
Отметка длины находится в первых 2 битах и уменьшает диапазон значений

Если в структуре 2 или больше байтов, то одни процессоры быстрее считывают их в прямом порядке, а другие — в обратном. Поэтому у UTF-16 и UTF-32 могут быть приставки LE или BE: Little/Big endian.

Что в java. В ранних версиях для char использовалась UCS-2, один символ занимал 2 байта. Затем java перешла на UTF-16 с переменной длиной.

Ну а что с этим не так, и как обстоят дела в java 9 - поговорим в следующем посте.
1.9K views06:00
Открыть/Комментировать
2021-09-24 09:00:02 Продолжается набор на курс

Напоминаю, что сейчас идёт набор на 3 поток курса по многопоточке.

Старт: 11 октября
Длительность: 8 недель

Пока ещё доступен промокод GOOD_CHOICE, который снижает цену на 6 и 8к. Со следующей недели он перестанет действовать.

Курс не только про классы и синтаксис. Мы изучим проблемы при работе с данными и разные подходы к их решению. Это не только про код, но и про дизайн.

Что вы можете взять из курса?

Познакомиться с многопоточкой и понять, что не всё так страшно
Изучить лучшие практики, чтобы сделать свой код ещё лучше
Посмотреть на разные подходы к решению задач

Полная программа, отзывы и запись тут: https://fillthegaps.ru/mt3

Записывайтесь, будет интересно:)
1.5K views06:00
Открыть/Комментировать
2021-09-23 09:00:02 Сложение строк, часть 2: java 9

Возьмём код из прошлого поста

String s = s1 + s2 + s3;

Для него компилятор java 8 соберёт байткод:

// Method StringBuilder."(init)":()
// Method StringBuilder.append:(String)
// Method StringBuilder.append:(String)
// Method StringBuilder.append:(String)
// Method StringBuilder.toString:()

Компилятор java 9 сделает по-другому:

invokedynamic #13

По ссылкам мы придём в метод StringConcatFactory#makeConcatWithConstants

(Подробно про invokedynamic я писала в этом посте, сейчас не будем углубляться)

В классе StringConcatFactory лежит та же логика со стринг билдером. Но очень параметризуемая: через JVM параметры доступны немного разные реализации и стратегии вычисления исходного размера StringBuilder.

Это слишком глубокие дебри, поэтому не буду расписывать подробно. Почитать про все опции и посмотреть бенчмарки можно тут.

У любой задачи есть цель, поэтому давайте разберёмся, зачем это всё затевалось. Первый вариант, приходящий на ум - увеличение производительности.

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

Второй вариант - большая гибкость. Да, параметров стало больше, но не думаю, что это будет востребовано в большинстве проектов.

Основная цель изменений - это "причёсывание" кода. Что получилось после рефакторинга:

Логичность. Я воспринимаю + как сокращённую форму метода add для строк и ожидаю реализацию этого метода внутри JDK.

Чёткое разделение обязанностей. Работа компилятора - преобразовать конструкции языка в инструкции для JVM. Например, превратить + в вызов метода.

Оптимизации на этом уровне могут быть, но не на уровне "бизнес-логики". Соединить две строчки на этапе компиляции - это одно. Прописать создание объектов и тд - совсем другое.

Легче сделать сложную логику обработки. В классе StringConcatFactory 900 строк с кучей параметров и проверок. Представляете, если такое будет в байткоде? Написал в коде плюсик, а при компиляции получил чудовище.

Легче менять реализацию. Для изменения конкатенации в будущем достаточно поменять код в JDK, и не нужно трогать компилятор. Это снижает количество работы и возможных ошибок.

Если совсем просто, то перенос логики соединения строк из байткода в JDK - это как перенос логики из хранимых процедур в основной код
1.2K views06:00
Открыть/Комментировать
2021-09-21 09:00:03 Сложение строк, часть 1: java 8

В JDK есть четыре способа слепить строчки между собой:
Оператор +
Класс StringBuilder
Класс StringBuffer (потокобезопасный StringBuilder)
Метод concat

В чём проблема с объединением строк?

Класс String - неизменяемый, поэтому при каждом сложении строк создаётся новый объект.
Если это просто "a"+"b", то проблемы нет.

Но в типичном java приложении очень много строчек и их взаимодействий. Больше строк - больше промежуточных объектов. Если не принять специальных мер, то "a"+"b"+"c"+"d" приведёт к созданию ab, abc и abcd.

Строки иногда занимают половину памяти, поэтому оптимизация очень важна.

StringBuilder - специальный класс, который снижает накладные расходы при соединении строк. Выглядит это так:

StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
sb.append("c");
String res = sb.toString();

Что происходит: StringBuilder выделяет байтовый массив и с каждым append добавляет туда строчки. При вызове toString из этого массива создаётся неизменяемая строка. Так количество лишних объектов существенно сокращается.

Единственный минус StringBuilder - плохая читаемость. Половину кода занимает append.

Через + работать приятнее, поэтому у компилятора есть набор оптимизаций при использовании плюсика. Что делает компилятор:

Соединяет явно обозначенные строки:

String s = "a" + "b" + "c";

Сразу компилируется в abc.

Сразу соединяет final строки:

final String s1 = "a";
final String s2 = "b";
final String s3 = "с";
String s4 = s1 + s2 + s3;

Это тоже компилируется в abc, без промежуточных объектов.

Если строки НЕ final, то код выше компилируется в создание объекта StringBuilder, 3 вызова метода append и метод toString

Тут мы подходим к популярному мифу. Помните, вначале я говорила, что "a"+"b"+"c" приводит к созданию объектов ab и abc. Многие понимают это буквально, что это оператор + приводит к созданию лишних объектов. Поэтому лучше плюсик не использовать, а использовать StringBuilder.

Так вот, это неправда. StringBuilder используется под капотом плюсика со времён java 5. А это 2004 год, 17 лет уже прошло.

У такого подхода есть серьёзный недостаток. StringBuilder создаётся даже при сложении двух строк:

String s1 = "b";
String s2 = "с";
String s3 = s1 + s2;

В данном случае это не рационально.

Чтобы склеить две строки без лишних StringBuilder, используйте метод concat:

String s3 = s1.concat(s2);

Итого, как соединить две строки:
final строчки - через плюсик
Две строки - через concat
Несколько строк, но один раз - через плюсик, внутри работает StringBuilder
Сложные соединения, например, в цикле - явно объявить StringBuilder и использовать его

Ответ на вопрос перед постом

В первом варианте строка-результат соберётся на этапе компиляции, а во втором - во время работы программы. Поэтому первый вариант выполнится быстрее в 20-30 раз.
1.9K viewsedited  06:00
Открыть/Комментировать