📓"Классические задачи Computer Science на языке Java"
Столкнулись с «неразрешимой» проблемой при разработке программного обеспечения? Скорее всего, кто-то уже справился с этой задачей, и вы можете не ломать голову. Дэвид Копец собрал наиболее полезные готовые решения, принципы и алгоритмы. «Классические задачи Computer Science на языке Java» — это мастер-класс по программированию, содержащий 55 практических примеров, затрагивающих самые актуальные темы: базовые алгоритмы, ограничения, искусственный интеллект и многое другое.
➡️ Книга
@javatg
Столкнулись с «неразрешимой» проблемой при разработке программного обеспечения? Скорее всего, кто-то уже справился с этой задачей, и вы можете не ломать голову. Дэвид Копец собрал наиболее полезные готовые решения, принципы и алгоритмы. «Классические задачи Computer Science на языке Java» — это мастер-класс по программированию, содержащий 55 практических примеров, затрагивающих самые актуальные темы: базовые алгоритмы, ограничения, искусственный интеллект и многое другое.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
☕🧵 Введение в многопоточность в Java. Часть 1. Преимущества и недостатки многопоточности
Независимо от того, какой язык вы используете для написания своих программ, по умолчанию все они являются последовательными. То есть все инструкции, которые мы пишем, последовательно выполняются операционной системой. Следующая строка кода не может начать свое выполнение до завершения текущей и ждет, пока текущая строка не завершит свое выполнение. Если в программе есть вызов API к удаленному серверу, то программа блокируется до тех пор, пока не получит ответ к запросу. Если выполнение вызова занимает несколько минут, то нам придётся также ждать ответа программы. Программа в таком случае просто блокируется и не будет отвечать на дальнейшие команды.
Давайте рассмотрим другие распространенные сценарии. Например, вы используете какую-то социальную сеть, где скачиваете видео или изображения и одновременно общаетесь там со своими друзьями. Вы выполняете две разные задачи одновременно, и ваша программа не блокируется, пока она не завершит одну из своих задач. Как? Здесь в игру вступает многопоточность.
➡️ Читать дальше
@javatg
Независимо от того, какой язык вы используете для написания своих программ, по умолчанию все они являются последовательными. То есть все инструкции, которые мы пишем, последовательно выполняются операционной системой. Следующая строка кода не может начать свое выполнение до завершения текущей и ждет, пока текущая строка не завершит свое выполнение. Если в программе есть вызов API к удаленному серверу, то программа блокируется до тех пор, пока не получит ответ к запросу. Если выполнение вызова занимает несколько минут, то нам придётся также ждать ответа программы. Программа в таком случае просто блокируется и не будет отвечать на дальнейшие команды.
Давайте рассмотрим другие распространенные сценарии. Например, вы используете какую-то социальную сеть, где скачиваете видео или изображения и одновременно общаетесь там со своими друзьями. Вы выполняете две разные задачи одновременно, и ваша программа не блокируется, пока она не завершит одну из своих задач. Как? Здесь в игру вступает многопоточность.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
#algorithms #java
В этом репозитории представлен список самых популярных алгоритмов, реализованных на языке программирования Java.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Пользовательский интерфейс администратора для администрирования приложений spring boot
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Xposed — это фреймворк для модулей, которые могут изменить поведение системы и приложений, не затрагивая никаких APK. Это полезно, потому что это означает, что модули могут работать для разных версий и даже ПЗУ без каких-либо изменений (при условии, что исходный код не был слишком сильно изменен).
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring поддерживает проверки на основе аннотаций JSR-303, а также предоставляет интерфейс валидатора, который мы можем реализовать для создания нашего собственного настраиваемого валидатора. Для использования проверки на основе JSR-303 нам необходимо аннотировать переменные компонента с необходимыми проверками.
Для кастомной реализации валидатора нам нужно настроить его в классе контроллера. Полный пример см. в статье.
#вопросы_с_собеседований
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Digitalocean
Spring Validation Example - Spring MVC Form Validator | DigitalOcean
Technical tutorials, Q&A, events — This is an inclusive place where developers can find or lend support and discover new ways to contribute to the community.
Если вы подумываете начать карьеру программиста с Java-разработки в сфере бэкенда, то в этой статье вы найдёте чек-лист знаний, которые точно пригодятся на старте.
Вместе с Семёном Кирековым, Java Team Lead в MTS Big Data и Java-деканом курса «Java-разработчик» в МТС.Тета, собрали набор базовых навыков и инструментов, необходимых для того, чтобы ориентироваться в профессии backend-разработчика на Java.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Высокопроизводительная библиотека кэширования для Java. Caffeine обеспечивает кеширование в памяти с использованием API, наподобие Google Guava.
📃 Документация
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("one");
stringList.add("one and a half");
stringList.add("two");
stringList.add("two and a half");
stringList.add("three and a half");
System.out.println("Before " + stringList);
Iterator<String> stringIterator = stringList.iterator();
while (stringIterator.hasNext()) {
String next = stringIterator.next();
if (next.equals("two and a half")) {
stringList.add("three");
}
}
System.out.println("After " + stringList);
}
Ответ
Exception in thread "main" java.util.ConcurrentModificationException
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Шпаргалка по Maven
Maven — один из самых популярных и удобных инструментов для управления и сборки проектов на Java. Сохраняй и делись с друзьями!
#cheatsheet #java
@javatg
Maven — один из самых популярных и удобных инструментов для управления и сборки проектов на Java. Сохраняй и делись с друзьями!
#cheatsheet #java
@javatg
Метод equals() в Java
Как вы наверняка знаете, сравнение посредством == в Java сравнивает ссылки, но объекты таким образом не сравнить. Следующий пример подобного сравнения двух строк вернёт false:
public static void main(String[] args) {
//false
System.out.println(new String("Tproger") == new String("Tproger"));
}
Пусть значения и одинаковы, но переменные String указывают на разные объекты.
Тут-то в игру и вступает метод equals(), предусмотренный в Java для сравнения именно объектов. Данный метод проверяет два объекта одного происхождения на логическую равность.
То есть, сравнивая два объекта, программисту необходимо понять, эквивалентны ли их поля. При этом необязательно все поля должны быть идентичными, поскольку метод equals() подразумевает именно логическое равенство.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Задан массив (или ArrayList, как вам больше нравится) целых чисел, в котором содержатся элементы Integer от 1 до 100. В этом массиве есть один и только один продублированный элемент. Как его найти?
Такие задачи для Java-программиста привычнее, чем предыдущие три. Потому что она не о знании тонкостей языка, которые почти никогда не используются, а о логике.
Первый необузданный порыв — решать перебором — пропадает довольно быстро, когда включается голова или там установка «я же программист, я же умный». Плохо только, что на собеседовании, в условиях стресса, этого может и не произойти. Так что думайте сейчас, прежде, чем заглядывать в решение!
Алгоритм решения следующий:
Посчитайте сумму всех чисел от 1 до 100. Думаем, вы знаете, как это можно сделать (например, с помощью знаменитого метода Гаусса)
Теперь считаете сумму элементов вашего массива или ArrayList’а.
И… вычитаете первую сумму из второй.
Бинго! Полученное число — и есть значение дублирующегося элемента.
Код решения java-задачи для ArrayList.
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class FindDuplicate {
private static void findDuplicate(List<Integer> elements) {
//находим сумму всех уникальных элементов списка
int distinctSum = elements.stream().distinct().mapToInt(e -> e).sum();
//находим сумму всех элементов списка
int totalSum = elements.stream().mapToInt(e -> e).sum();
System.out.println("Элемент, который повторяется : " + (totalSum - distinctSum));
}
public static void main(String[] args) {
//создаем список последовательных элементов на промежутке [1..101).
List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
//устанавливаем элементу с индексом 53 значение 23
elements.set(53, 23);
findDuplicate(elements);
}
}
Другое решение
import java.util.List;
import java.util.ArrayList;
public class Duplicate {
public int findDuplicateNumber(List<Integer> numbers) {
int highestNumber = numbers.size() - 1;
int total = getSum(numbers);
int duplicate = total - (highestNumber * (highestNumber + 1) / 2);
return duplicate;
}
public int getSum(List<Integer> numbers) {
int sum = 0;
for (int num : numbers) {
sum = sum + num;
}
return sum;
}
public static void main(String a[]) {
List <Integer> numbers = new ArrayList <Integer>();
for (int i = 1; i < 100; i++) {
numbers.add(i);
}
//добавляем дубликат в список
numbers.add(25);
Duplicate dn = new Duplicate();
System.out.println("Элемент, который повторяется: " + dn.findDuplicateNumber(numbers));
}
}
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание бесконечного цикла на пустом месте
Дан блок кода. Дополните его так, чтобы цикл стал бесконечным.
class ToInfinity {
public static void main(String[] args) {
//впишите код сюда
for (int i = start; i <= start + 1; i++) {
/* тут должен быть бесконечный цикл, менять ничего нельзя*/
}
}
}
«Ничего сложного», — скажете вы. Скорее всего, вы не раз попадали в такую историю: решая задачи по Java, вы создавали бесконечный цикл и думали, как от него избавиться. Тут же наоборот. Хитрость в том, что сам цикл и условия выхода из него менять нельзя. Есть только две итерации. Тем не менее, их вполне достаточно, чтобы создать бесконечный цикл.
Похоже, что он должен работать только для двух итераций, но его можно сделать бесконечным, за счет использования переполнения. Уже догадались, как?
Решение
За счёт переполнения. Integer.MAX_VALUE — максимальное значение, которое int может хранить в Java. Если вы достигаете Integer.MAX_VALUE и инкрементируете это значение, то скатываетесь к Integer.MIN_VALUE, то есть, к минимальному значению Integer. Таким образом, для решения этой Java-задачи нам достаточно присвоить переменной start значение на 1 меньшее, чем максимальное для типа данных int.
Код задачи на Java:
class ToInfinity {
public static void main(String[] args) {
int start = Integer.MAX_VALUE - 1;
for (int i = start; i <= start + 1; i++) {
//бесконечный цикл
System.out.println(i); //убеждаемся в бесконечности цикла
}
}
}
Что получается? Мы начинаем со start=2147483645 (Integer.MAX_VALUE-1), на следующей итерации значение становится 2147483645, потом 2147483646, затем -2147483648, -2147483647… и так далее.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Создайте комментарий, который будет выполнятся
Ну вот, приехали! С самых первых лекций мы слышали о том, что комментарии не выполняются. На то они и комментарии. Думаем, решение этой задачи для Java-программиста, даже опытного, — не всегда очевидно. Тем не менее, есть один хитрый способ, как заставить Java-машину «легально» запустить комментарий на выполнение. Чувствуете, откуда ветер дует? Попробуйте предположить!
Решение
Код решения задачи на Java:
public class ExecutableComment {
public static void main(String[] args) {
// комментарий ниже будет выполнен!
// \u000d System.out.println("выполняемый комментарий");
}
}
Если набрать код этой задачи по джава в IDE, вот что мы получим:
выполняемый комментарий
Причина в том, что компилятор Java считывает Unicod-символ \u000d как новую строку, и читает наш код следующим образом:
Расшифрованный компилятором код решения задачи на Java:
public class ExecutableComment {
public static void main(String[] args) {
// the line below this gives an output
// \u000d
System.out.println("comment executed");
}
}
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM