Telegram Web Link
📓"Классические задачи Computer Science на языке Java"

Столкнулись с «неразрешимой» проблемой при разработке программного обеспечения? Скорее всего, кто-то уже справился с этой задачей, и вы можете не ломать голову. Дэвид Копец собрал наиболее полезные готовые решения, принципы и алгоритмы. «Классические задачи Computer Science на языке Java» — это мастер-класс по программированию, содержащий 55 практических примеров, затрагивающих самые актуальные темы: базовые алгоритмы, ограничения, искусственный интеллект и многое другое.

➡️ Книга

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🧵 Введение в многопоточность в Java. Часть 1. Преимущества и недостатки многопоточности

Независимо от того, какой язык вы используете для написания своих программ, по умолчанию все они являются последовательными. То есть все инструкции, которые мы пишем, последовательно выполняются операционной системой. Следующая строка кода не может начать свое выполнение до завершения текущей и ждет, пока текущая строка не завершит свое выполнение. Если в программе есть вызов API к удаленному серверу, то программа блокируется до тех пор, пока не получит ответ к запросу. Если выполнение вызова занимает несколько минут, то нам придётся также ждать ответа программы. Программа в таком случае просто блокируется и не будет отвечать на дальнейшие команды.

Давайте рассмотрим другие распространенные сценарии. Например, вы используете какую-то социальную сеть, где скачиваете видео или изображения и одновременно общаетесь там со своими друзьями. Вы выполняете две разные задачи одновременно, и ваша программа не блокируется, пока она не завершит одну из своих задач. Как? Здесь в игру вступает многопоточность.

➡️ Читать дальше

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Шпаргалка по синтаксису Java

#java #cheatsheet

@javatg
🖥 The Algorithms - Java

#algorithms #java

В этом репозитории представлен список самых популярных алгоритмов, реализованных на языке программирования Java.

🔩 Github

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Spring Boot Admin

Пользовательский интерфейс администратора для администрирования приложений spring boot

🖥 Github
➡️ Быстрый старт

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 LSPosed Framework

Xposed — это фреймворк для модулей, которые могут изменить поведение системы и приложений, не затрагивая никаких APK. Это полезно, потому что это означает, что модули могут работать для разных версий и даже ПЗУ без каких-либо изменений (при условии, что исходный код не был слишком сильно изменен).

🖥 Github

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как валидировать данные формы в Spring Web MVC Framework?

Spring поддерживает проверки на основе аннотаций JSR-303, а также предоставляет интерфейс валидатора, который мы можем реализовать для создания нашего собственного настраиваемого валидатора. Для использования проверки на основе JSR-303 нам необходимо аннотировать переменные компонента с необходимыми проверками.

Для кастомной реализации валидатора нам нужно настроить его в классе контроллера. Полный пример см. в статье.

#вопросы_с_собеседований

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как войти в backend-разработку на Java

Если вы подумываете начать карьеру программиста с Java-разработки в сфере бэкенда, то в этой статье вы найдёте чек-лист знаний, которые точно пригодятся на старте.

Вместе с Семёном Кирековым, Java Team Lead в MTS Big Data и Java-деканом курса «Java-разработчик» в МТС.Тета, собрали набор базовых навыков и инструментов, необходимых для того, чтобы ориентироваться в профессии backend-разработчика на Java.

➡️ Читать дальше

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Caffeine

Высокопроизводительная библиотека кэширования для Java. Caffeine обеспечивает кеширование в памяти с использованием API, наподобие Google Guava.

🖥 Github
📃 Документация

@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);
}


Ответ

Before [one, one and a half, two, two and a half, three and a half]
Exception in thread "main" java.util.ConcurrentModificationException


При попытке добавить элемент в список возникнет исключение связанное с попыткой изменить список , по которому итерируемся, так как итератор для ArrayList изначально это fail-fast итератор. В таком случае необходимо использовать fail-safe итераторы, они работают с клоном коллекции которую потребовалось изменить. В данном случае можно использовать CopyOnWriteArrayList.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Горячие клавиши для IntelliJ IDEA (самая популярная среда для Java)

#cheatsheet #java

@javatg
📌 Шпаргалка по Maven

Maven — один из самых популярных и удобных инструментов для управления и сборки проектов на Java. Сохраняй и делись с друзьями!

#cheatsheet #java

@javatg
📌 Шпаргалка по синтаксису Java

#java #cheatsheet

@javatg
🖥 Методы equals() и hashcode() в языке Java

Метод 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
🖥 Задача c собеседования

Задан массив (или 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
🖥 Задача c собеседования

Создание бесконечного цикла на пустом месте

Дан блок кода. Дополните его так, чтобы цикл стал бесконечным.

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
🖥 Задача c собеседования

Создайте комментарий, который будет выполнятся

Ну вот, приехали! С самых первых лекций мы слышали о том, что комментарии не выполняются. На то они и комментарии. Думаем, решение этой задачи для 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
2024/10/03 17:18:26
Back to Top
HTML Embed Code: