Начать с вводных занятий можно здесь, ответив всего на 4 вопроса – https://proglib.io/w/12f47906
Что будет на демо?
🔹Вводный урок от CPO курса;
🔹Лекции со всеми преподавателями МГУ по темам: теория множеств, непрерывность функции, основные формулы комбинаторики, матрицы и операции над ними, градиентный спуск;
🔹Практические задания и дополнительные материалы!
Please open Telegram to view this post
VIEW IN TELEGRAM
Unit-тесты — это тесты, которые
Ключевые особенности:
🧩 Изоляция: Unit-тесты должны быть
🚀 Быстрота выполнения: Unit-тесты должны
🔄 Покрытие кода: Основная цель unit-тестов —
Please open Telegram to view this post
VIEW IN TELEGRAM
HashSet — это реализация множества (set), которое не допускает дублирующихся элементов. В его основе используется механизм хеширования для быстрого поиска, добавления и удаления элементов.
🔹 Хеш-таблица как основа
В основе HashSet лежит HashMap. Каждый элемент множества хранится в качестве ключа внутри объекта HashMap, а его значение всегда фиксированное — это специальный объект-заглушка. Этот объект используется для обозначения присутствия элемента, так как HashMap требует наличие пары "ключ-значение".
🔹 Хеширование
Когда вы добавляете элемент в HashSet, для него вычисляется хеш-код с помощью метода hashCode(). Этот хеш-код помогает определить, в какую "корзину" (bucket) поместится элемент. Если два элемента имеют одинаковый хеш-код (коллизия), они будут помещены в один и тот же бакет, и далее будут различаться с помощью метода equals().
🔹 Коллизии и структура бакета
До Java 8, если в бакет попадало несколько элементов (коллизия), они сохранялись в виде односвязного списка. Это приводило к тому, что в худшем случае производительность поиска и добавления элементов могла падать до O(n), если список становился слишком длинным.
С Java 8 при превышении 8 элементов в одном бакете, односвязный список преобразуется в красно-чёрное дерево, что улучшает производительность операций до O(log n). Когда количество элементов в бакете падает ниже 6, структура снова преобразуется обратно в связанный список для экономии памяти.
🔹 Добавление элементов
▪️ В среднем: добавление элемента занимает O(1), потому что благодаря хеш-кодам можно быстро находить нужную корзину для элемента.
▪️ В худшем случае: добавление элемента может занять O(n) до Java 8 (связный список) и O(log n) начиная с Java 8 (красно-чёрное дерево).
🔹 Удаление элементов
Удаление происходит также через хеш-код: ищется соответствующая корзина, а затем элемент удаляется, если он там есть. Сложность удаления аналогична добавлению: O(1) в среднем и O(n) или O(log n) в худшем случае (в зависимости от структуры бакета).
🔹 Преимущества и недостатки
▪️ Преимущества: Быстрое добавление, удаление и поиск элементов в среднем за O(1), так как используется хеширование. Улучшенная производительность с Java 8 благодаря использованию красно-чёрного дерева.
▪️ Недостатки: Не гарантирует порядок элементов, а при частых коллизиях, особенно в старых версиях Java, производительность может падать до O(n).
Please open Telegram to view this post
VIEW IN TELEGRAM
this — это ключевое слово в Java, которое
Важно: в static методах и контексте
Please open Telegram to view this post
VIEW IN TELEGRAM
🏎 Состояние гонки (Race Condition) — это ситуация, когда несколько потоков одновременно получают доступ к общему ресурсу без должной синхронизации. В результате поведение программы становится непредсказуемым, так как порядок выполнения потоков может влиять на конечный результат.
Пример:
public class RaceConditionStringBuilder {
public static void main(String[] args) throws InterruptedException {
StringBuilder sb = new StringBuilder(); // Общий ресурс
Runnable task = () -> {
for (int i = 0; i < 10000; i++) {
sb.append("A"); // Несинхронизированный доступ
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Result length: " + sb.length());
}
}
👀 Что происходит?
▪️ Два потока одновременно добавляют символ "A" в один и тот же StringBuilder объект. Поскольку StringBuilder не является потокобезопасным, возможны ошибки, такие как потеря данных или некорректные результаты.
▪️ Потоки не знают о действиях друг друга. Если два потока одновременно читают строку длиной 500, каждый добавляет свой символ "A", а затем оба записывают новую строку с длиной 501, одно добавление теряется. Это и есть состояние гонки — результат зависит от того, как потоки "успеют" выполнить свои операции.
▪️ Ожидаемая длина строки — 20000, но на практике результат может быть меньше.
🛠 Как исправить?
synchronized(sb) {
sb.append("A");
}
Please open Telegram to view this post
VIEW IN TELEGRAM
▪️ Литерал строки:
Это наиболее распространённый способ. При создании строки с помощью литерала, объект помещается в String Pool, и если строка уже существует в пуле, то повторное создание этой строки не происходит.
String str1 = "Hello";
▪️ Конструктор класса String:
Создание строки с использованием оператора new. При этом всегда создаётся новый объект в памяти, даже если строка уже существует.
String str2 = new String("Hello");
▪️ Метод valueOf():
Этот метод преобразует аргумент в строку. Например, передавая число или другой тип данных, он вернёт строковое представление.
String str3 = String.valueOf(123);
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Например, если переопределить toString(), можно для Day.MONDAY.toString() получить "Понедельник", вместо "MONDAY".
Пример в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека тестировщика | QA, тестирование, quality assurance, manual testing, autotesting, ручное тестирование, автотесты
Class getClass() —
void notify() —
protected void finalize() —
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
LinkedList — это двусвязный список, который реализует интерфейсы List, Deque и Queue, обеспечивая гибкость в работе с элементами на обоих концах структуры.
🔹 Структура LinkedList
LinkedList хранит свои элементы в виде узлов (Nodes), каждый из которых содержит три части:
▪️ Ссылку на предыдущий узел
▪️ Ссылку на следующий узел
▪️ Само значение элемента
Каждый узел существует разрозненно в памяти, в отличие от массивов, где все элементы хранятся последовательно. Это позволяет LinkedList динамически изменять размер и не требует перераспределения памяти при добавлении новых элементов.
🔹 Производительность
▪️ Добавление: При добавлении нового элемента создается новый узел, который вставляется между двумя существующими узлами, изменяя у них ссылки. Если добавление происходит в начало или конец, обновляются только ссылки на предыдущий или следующий узел. Операции на концах занимают O(1), тогда как добавление в середину требует прохождения списка до нужного узла, что занимает O(n).
▪️ Удаление: Удаление элемента работает аналогично добавлению — обновляются ссылки соседних узлов. Удаление на концах списка занимает O(1), в середине — O(n).
▪️ Поиск: Поскольку узлы хранятся в памяти разрозненно, LinkedList не поддерживает эффективный случайный доступ. Чтобы найти элемент, нужно последовательно проходить список от начала или конца, из-за чело сложность поиска O(n).
🔹 Использование памяти
LinkedList требует дополнительной памяти для хранения двух ссылок (на предыдущий и следующий узел) для каждого элемента, что делает его более затратным по памяти по сравнению с массивами или ArrayList.
🔹 Преимущества и недостатки
▪️ Преимущества: Эффективные операции добавления и удаления в начале и конце списка, отсутствие необходимости в перераспределении памяти. Полезен для реализации очередей и стеков.
▪️ Недостатки: Медленный доступ к элементам (O(n)), высокий расход памяти из-за хранения ссылок, элементы хранятся разрозненно в памяти, что может приводить к фрагментации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, друзья!
Какие форматы кроме обычных вопросов вам бы ещё было интересно увидеть? Пишите в комментариях.💬
Также ниже предлагаю несколько вариантов готовых форматов. Можем обсудить: какие лучше, какие хуже и как интересно реализовать их.
Сделаем контент ещё интереснее вместе🔼
Какие форматы кроме обычных вопросов вам бы ещё было интересно увидеть? Пишите в комментариях.
Также ниже предлагаю несколько вариантов готовых форматов. Можем обсудить: какие лучше, какие хуже и как интересно реализовать их.
Сделаем контент ещё интереснее вместе
Please open Telegram to view this post
VIEW IN TELEGRAM
Новые форматы (можно выбрать несколько):
Anonymous Poll
40%
Правда или миф (даётся факт, выбираете правда или миф, потом разбор вопроса)
83%
Частые ошибки на собеседовании (разбор вопросов, где часто ошибаются)
59%
Прогноз ошибок (даётся рабочий код, нужно найти узкое место и предположить, что может пойти не так)
23%
Дебаты (даётся вопрос, где нет верного ответа. В комментариях обсуждаются + и - каждого варианта)
8%
Оставить всё как есть, не нужно новых форматов
Please open Telegram to view this post
VIEW IN TELEGRAM
И переопределение (override), и перегрузка (overload) — это формы полиморфизма в Java, но они работают по-разному.
🔹 Переопределение происходит, когда
🔹 Перегрузка — это
Please open Telegram to view this post
VIEW IN TELEGRAM
Комментарии
Документация.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM