Books for Java and SQL
211 subscribers
29 photos
2 videos
23 files
67 links
All of the best books for java/SQL and some other👌
Download Telegram
Forwarded from Библиотека программиста
#git

Ну что, сверяем ответы?

1. В чем отличие git от svn? Отличий достаточно много, но из основных можно выделить следующие:
– Git – распределенная система, а svn – нет. Это позволяет хранить репозиторий (его копию) у каждого разработчика, работающего с данной системой. Практически каждая операция выполняется с данными на локальном диске, что достаточно быстро и может быть выполнено в оффлайн режиме. Вы можете выполнять команды «commit», «diff», «log», «branch», «merge», создавать аннотации к файлам и многое другое, полностью в оффлайн режиме.
– Git сохраняет метаданные изменений, а svn целые файлы. Это экономит место и время.
– В git рабочий процесс не имеет единой точки отказа. Поскольку каждый разработчик, работающий над проектом, имеет по сути его резервную копию, потеря связи с серверами ничем ему не грозит.

2. Как взять удаленные изменения?
– С помощью команды «git fetch <url>», которая связывается с указанным удаленным проектом и забирает все те данные проекта, которых у вас еще нет. После выполнения команды должны появиться ссылки на все ветки из этого удалённого проекта, которые вы можете просмотреть или слить в любой момент.

3. Что делает «git stash»?
– Довольно часто при работе с git возникает ситуация, когда необходимо обновиться (сделать pull), но при этом коммитить сырой код не хочется. Команда «git stash» скрывает все сделанные изменения и переводит код в состояние HEAD. Последовательность команд в данном случае такая:
$ git stash
$ git pull
$ git stash apply

4. В чем отличие «git pull» от «git fetch»?
– «git pull» – это, по сути, команда «git fetch», после которой сразу же следует «git merge». «git fetch» получает изменения с сервера и сохраняет их в каталог refs/remotes/. Это никак не влияет на локальные ветки и текущие изменения. А «git merge» уже вливает все эти изменения в локальную копию.

5. В чем отличие «git merge» от «git rebase»?
– «git merge» – слияние изменений из одной ветки в другую. Независимо от того, созданы ли ветки для тестирования, исправления ошибок или по другим причинам, слияние фиксирует изменения в другом месте. Слияние принимает содержимое ветки источника и объединяет их с целевой веткой. В этом процессе изменяется только целевая ветка. История исходных веток остается неизменной. «git rebase» сжимает все изменения в один «патч». Затем он интегрирует патч в целевую ветку. В отличие от слияния, перемещение перезаписывает историю, потому что она передает завершенную работу из одной ветки в другую. В процессе устраняется нежелательная история.

6. В чем заключается стратегия Git Flow?
– Git Flow – одна из первых крупных стратегий ветвления, которая завоевала популярность. Git Flow описывает несколько веток для разработки, релизов и взаимодействия между ними: feature branches, release branches, hotfix branches.
Java EE 8 Recipes: A Problem-Solution Approach (2018)

Книга является руководством по Java EE 8, она подойдет Java-разработчикам, которые хотят создавать качественный рабочий код, не читая длинных скучных мануалов. Контент представлен в популярном формате задача-решение. Книга предоставляет читателю эффективные и проверенные решения, которые можно будет использовать в работе с практически любыми задачами.
The Java Module System (2019)

Книга является подробным руководством по созданию и использованию модулей в языке Java. С помощью простых для понимания примеров и описаний, читая книгу, вы сможете изучить анатомию модульного приложения. Попутно вы овладеете передовыми методами проектирования с помощью модулей, отладкой модульного приложения и его развертыванием.
Java Testing with Spock (2016)

Книга учит читателя использовать Spock в широком спектре вариантов тестирования в Java. В книге приводятся лучшие методики написания тестов, внедрения интеграционных тестов, использования встроенных инструментов тестирования от Spock и функционального веб-тестирования с использованием Geb. Читатели, плохо знакомые с Groovy, оценят краткое руководство по языку в книге, которое даст достаточно для эффективного использования Spock. Книга написана для Java-разработчиков, знание groovy и JUnit будет полезно, но не обязательно.
Channel photo updated
Channel name was changed to «Books for Java and SQL»
Effective Java (2018)

Поддержка в современной Java нескольких парадигм увеличивает потребность программиста в рекомендациях от опытных профессионалов, которые представлены в этой книге. Как и в предыдущих изданиях, каждая глава книги состоит из частей, представленных в виде коротких отдельных эссе, где содержатся конкретные советы, тонкости и обновлённые примеры кода. Подробные объяснения в каждой части описывают, что нужно делать и почему, и как поступать не стоит.
Горячие клавиши IntelliJ IDEA.
Think Java: How to Think Like a Computer Scientist (2016)

Данная книга написана для людей с небольшим опытом или вообще без опыта программирования. Цель книги — не просто научить читателя программировать на Java, но и помочь начать мыслить как специалист в области информатики. Каждая краткая глава охватывает материал, предназначенный для изучения за одну неделю и включает в себя упражнения, которые помогут вам практиковаться.
Forwarded from Java: fill the gaps
Stream API: обзор и основные методы.

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 по сигнатуре на него похож, поэтому получается неверный результат😒
Серия обучающих видео по многопоточности.

https://proglib.io/w/f90bdadd

#course
Forwarded from Java: fill the gaps
HashMap в Java 8.

О работе HashMap спрашивают и джуниоров, и сеньоров. Часто всё сводится к рассказу о бакетах и оценке сложности на базе статей 1998 года. С тех времён много изменилось. Этот пост о текущей структуре, особенностях и недостатках HashMap.

Как устроен HashMap?
В основе HashMap лежит массив начальных элементов, которые называют бакетами. Их количество зависит от количества элементов — подбирается ближайшая степень двойки. Если элементов 20, то создаётся 32 бакета.
Если хэш-функция ключа распределяет значения равномерно, то в каждом бакете будет 0 или 1 элемент.
На практике такое происходит редко, и значения хэшей элементов иногда совпадают. Тогда элементы с одинаковым хэш кодом организуются в список. Если их становится больше 8, то элементы перестраиваются в двоичное дерево.

Как определяется нужный бакет?
Популярное заблуждение - по остатку деления хэша на количество бакетов. Это не совсем так. Количество бакетов кратно степени двойки, и при вычислении используется логическое И.
В массиве из 16 бакетов последний элемент имеет номер 15, в битовом представлении это 1111. Операция & оставит последние 4 бита числа.
Сравним:
hash % 16
hash & 15
Результат будет одинаковый, но логическое И выполняется в 2 раза быстрее. Вычисление бакета — частая операция в HashMap, и такая микрооптимизация даёт хороший прирост в производительности.

Что такое 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.putAll(anotherMap);
Если бы внутренняя структура result создавалась в конструкторе, пришлось бы тут же её расширять. С отложенной инициализацией можно этого избежать.

А теперь разберём вопрос про порядок элементов:
Обход 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 - список каналов