Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
Java Testing with Spock (2016)
Книга учит читателя использовать Spock в широком спектре вариантов тестирования в Java. В книге приводятся лучшие методики написания тестов, внедрения интеграционных тестов, использования встроенных инструментов тестирования от Spock и функционального веб-тестирования с использованием Geb. Читатели, плохо знакомые с Groovy, оценят краткое руководство по языку в книге, которое даст достаточно для эффективного использования Spock. Книга написана для Java-разработчиков, знание groovy и JUnit будет полезно, но не обязательно.
Книга учит читателя использовать Spock в широком спектре вариантов тестирования в Java. В книге приводятся лучшие методики написания тестов, внедрения интеграционных тестов, использования встроенных инструментов тестирования от Spock и функционального веб-тестирования с использованием Geb. Читатели, плохо знакомые с Groovy, оценят краткое руководство по языку в книге, которое даст достаточно для эффективного использования Spock. Книга написана для Java-разработчиков, знание groovy и JUnit будет полезно, но не обязательно.
Forwarded from Книги для программистов
Java Testing with Spock.pdf
12.3 MB
Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
Effective Java (2018)
Поддержка в современной Java нескольких парадигм увеличивает потребность программиста в рекомендациях от опытных профессионалов, которые представлены в этой книге. Как и в предыдущих изданиях, каждая глава книги состоит из частей, представленных в виде коротких отдельных эссе, где содержатся конкретные советы, тонкости и обновлённые примеры кода. Подробные объяснения в каждой части описывают, что нужно делать и почему, и как поступать не стоит.
Поддержка в современной Java нескольких парадигм увеличивает потребность программиста в рекомендациях от опытных профессионалов, которые представлены в этой книге. Как и в предыдущих изданиях, каждая глава книги состоит из частей, представленных в виде коротких отдельных эссе, где содержатся конкретные советы, тонкости и обновлённые примеры кода. Подробные объяснения в каждой части описывают, что нужно делать и почему, и как поступать не стоит.
Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
В видео автор рассказывает о том, как подготовиться к решению задач на знание алгоритмов на собеседованиях.
https://youtu.be/72jqTtfw2z4
https://youtu.be/72jqTtfw2z4
YouTube
IT Собеседование: Алгоритмы
В этом видео я собрал из своего опыта несколько рекомендаций как проходить собеседование по алгоритмам.
TOP 10 алгоритмов для интервью: http://www.programcreek.com/2012/11/top-10-algorithms-for-coding-interview/
Поддержи канал! https://seniorsoftwarevl…
TOP 10 алгоритмов для интервью: http://www.programcreek.com/2012/11/top-10-algorithms-for-coding-interview/
Поддержи канал! https://seniorsoftwarevl…
Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
Think Java: How to Think Like a Computer Scientist (2016)
Данная книга написана для людей с небольшим опытом или вообще без опыта программирования. Цель книги — не просто научить читателя программировать на Java, но и помочь начать мыслить как специалист в области информатики. Каждая краткая глава охватывает материал, предназначенный для изучения за одну неделю и включает в себя упражнения, которые помогут вам практиковаться.
Данная книга написана для людей с небольшим опытом или вообще без опыта программирования. Цель книги — не просто научить читателя программировать на Java, но и помочь начать мыслить как специалист в области информатики. Каждая краткая глава охватывает материал, предназначенный для изучения за одну неделю и включает в себя упражнения, которые помогут вам практиковаться.
Forwarded from Java: fill the gaps
Stream API: обзор и основные методы.
Stream API - удобный инструмент обработки данных, который появился в java 8. Два принципа, на которых строится Stream API - composition & single responsibility. Действия собираются из простых независимых друг от друга блоков без сайд-эффектов. Этим достигается удобство чтения и поддержки:
✅ Стандартные названия.
✅ Нет локальных переменных.
✅ Линейная последовательность действий.
Стрим состоит из 3 частей:
1️⃣ Источник данных.
2️⃣ Преобразования.
3️⃣ Конечная операция.
Основные способы создать стрим:
🔸 Из готовой коллекции
🔸 Из набора элементов
🔸 Из массива
🔸 Задать первый элемент и правило вывода последующего, получится бесконечный стрим:
🔸 Генерировать независимые друг от друга элементы:
🔹
🔹
🔹
🔹
🔹
Вычисления выполняются не сразу, а только когда вызывается конечная операция. Конечная операция описывает желаемый результат. Результатом может быть:
◾️ Структура данных:
◾️ Результат поиска:
◾️ Сайд-эффект:
Стрим - не структура хранения данных. Он обходит источник данных (или сам его генерирует) и сохраняет промежуточные результаты. По этой причине нельзя копировать стримы и исполнять их несколько раз - пришлось бы контролировать этапы исполнения, консистентность данных и добавить синхронизацию для работы в многопоточной среде. При попытке переиспользования стрима выбрасывается
✅ Исходные данные не меняются.
✅ Стрим нельзя переиспользовать.
✅ Пока не вызвана конечная операция, стрим можно менять как угодно.
Пример из опроса выше вернёт 1.
Если Вас раздражает, что метод
Stream API - удобный инструмент обработки данных, который появился в java 8. Два принципа, на которых строится Stream API - composition & single responsibility. Действия собираются из простых независимых друг от друга блоков без сайд-эффектов. Этим достигается удобство чтения и поддержки:
✅ Стандартные названия.
✅ Нет локальных переменных.
✅ Линейная последовательность действий.
Стрим состоит из 3 частей:
1️⃣ Источник данных.
2️⃣ Преобразования.
3️⃣ Конечная операция.
Основные способы создать стрим:
🔸 Из готовой коллекции
🔸 Из набора элементов
🔸 Из массива
🔸 Задать первый элемент и правило вывода последующего, получится бесконечный стрим:
Stream.iterate(T, BinaryOperator)
🔸 Задать первый элемент, правило вывода последующего и условие остановки: Stream.iterate(T, Predicate, BinaryOperator) (java 9) 🔸 Генерировать независимые друг от друга элементы:
Stream.generate(Supplier)
🔸 Из диапазона с включением граничных значений: IntStream.range(..)
🔸 Диапазон без граничных значений: IntStream.rangeClosed(..)
🔸 Из строк: BufferedReader.lines()
🔸 Из символов строки: CharSequence.chars()
Названия большинства методов преобразований говорят сами за себя: filter, distinct, limit, sorted. Есть менее понятные:🔹
map: применить функцию к каждому элементу.🔹
flatmap: положить элементы из "списка списков" в единый стрим. Также с его помощью можно уменьшить размерность массива.🔹
takeWhile(Predicate): брать элементы из стрима, пока выполняется условие. Метод доступен c java 9.🔹
dropWhile(Predicate): пропускать элементы, пока условие не нарушится. Метод доступен c java 9.🔹
peek(Consumer): сделать что-то с каждым элементом стрима, не меняя исходный стрим. Часто используется при дебаге, например, вывести в консоль текущие элементы.Вычисления выполняются не сразу, а только когда вызывается конечная операция. Конечная операция описывает желаемый результат. Результатом может быть:
◾️ Структура данных:
toArray, collect.◾️ Результат поиска:
anyMatch, allMatch, nonMatch, findFirst, findAny.
◾️ Результат агрегации: min, max, count, reduce.◾️ Сайд-эффект:
forEach, forEachOrdered.Стрим - не структура хранения данных. Он обходит источник данных (или сам его генерирует) и сохраняет промежуточные результаты. По этой причине нельзя копировать стримы и исполнять их несколько раз - пришлось бы контролировать этапы исполнения, консистентность данных и добавить синхронизацию для работы в многопоточной среде. При попытке переиспользования стрима выбрасывается
IllegalStateException.✅ Исходные данные не меняются.
✅ Стрим нельзя переиспользовать.
✅ Пока не вызвана конечная операция, стрим можно менять как угодно.
Пример из опроса выше вернёт 1.
list.remove(0) удаляет элемент с индексом 0, поэтому на момент старта вычислений stream.count() в источнике данных остаётся всего один элемент.Если Вас раздражает, что метод
list.remove принимает не сам элемент, а индекс, то некоторые методы Stream API Вас тоже разочаруют. Например, такой код компилируется:Stream.of(-1, 0, 1).max(Math::max).get();Но в результате получается -1, потому что входной параметр метода
max - Comparator. Math.max по сигнатуре на него похож, поэтому получается неверный результат😒Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
Forwarded from Java: fill the gaps
HashMap в Java 8.
О работе HashMap спрашивают и джуниоров, и сеньоров. Часто всё сводится к рассказу о бакетах и оценке сложности на базе статей 1998 года. С тех времён много изменилось. Этот пост о текущей структуре, особенностях и недостатках HashMap.
❓Как устроен HashMap?
В основе HashMap лежит массив начальных элементов, которые называют бакетами. Их количество зависит от количества элементов — подбирается ближайшая степень двойки. Если элементов 20, то создаётся 32 бакета.
Если хэш-функция ключа распределяет значения равномерно, то в каждом бакете будет 0 или 1 элемент.
На практике такое происходит редко, и значения хэшей элементов иногда совпадают. Тогда элементы с одинаковым хэш кодом организуются в список. Если их становится больше 8, то элементы перестраиваются в двоичное дерево.
❓Как определяется нужный бакет?
Популярное заблуждение - по остатку деления хэша на количество бакетов. Это не совсем так. Количество бакетов кратно степени двойки, и при вычислении используется логическое И.
В массиве из 16 бакетов последний элемент имеет номер 15, в битовом представлении это 1111. Операция & оставит последние 4 бита числа.
Сравним:
❓Что такое load factor и зачем он нужен?
HashMap быстро работает, когда в бакете 0 или 1 элемент. При добавлении элементов повышается шанс, что в одном бакете их будет несколько, a HashMap станет менее эффективен. Поэтому HashMap периодически расширяется. Параметр load factor определяет, когда это происходит. По умолчанию равен 0.75.
Пример: в HashMap 20 элементов и 32 бакета. Когда элементов будет 32*0.75=24, количество бакетов удвоится и элементы перераспределятся по ним.
❓Какие недостатки у HashMap?
1️⃣ Cильная зависимость от функции распределения хэшей.
2️⃣ Неэкономный расход памяти. При load factor = 0.75 будет пустовать 25% памяти. При неравномерном распределении хэшей — ещё больше.
❓В конструкторе HashMap проставляются свойства, а массив бакетов создаётся только при первой вставке. Зачем нужна ленивая инициализация?
Расширение HashMap — долгая операция. Когда добавляется набор элементов, можно сразу увеличить массив до необходимого размера. Очень популярный случай - когда в пустой HashMap добавляютcя элементы другой map:
А теперь разберём вопрос про порядок элементов:
✅ Обход HashMap происходит последовательно - бакет за бакетом. Поэтому задание сводится к определению бакетов, в которые попадут значения. Это и будет порядок вывода элементов:
Ответ: 20 10 30
О работе HashMap спрашивают и джуниоров, и сеньоров. Часто всё сводится к рассказу о бакетах и оценке сложности на базе статей 1998 года. С тех времён много изменилось. Этот пост о текущей структуре, особенностях и недостатках HashMap.
❓Как устроен HashMap?
В основе HashMap лежит массив начальных элементов, которые называют бакетами. Их количество зависит от количества элементов — подбирается ближайшая степень двойки. Если элементов 20, то создаётся 32 бакета.
Если хэш-функция ключа распределяет значения равномерно, то в каждом бакете будет 0 или 1 элемент.
На практике такое происходит редко, и значения хэшей элементов иногда совпадают. Тогда элементы с одинаковым хэш кодом организуются в список. Если их становится больше 8, то элементы перестраиваются в двоичное дерево.
❓Как определяется нужный бакет?
Популярное заблуждение - по остатку деления хэша на количество бакетов. Это не совсем так. Количество бакетов кратно степени двойки, и при вычислении используется логическое И.
В массиве из 16 бакетов последний элемент имеет номер 15, в битовом представлении это 1111. Операция & оставит последние 4 бита числа.
Сравним:
hash % 16Результат будет одинаковый, но логическое И выполняется в 2 раза быстрее. Вычисление бакета — частая операция в HashMap, и такая микрооптимизация даёт хороший прирост в производительности.
hash & 15
❓Что такое load factor и зачем он нужен?
HashMap быстро работает, когда в бакете 0 или 1 элемент. При добавлении элементов повышается шанс, что в одном бакете их будет несколько, a HashMap станет менее эффективен. Поэтому HashMap периодически расширяется. Параметр load factor определяет, когда это происходит. По умолчанию равен 0.75.
Пример: в HashMap 20 элементов и 32 бакета. Когда элементов будет 32*0.75=24, количество бакетов удвоится и элементы перераспределятся по ним.
❓Какие недостатки у HashMap?
1️⃣ Cильная зависимость от функции распределения хэшей.
2️⃣ Неэкономный расход памяти. При load factor = 0.75 будет пустовать 25% памяти. При неравномерном распределении хэшей — ещё больше.
❓В конструкторе HashMap проставляются свойства, а массив бакетов создаётся только при первой вставке. Зачем нужна ленивая инициализация?
Расширение HashMap — долгая операция. Когда добавляется набор элементов, можно сразу увеличить массив до необходимого размера. Очень популярный случай - когда в пустой HashMap добавляютcя элементы другой map:
Map result=new HashMap();Если бы внутренняя структура result создавалась в конструкторе, пришлось бы тут же её расширять. С отложенной инициализацией можно этого избежать.
...
result.putAll(anotherMap);
А теперь разберём вопрос про порядок элементов:
✅ Обход HashMap происходит последовательно - бакет за бакетом. Поэтому задание сводится к определению бакетов, в которые попадут значения. Это и будет порядок вывода элементов:
10 % 16 = 10
20 % 16 = 4
30 % 16 = 14
Ответ: 20 10 30
Forwarded from Deleted Account
https://javarush.ru/ - платный курс
https://itproger.com/course/java/ - курс обучения с платными заданиями.
https://www.youtube.com/watch?v=Zxpz5tRrUvU&list=PL0lO_mIqDDFW2xXiWSfjT7hEdOUZHVNbK - видеоуроки по java от itproger
https://metanit.com/java/tutorial/ - курс джава, лекции + бесплатные задания.
https://habr.com/ru/post/440436/#10 - задачи по джава.
https://jsehelper.blogspot.com/2016/01/blog-post_59.html - список вопросов на собеседование.
https://javarush.ru/groups/posts/2434-podborka-youtube-kanalih-blogi-i-podkastih-dlja-java-programmistov - список каналов
https://itproger.com/course/java/ - курс обучения с платными заданиями.
https://www.youtube.com/watch?v=Zxpz5tRrUvU&list=PL0lO_mIqDDFW2xXiWSfjT7hEdOUZHVNbK - видеоуроки по java от itproger
https://metanit.com/java/tutorial/ - курс джава, лекции + бесплатные задания.
https://habr.com/ru/post/440436/#10 - задачи по джава.
https://jsehelper.blogspot.com/2016/01/blog-post_59.html - список вопросов на собеседование.
https://javarush.ru/groups/posts/2434-podborka-youtube-kanalih-blogi-i-podkastih-dlja-java-programmistov - список каналов
Forwarded from Nick
Cay S. Horstmann: free download. Ebooks library. On-line books store on Z-Library
https://1lib.eu/g/Cay%20S.%20Horstmann?regionChanged=&redirect=1262504
https://1lib.eu/g/Cay%20S.%20Horstmann?regionChanged=&redirect=1262504
b-ok.cc
Cay S. Horstmann: free download. Ebooks library. On-line books store on Z-Library
Cay S. Horstmann: free download. Ebooks library. On-line books store on Z-Library | B–OK. Download books for free. Find books
