Сгенерируйте случайное число в интервале
Когда мы сталкиваемся со случайными числами, то всегда должны помнить о вопросе их распределения. Не будем здесь углубляться в теорию мат. статистики, а рассмотрим только практические следствия.
Самые стандартные классы-генераторы случайных чисел создают равномерно распределенные значения. Любое число возникает с одинаковой вероятностью – это ожидаемое поведение для большинства задач. Например, метод Random.nextInt(1) будет генерировать примерно одинаковое количество значений 0 и 1.
Однако, программист легко может "испортить" равномерность значений последующими операциями. Возьмем вместо предыдущего примера Random.nextInt(2)%2. Такая конструкция тоже будет возвращать 0 или 1. Однако, третье возможное значение из генератора, 2, будет тоже превращено в 0. Значит, ответ 0 будет возникать в два раза чаще чем 1.
Это та причина, по которой лучше не пользоваться общепринятым «школьным» арифметическим ограничением с помощью оператора %. Вместо этого следует оставить заботу о распределении разработчикам библиотеки, и пользоваться в прикладном коде готовыми методами с границами.
Если задача подразумевает более плотную работу с распределениями, стоит воспользоваться специализированной библиотекой вроде Apache Commons Math.
Когда мы сталкиваемся со случайными числами, то всегда должны помнить о вопросе их распределения. Не будем здесь углубляться в теорию мат. статистики, а рассмотрим только практические следствия.
Самые стандартные классы-генераторы случайных чисел создают равномерно распределенные значения. Любое число возникает с одинаковой вероятностью – это ожидаемое поведение для большинства задач. Например, метод Random.nextInt(1) будет генерировать примерно одинаковое количество значений 0 и 1.
Однако, программист легко может "испортить" равномерность значений последующими операциями. Возьмем вместо предыдущего примера Random.nextInt(2)%2. Такая конструкция тоже будет возвращать 0 или 1. Однако, третье возможное значение из генератора, 2, будет тоже превращено в 0. Значит, ответ 0 будет возникать в два раза чаще чем 1.
Это та причина, по которой лучше не пользоваться общепринятым «школьным» арифметическим ограничением с помощью оператора %. Вместо этого следует оставить заботу о распределении разработчикам библиотеки, и пользоваться в прикладном коде готовыми методами с границами.
Если задача подразумевает более плотную работу с распределениями, стоит воспользоваться специализированной библиотекой вроде Apache Commons Math.
👍12🔥4❤2
На бесплатном вебинаре мы:
— попрактикуемся применять принципы чистой архитектуры с использованием языка программирования Clojure и фреймворка Duct.
— познакомимся с его модульной системой, реализуем DI контейнер, подключим адаптеры во все порты и вообще сделаем все, как дедушка Боб нам завещал))
Экспертизой поделится руководитель программы и практик Сергей Ткаченко (Clojure Software developer / Team Lead).
🔥После вебинара вы сможете продолжить обучение на курсе по спеццене, в том числе, в рассрочку.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
Когда стоит выбрать char[] вместо String?
Первая, очевидная причина – оптимизация. Если вам заранее известен размер строки, и он фиксирован, может быть полезно выбрать массив. Если программа работает с неизменяемыми подстроками, удобно представить их в виде offset-ов общего массива (как это было сделано раньше в самом String).
Следует помнить, что оптимизировать нужно осознанно и своевременно. JVM тоже прикладывает усилия по оптимизации строк (вроде интернирования), которые могут оказаться эффективнее ваших.
Вторая, менее очевидная причина – безопасность. Строки в Java иммутабельны. Это значит, что когда вы сохраняете пароль в объекте типа String, физически уничтожить его из памяти может только сборщик мусора.
Существует способ алгоритмической атаки на систему, когда хакер своими действиями вызывает переполнение памяти, и конфиденциальная информация попадает в heap dump.
Если пароль хранится в массиве, программист может самостоятельно «занулить» значение после использования.
Первая, очевидная причина – оптимизация. Если вам заранее известен размер строки, и он фиксирован, может быть полезно выбрать массив. Если программа работает с неизменяемыми подстроками, удобно представить их в виде offset-ов общего массива (как это было сделано раньше в самом String).
Следует помнить, что оптимизировать нужно осознанно и своевременно. JVM тоже прикладывает усилия по оптимизации строк (вроде интернирования), которые могут оказаться эффективнее ваших.
Вторая, менее очевидная причина – безопасность. Строки в Java иммутабельны. Это значит, что когда вы сохраняете пароль в объекте типа String, физически уничтожить его из памяти может только сборщик мусора.
Существует способ алгоритмической атаки на систему, когда хакер своими действиями вызывает переполнение памяти, и конфиденциальная информация попадает в heap dump.
Если пароль хранится в массиве, программист может самостоятельно «занулить» значение после использования.
👍21❤1
Какой результат выведет следующая программа?
Anonymous Quiz
41%
A is equal to Infinity
22%
A is equal to NaN
24%
Ошибку при выполнении
13%
Ошибку компиляции
👍15🔥2🎉2😁1
Под каким типом хранить период времени?
В стандартной библиотеке современных версий Java для этих целей есть два класса:
Period – календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime.
Duration – длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.
Оба класса реализуют общий интерфейс TemporalAmount – период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX() возвращает новый экземпляр с измененным значением.
Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration: "P2DT3H4M", Period: "P1Y2M3D".
До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод between() нужного элемента енама ChronoUnit.
В стандартной библиотеке современных версий Java для этих целей есть два класса:
Period – календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime.
Duration – длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.
Оба класса реализуют общий интерфейс TemporalAmount – период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX() возвращает новый экземпляр с измененным значением.
Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration: "P2DT3H4M", Period: "P1Y2M3D".
До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод between() нужного элемента енама ChronoUnit.
👍11🔥3
Погрузитесь в мир ☕️ Java и станьте Java-разработчиком за 4 месяца с курсом от Merion Academy!
Все, кому интересно, получат 🚀 3 бесплатных урока, 📍 Мы расскажем про то, что из себя представляет язык Java и его базовый синтаксис.
📍 Установите Java и среду разработки где будете писать код.
📍 Напишете свою первую консольную программу, а после нее и REST API приложение.
📍 А в конце закрепите полученные знания.
🎁 Бонус – интенсив по развитию карьеры, где HR-эксперты расскажут как создавать сильные резюме и проходить собеседования.
📜 Плюс гайд по базовому синтакису языка.
🕺У ребят одна из самых доступных цен, которая в разы ниже, чем в других онлайн-школах, а еще есть рассрочка для тех, кто хочет учиться сейчас и платить по чуть-чуть ежемесячно.
👉 Регистрируйтесь по ссылке чтобы забрать бесплатные уроки, интенсив по карьере и гайд.
Merion Academy – это экосистема доступного образования, которая включает в себя:
📍IT-базу знаний с полезными статьями.
📍Youtube-канал ,где простыми словами говорят о сложных вещах.
📍IT-академию, где обучат востребованным направлениям по самым доступным ценам.
Все, кому интересно, получат 🚀 3 бесплатных урока, 📍 Мы расскажем про то, что из себя представляет язык Java и его базовый синтаксис.
📍 Установите Java и среду разработки где будете писать код.
📍 Напишете свою первую консольную программу, а после нее и REST API приложение.
📍 А в конце закрепите полученные знания.
🎁 Бонус – интенсив по развитию карьеры, где HR-эксперты расскажут как создавать сильные резюме и проходить собеседования.
📜 Плюс гайд по базовому синтакису языка.
🕺У ребят одна из самых доступных цен, которая в разы ниже, чем в других онлайн-школах, а еще есть рассрочка для тех, кто хочет учиться сейчас и платить по чуть-чуть ежемесячно.
👉 Регистрируйтесь по ссылке чтобы забрать бесплатные уроки, интенсив по карьере и гайд.
Merion Academy – это экосистема доступного образования, которая включает в себя:
📍IT-базу знаний с полезными статьями.
📍Youtube-канал ,где простыми словами говорят о сложных вещах.
📍IT-академию, где обучат востребованным направлениям по самым доступным ценам.
👍7🔥2🤣1
Что лучше, ArrayList или LinkedList?
Самый избитый вопрос. Проверяет знание особенностей реализации (кишки ArrayList, кишки LinkedList) и эффективности операций в этих разных реализациях. В вопрос иногда добавляют Vector – пересинхронизированный и устаревший вариант ArrayList, который лучше заменить Collections.synchronizedList().
ArrayList хранит данные в массиве, LinkedList в двусвязном списке. Из этого вытекает разница в эффективности разных операций: ArrayList лучше справляется с изменениями в середине и ростом в пределах capacity, LinkedList – на краях. В целом обычно ArrayList лучше.
Стоит добавить, что для работы на краях лучше использовать реализации специально для этого спроектированного интерфейса Deque: например реализующую кольцевой буфер ArrayDeque.
Самый избитый вопрос. Проверяет знание особенностей реализации (кишки ArrayList, кишки LinkedList) и эффективности операций в этих разных реализациях. В вопрос иногда добавляют Vector – пересинхронизированный и устаревший вариант ArrayList, который лучше заменить Collections.synchronizedList().
ArrayList хранит данные в массиве, LinkedList в двусвязном списке. Из этого вытекает разница в эффективности разных операций: ArrayList лучше справляется с изменениями в середине и ростом в пределах capacity, LinkedList – на краях. В целом обычно ArrayList лучше.
Стоит добавить, что для работы на краях лучше использовать реализации специально для этого спроектированного интерфейса Deque: например реализующую кольцевой буфер ArrayDeque.
👍18🔥6❤1
Какой результат выведет следующая программа?
Anonymous Quiz
5%
Hello
38%
Hello world
12%
Программа уйдет в бесконечный цикл
45%
Программа не скомпилируется
👍21🔥5🎉2🏆2
Проверь насколько хорошо ты знаешь Java
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь запись мастер-класса от преподавателя курса
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2🤣2😁1
Как удалить элемент из ArrayList при итерации?
Обычно формулируется в виде задачи на внимательность «что здесь не так», например
Не исключение, но неожиданный результат получится если пользоваться не итератором, а обычным циклом for – при каждом удалении нумерация элементов будет сдвигаться.
Единственный способ удалить элемент из коллекции при обходе, не получив при этом ConcurrentModificationException или неопределенное поведение – удалить с помощью remove() того же инстанса итератора. Вариант ListIterator поможет, если в теле цикла требуется и работа с индексами.
Некоторые коллекции, такие как CopyOnWriteArrayList и ConcurrentHashMap адаптированные под многопоточную среду и имеют fail-safe итераторы.
Обычно формулируется в виде задачи на внимательность «что здесь не так», например
for (String item : arrayList)Подвох в том, что итератор ArrayList, который используется в таком варианте цикла for, является fail-fast, то есть не поддерживает итерацию с параллельной модификацией. А параллельная модификация случается даже в одном потоке, что демонстрирует этот пример. Следующий шаг итератора после удаления элемента выбросит ConcurrentModificationException.
if (item.length() > 2)
arrayList.remove(item);
Не исключение, но неожиданный результат получится если пользоваться не итератором, а обычным циклом for – при каждом удалении нумерация элементов будет сдвигаться.
Единственный способ удалить элемент из коллекции при обходе, не получив при этом ConcurrentModificationException или неопределенное поведение – удалить с помощью remove() того же инстанса итератора. Вариант ListIterator поможет, если в теле цикла требуется и работа с индексами.
Некоторые коллекции, такие как CopyOnWriteArrayList и ConcurrentHashMap адаптированные под многопоточную среду и имеют fail-safe итераторы.
👍10❤1
В России есть множество возможностей для посещения IT-мероприятий, будь то офлайн или онлайн форматы.
Чтобы быть в курсе всех полезных событий, рекомендую подписаться на канал, где собраны все IT-мероприятия России.
Там вы найдете информацию о различных мероприятиях, таких как вебинары, митапы, хакатоны, конференции, мастер-классы и другие события в IT-сфере.
Будут представлены как крупные мероприятия от ведущих компаний, так и мероприятия, проводимые опытными специалистами в области программирования.
Подписывайся на IT-мероприятии России!
Чтобы быть в курсе всех полезных событий, рекомендую подписаться на канал, где собраны все IT-мероприятия России.
Там вы найдете информацию о различных мероприятиях, таких как вебинары, митапы, хакатоны, конференции, мастер-классы и другие события в IT-сфере.
Будут представлены как крупные мероприятия от ведущих компаний, так и мероприятия, проводимые опытными специалистами в области программирования.
Подписывайся на IT-мероприятии России!
👍6🔥2
👍24🔥4❤1🎉1
- Умение эффективно работать в проектах, где есть Spring
✔️ Знание современных возможностей Spring
✔️ Понимание, как создавать Web-приложения на микросервисной архитектуре и решать высокоуровневые задачи по разработке
✔️ Умение быстро проходить путь от идеи до production-grade
✔️ Владение фреймворками Spring и технологиями вспомогательных проектов (Spring MVC, Spring Security, Spring Boot, Spring Reactive Stack, Spring 5)
Пройдите бесплатное вступительное тестирование прямо сейчас и узнайте, готовы ли вы стать студентом!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
Какова структура Java Collections Framework? Почему Map не Collection?
Collection – хранилище отдельных значений, Map – хранилище ключ-значение. Отсюда разные методы этих интерфейсов. Если проще, разные сигнатуры методов put и add.
Collection в свою очередь делится на три основных группы, и соответствующих им интерфейса:
🔘 List – упорядоченные списки с возможностью содержания дубликатов и доступа по индексу (random access);
🔘 Queue – обычно FIFO-коллекции, предполагает добавление/удаление элементов с края. Интерфейс-наследник Deque – двусвязная очередь;
🔘 Set – не обязательно упорядоченный набор уникальных (с точки зрения equals) значений;
HashMap можно привести к виду Collection вызвав например keySet(), entrySet() или values().
Collection – хранилище отдельных значений, Map – хранилище ключ-значение. Отсюда разные методы этих интерфейсов. Если проще, разные сигнатуры методов put и add.
Collection в свою очередь делится на три основных группы, и соответствующих им интерфейса:
🔘 List – упорядоченные списки с возможностью содержания дубликатов и доступа по индексу (random access);
🔘 Queue – обычно FIFO-коллекции, предполагает добавление/удаление элементов с края. Интерфейс-наследник Deque – двусвязная очередь;
🔘 Set – не обязательно упорядоченный набор уникальных (с точки зрения equals) значений;
HashMap можно привести к виду Collection вызвав например keySet(), entrySet() или values().
👍20🔥3🥴1
Какой результат выведет следующая программа?
Anonymous Quiz
62%
A is equal to Infinity
15%
A is equal to NaN
14%
Ошибку при выполнении
9%
Ошибку компиляции
👍19🎉5
🔥 Хардовый тест для разработчиков 🔥
📕 Ответьте на 9 вопросов за20 мин и проверьте, насколько вы готовы к обучению на курсе - «Архитектура и шаблоны проектирования»
💻 Научитесь применять шаблоны проектирования в разработках! Благодаря этому навыку вы сможете писать чистый код, экономить время на разработке и быстро «пересаживаться» на любой язык программирования.
🏵 Ждем всех, кто хочет вырасти до Middle+ разработчика или архитектора ПО!
👉 ПРОЙТИ ТЕСТ https://otus.pw/dgYH/
💣 Пройдете тест, получите демо-ролик о занятиях на курсе и Welcome-скидку.
✅ Также вам откроется доступ к открытым урокам курса.
Реклама. Информация о рекламодателе на сайте www.otus.ru
📕 Ответьте на 9 вопросов за
💻 Научитесь применять шаблоны проектирования в разработках! Благодаря этому навыку вы сможете писать чистый код, экономить время на разработке и быстро «пересаживаться» на любой язык программирования.
🏵 Ждем всех, кто хочет вырасти до Middle+ разработчика или архитектора ПО!
👉 ПРОЙТИ ТЕСТ https://otus.pw/dgYH/
💣 Пройдете тест, получите демо-ролик о занятиях на курсе и Welcome-скидку.
✅ Также вам откроется доступ к открытым урокам курса.
Реклама. Информация о рекламодателе на сайте www.otus.ru
👍6🔥2
Как работает HashMap?
Один из популярнейших вопросов, потому что содержит много нюансов. Лучше всего подготовиться к нему помогает чтение исходного кода HashMap.
Нюансы которые стоит повторить и запомнить:
🔘 Общий принцип: внутренний массив table, содержащий бакеты (корзины) – списки элементов с одинаковыми пересчитанными хэш-суммами;
🔘 Пересчет хэш-суммы для умещения int индексов в capacity ячейках table;
🔘 rehash – удвоение размера table при достижении threshold (capacity*loadFactor) занятых бакетов;
🔘 Невозможность сжать однажды раздувшийся table;
🔘 Два способа разрешения коллизий: используемый в HashMap метод цепочек и альтернатива – открытая адресация;
🔘 Варианты для многопоточного использования: пересинхронизированная Hashtable и умная ConcurrentHashMap;
🔘 Оптимизация Java 8: превращение списка в бакете в дерево при достижении 8 элементов – при большом количестве коллизий скорость доступа растет с O(n) до O(log(n));
🔘 Явное использование бакета 0 для ключа null;
🔘 Связь с HashSet – HashMap, в котором используются только ключи;
🔘 Нет гарантий порядка элементов;
Обсуждая этот вопрос на интервью вы обязательно затронете особенности методов equals/hashCode. Возможно придется поговорить об альтернативных хранилищах ключ-значение – TreeMap, LinkedHashMap.
Один из популярнейших вопросов, потому что содержит много нюансов. Лучше всего подготовиться к нему помогает чтение исходного кода HashMap.
Нюансы которые стоит повторить и запомнить:
🔘 Общий принцип: внутренний массив table, содержащий бакеты (корзины) – списки элементов с одинаковыми пересчитанными хэш-суммами;
🔘 Пересчет хэш-суммы для умещения int индексов в capacity ячейках table;
🔘 rehash – удвоение размера table при достижении threshold (capacity*loadFactor) занятых бакетов;
🔘 Невозможность сжать однажды раздувшийся table;
🔘 Два способа разрешения коллизий: используемый в HashMap метод цепочек и альтернатива – открытая адресация;
🔘 Варианты для многопоточного использования: пересинхронизированная Hashtable и умная ConcurrentHashMap;
🔘 Оптимизация Java 8: превращение списка в бакете в дерево при достижении 8 элементов – при большом количестве коллизий скорость доступа растет с O(n) до O(log(n));
🔘 Явное использование бакета 0 для ключа null;
🔘 Связь с HashSet – HashMap, в котором используются только ключи;
🔘 Нет гарантий порядка элементов;
Обсуждая этот вопрос на интервью вы обязательно затронете особенности методов equals/hashCode. Возможно придется поговорить об альтернативных хранилищах ключ-значение – TreeMap, LinkedHashMap.
👍24🔥4