Лучший способ получать свежие обновлении и следить за трендами в разработке.
Машинное обучение: www.tg-me.com/ai_machinelearning_big_data
Python: www.tg-me.com/pythonl
C#: www.tg-me.com/csharp_ci
C/C++/ www.tg-me.com/cpluspluc
Data Science: www.tg-me.com/data_analysis_ml
Devops: www.tg-me.com/devOPSitsec
Go: www.tg-me.com/Golang_google
Базы данных: www.tg-me.com/sqlhub
Rust: www.tg-me.com/rust_code
Javascript: www.tg-me.com/javascriptv
React: www.tg-me.com/react_tg
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Мобильная разработка: www.tg-me.com/mobdevelop
Linux: www.tg-me.com/+A8jY79rcyKJlYWY6
Big Data: www.tg-me.com/bigdatai
Хакинг: www.tg-me.com/linuxkalii
Тестирование: https://www.tg-me.com/+F9jPLmMFqq1kNTMy
Java: www.tg-me.com/javatg
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка машинное обучение: https://www.tg-me.com/addlist/_FjtIq8qMhU0NTYy
🇬🇧Английский: www.tg-me.com/english_forprogrammers
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Что выведет код ?
Пишите свое решение в комментариях👇
@javatg
class Test
{
boolean[] array = new boolean[3];
int count = 0;
void set(boolean[] arr, int x)
{
arr[x] = true;
count++;
}
void func()
{
if(array[0] && array[++count - 2] | array [count - 1])
count++;
System.out.println("count = " + count);
}
public static void main(String[] args)
{
Test object = new Test();
object.set(object.array, 0);
object.set(object.array, 1);
object.func();
}
}
Пишите свое решение в комментариях👇
@javatg
👍8❤1🔥1👏1
Как Spring Framework реализует паттерн Dependency Injection?
Инверсия контроля (inversion of control, IoC) – принцип проектирования, по которому контроль над потоком управления передается фреймворку. Управляющий и прикладной код разделяются. При разработке модуля этот подход избавляет от необходимости знать о других модулях программы и деталях их взаимодействия. Такой код становится более переипользуемым и модульным, уменьшает связность.
Внедрение зависимостей (Dependency Injection, DI) – одна из реализаций IoC. При взаимодействии с другими модулями, программа оперирует высокоуровневыми абстракциями, тогда как конкретная её реализация поставляется фреймворком.
Стандартная реализация DI – фреймворк инстанциирует все сервисы, и складывает их в IoC-контейнер. При этом специальная сущность, Service Locator, занимается поиском соответствия реализаций абстракциям и их внедрением.
Spring – большой набор различных библиотек. DI реализуется одной из основных библиотек – Spring IoC.
Сущности бизнес-логики в Spring, как и в JavaEE называются beans. Бины объявляются различными способами, корни большинства из них лежат в понятии Configuration. В качестве контейнера бинов выступает ApplicationContext. Чтобы передать инициализацию зависимости контексту, она помечается аннотацией @Autowired.
@javatg
Инверсия контроля (inversion of control, IoC) – принцип проектирования, по которому контроль над потоком управления передается фреймворку. Управляющий и прикладной код разделяются. При разработке модуля этот подход избавляет от необходимости знать о других модулях программы и деталях их взаимодействия. Такой код становится более переипользуемым и модульным, уменьшает связность.
Внедрение зависимостей (Dependency Injection, DI) – одна из реализаций IoC. При взаимодействии с другими модулями, программа оперирует высокоуровневыми абстракциями, тогда как конкретная её реализация поставляется фреймворком.
Стандартная реализация DI – фреймворк инстанциирует все сервисы, и складывает их в IoC-контейнер. При этом специальная сущность, Service Locator, занимается поиском соответствия реализаций абстракциям и их внедрением.
Spring – большой набор различных библиотек. DI реализуется одной из основных библиотек – Spring IoC.
Сущности бизнес-логики в Spring, как и в JavaEE называются beans. Бины объявляются различными способами, корни большинства из них лежат в понятии Configuration. В качестве контейнера бинов выступает ApplicationContext. Чтобы передать инициализацию зависимости контексту, она помечается аннотацией @Autowired.
@javatg
👍20❤6👎2🔥2
Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Аутентификация - Spring Security в деталях
Получение информации о пользователе - Spring Security в деталях
Ещё один способ получения аутентифицированного пользователя #java #springsecurity
Точки входа аутентификации - Spring Security в деталях
Источники информации о пользователях - Spring Security в деталях
Устаревшие DSL в Spring Security 6.1
Отладка контекста безопасности - Spring Security в деталях
DSL и конфигураторы контекста безопасности - Spring Security в деталях
Фильтры безопасности - Spring Security в деталях
📌 источник
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍4❤1
🔥20 приемов кода Java, которые помогут повысить вашу производительность
1. Используйте расширенный цикл for.
Расширенный цикл for, также известный как цикл for-each, позволяет перебирать массивы или коллекции без ручного управления индексами. Это упрощает код и делает его более читабельным. Взглянем на пример:
i
Stream API, представленный в Java 8, расширяет возможности при выполнении операций обработки коллекций. Он позволяет выполнять такие действия, как фильтрация, сопоставление и сокращение, более лаконичным образом. Потоки могут улучшить читаемость кода и уменьшить количество шаблонов. Например:
3. Пользуйтесь преимуществом ключевого слова var (Java 10+).
Ключевое слово var позволяет вам объявлять переменные с неявным выводом типа. Это уменьшает потребность в явном указании типов, делая код более кратким. Еще один пример кода:
4. Используйте StringBuilder для эффективного объединения строк.
При объединении нескольких строк использование класса StringBuilder более эффективно, чем многократное использование оператора v+. StringBuilder позволяет избежать создания ненужных объектов и обеспечивает более высокую производительность. Взгляните на этот код:
5. Применяйте тернарный оператор для кратких условных выражений.
Тернарный оператор
При работе с ресурсами, которые реализуют интерфейс
Оператор ромба (
8. Используйте пакет java.time для операций с датой и временем.
В Java 8 появился пакет java.time, который предоставляет более полный и интуитивно понятный API для работы с датой и временем. Он предлагает такие классы, как
9. Применяйте ссылки на методы.
Ссылки на методы позволяют обращаться к методу по его имени, не вызывая его. Они могут сделать ваш код более лаконичным и выразительным, особенно при работе с функциональными интерфейсами. Например:
10. Используйте методы по умолчанию (default) в интерфейсах.
Начиная с Java 8, интерфейсы могут иметь методы по умолчанию, которые обеспечивают реализацию по умолчанию (default-реализацию). Методы по умолчанию позволяют добавлять в интерфейсы новые методы, не нарушая существующие реализации. Они могут быть удобны для добавления служебных методов к интерфейсам или обеспечения поведения по умолчанию.
#junior
📌 Читать дальше
@javatg
1. Используйте расширенный цикл for.
Расширенный цикл for, также известный как цикл for-each, позволяет перебирать массивы или коллекции без ручного управления индексами. Это упрощает код и делает его более читабельным. Взглянем на пример:
i
nt[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
// Делаем что-то с number
}
2. Используйте Java Stream API.Stream API, представленный в Java 8, расширяет возможности при выполнении операций обработки коллекций. Он позволяет выполнять такие действия, как фильтрация, сопоставление и сокращение, более лаконичным образом. Потоки могут улучшить читаемость кода и уменьшить количество шаблонов. Например:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n)
.sum();
3. Пользуйтесь преимуществом ключевого слова var (Java 10+).
Ключевое слово var позволяет вам объявлять переменные с неявным выводом типа. Это уменьшает потребность в явном указании типов, делая код более кратким. Еще один пример кода:
var message = "Hello, world!";
var numbers = List.of(1, 2, 3, 4, 5);
4. Используйте StringBuilder для эффективного объединения строк.
При объединении нескольких строк использование класса StringBuilder более эффективно, чем многократное использование оператора v+. StringBuilder позволяет избежать создания ненужных объектов и обеспечивает более высокую производительность. Взгляните на этот код:
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("world");
String result = sb.toString();
5. Применяйте тернарный оператор для кратких условных выражений.
Тернарный оператор
(?
🙂
позволяет записывать простые условные выражения в компактной форме. Это может быть полезно для присвоения значений или выполнения простой логики ветвления. Например:int x = 10;
String message = (x > 5) ? "Greater than 5" : "Less than or equal to 5";
6. Используйте try-with-resources для автоматического управления ресурсами.При работе с ресурсами, которые реализуют интерфейс
AutoCloseable
, такими как файловые потоки или соединения с базой данных, лучше использовать оператор try-with-resources, чтобы обеспечить надлежащую очистку ресурсов, не закрывая их явным образом. Посмотрите на пример кода:try (FileWriter writer = new FileWriter("myfile.txt")) {
//Запись в файл
}
7. Используйте оператор ромба для вывода типа.Оператор ромба (
<>
) позволяет опустить аргументы типа при создании экземпляра универсального класса, если тип можно вывести из контекста присваивания. Это уменьшает избыточность и делает код чище. Например:List<String> names = new ArrayList<>(); // Определение типа для ArrayList
8. Используйте пакет java.time для операций с датой и временем.
В Java 8 появился пакет java.time, который предоставляет более полный и интуитивно понятный API для работы с датой и временем. Он предлагает такие классы, как
LocalDate
, LocalTime
, LocalDateTime
и Duration, которые упрощают общие операции с датой и временем.9. Применяйте ссылки на методы.
Ссылки на методы позволяют обращаться к методу по его имени, не вызывая его. Они могут сделать ваш код более лаконичным и выразительным, особенно при работе с функциональными интерфейсами. Например:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // Ссылка на метод System.out.println
10. Используйте методы по умолчанию (default) в интерфейсах.
Начиная с Java 8, интерфейсы могут иметь методы по умолчанию, которые обеспечивают реализацию по умолчанию (default-реализацию). Методы по умолчанию позволяют добавлять в интерфейсы новые методы, не нарушая существующие реализации. Они могут быть удобны для добавления служебных методов к интерфейсам или обеспечения поведения по умолчанию.
#junior
📌 Читать дальше
@javatg
👍23❤8🔥2
🟡 Дайджест полезных материалов из мира java за неделю
Почитать:
— Поднимаем кластер PostgreSQL в Docker и Testcontainers
— Исчерпывающее руководство по одномерным массивам в Java
— Новый взгляд на Maven-plugin для IDEA — GMaven
— Kafka UI краткий гайд
— Пошушукаемся о Барбаре Лисков или раз и навсегда запоминаем принцип подстановки
— Список популярных утечек с GitHub: Анализ репозиториев компаний
— Java Digest #3
— Из кладовщика в разработчики
— Использование Kotlin и WebFlux для выполнения задач ML в Apache Spark на GPU
— Свойство типа Controller Service в кастомном процессоре NiFi
— Опыт Сдачи: Oracle Certified Professional: Java SE 11 Developer 1Z0-819
— Get URL pointed Resource Information in Java
— GPT me liste 10 exercicios...
— How to Install JDK for Debian using ARM64: Fixing 'dpkg: error: archive 'jdk-20.0.2' is not a regular file'
— 3 Ways to Make Your API Beautiful
— A beginner-friendly design patterns masterclass
— Product of Array Except Self - LeetCode Java Solution
— Two Sum — LeetCode Java Solution
— Valid Anagram - LeetCode Java Solution
— Contains Duplicate - LeetCode Java Solution
— In Java ein Word-Dokument in ein verschlüsseltes PDF-Dokument umwandeln
Посмотреть:
🌐Why They Called It Java | Prime Reacts
Хорошего дня!
❤️ Лайк, если полезно
@javatg
Почитать:
— Поднимаем кластер PostgreSQL в Docker и Testcontainers
— Исчерпывающее руководство по одномерным массивам в Java
— Новый взгляд на Maven-plugin для IDEA — GMaven
— Kafka UI краткий гайд
— Пошушукаемся о Барбаре Лисков или раз и навсегда запоминаем принцип подстановки
— Список популярных утечек с GitHub: Анализ репозиториев компаний
— Java Digest #3
— Из кладовщика в разработчики
— Использование Kotlin и WebFlux для выполнения задач ML в Apache Spark на GPU
— Свойство типа Controller Service в кастомном процессоре NiFi
— Опыт Сдачи: Oracle Certified Professional: Java SE 11 Developer 1Z0-819
— Get URL pointed Resource Information in Java
— GPT me liste 10 exercicios...
— How to Install JDK for Debian using ARM64: Fixing 'dpkg: error: archive 'jdk-20.0.2' is not a regular file'
— 3 Ways to Make Your API Beautiful
— A beginner-friendly design patterns masterclass
— Product of Array Except Self - LeetCode Java Solution
— Two Sum — LeetCode Java Solution
— Valid Anagram - LeetCode Java Solution
— Contains Duplicate - LeetCode Java Solution
— In Java ein Word-Dokument in ein verschlüsseltes PDF-Dokument umwandeln
Посмотреть:
🌐Why They Called It Java | Prime Reacts
Хорошего дня!
❤️ Лайк, если полезно
@javatg
👍22❤13🔥4🥰1
Вопросы-ответы собеседования
1. Что такое статический блок инициализации? static инициализатор
2. Что такое статический вложенный класс? static nested class
3. Какие типы ссылок есть в Java? Что такое Strong, Soft, Weak, Phantom Reference?
4. Что такое Strong Reference? Как работает сильная ссылка?
5. Что такое Soft Reference? Как работает мягкая ссылка?
6. Что такое Weak Reference? Как работает слабая ссылка?
7. Что такое Phantom Reference? Как работает фантомная ссылка?
8. Чем отличается интерфейс от абстрактного класса? Что использовать?
9. Что такое String Pool? Как работает пул строк?
10. Что такое пул строк? Изучаем String Pool за 50 секунд!
#video #java
https://www.youtube.com/watch?v=onDWBO2CYKY&list=PLvalLeYySoeC9i2KLvq1af7P6CllrsBsm&ab_channel=Javangelion%7C%D0%94%D0%B6%D0%B0%D0%B2%D0%B0%D0%BD%D0%B3%D0%B5%D0%BB%D0%B8%D0%BE%D0%BD
@javatg
1. Что такое статический блок инициализации? static инициализатор
2. Что такое статический вложенный класс? static nested class
3. Какие типы ссылок есть в Java? Что такое Strong, Soft, Weak, Phantom Reference?
4. Что такое Strong Reference? Как работает сильная ссылка?
5. Что такое Soft Reference? Как работает мягкая ссылка?
6. Что такое Weak Reference? Как работает слабая ссылка?
7. Что такое Phantom Reference? Как работает фантомная ссылка?
8. Чем отличается интерфейс от абстрактного класса? Что использовать?
9. Что такое String Pool? Как работает пул строк?
10. Что такое пул строк? Изучаем String Pool за 50 секунд!
#video #java
https://www.youtube.com/watch?v=onDWBO2CYKY&list=PLvalLeYySoeC9i2KLvq1af7P6CllrsBsm&ab_channel=Javangelion%7C%D0%94%D0%B6%D0%B0%D0%B2%D0%B0%D0%BD%D0%B3%D0%B5%D0%BB%D0%B8%D0%BE%D0%BD
@javatg
❤14👍8🔥2
Выпуск версии Java 8 стал знаменательным событием в истории Java. В нем были представлены потоки данных (англ. Streams) и лямбда-выражения, которые сейчас широко применяются. Если вы не знакомы с потоками данных или никогда не слышали о них, то ничего страшного. В большинстве случаев можно обойтись без них, задействуя циклы.
И зачем тогда, спрашивается, нужны потоки данных? Есть ли у них преимущества перед циклами? Могут ли они их заменить? В статье мы изучим соответствующий код, сравним производительность и посмотрим, смогут ли потоки данных стать полноценной заменой циклов.
Сравнение кода
Потоки данных увеличивают сложность кода, поскольку им нужны классы, интерфейсы и импорт. В отличие от них, циклы изначально встроены. В каких-то случаях это действительно так, но не всегда. Сложность кода не сводится только к объемам требуемых знаний для его понимания. В большей мере она определяется степенью читаемости кода. Обратимся к примерам.
Список имен элементов с заданным типом
Допустим, у нас есть список элементов, и нужно получить список имен элементов с заданным типом. Используя циклы, пишем следующий код:
List<String> getItemNamesOfType(List<Item> items, Item.Type type) {
List<String> itemNames = new ArrayList<>();
for (Item item : items) {
if (item.type() == type) {
itemNames.add(item.name());
}
}
return itemNames;
}
Читаем код и видим, что требуется создать новый ArrayList и в каждом цикле выполнять проверку типов и вызов add(). Теперь посмотрим, как с этой же задачей справляется поток данных:
List<String> getItemNamesOfTypeStream(List<Item> items, Item.Type type) {
return items.stream()
.filter(item -> item.type() == type)
.map(item -> item.name())
.toList();
}
С помощью лямбда-выражения сразу становится понятно, что мы сначала выбираем элементы с заданным типом, а затем получаем список имен отфильтрованных элементов. В таком варианте кода построчный поток хорошо согласуется с логическим потоком.
Генерация случайного списка
Переходим к другому примеру. В следующих разделах мы рассмотрим ключевые методы потоков данных и сравним время их выполнения с циклами. Для этого потребуется случайный список Item. Ниже представлен фрагмент кода со статическим методом, который генерирует такой список:
public record Item(Type type, String name) {
public enum Type {
WEAPON, ARMOR, HELMET, GLOVES, BOOTS,
}
private static final Random random = new Random();
private static final String[] NAMES = {
"beginner",
"knight",
"king",
"dragon",
};
public static Item random() {
return new Item(
Type.values()[random.nextInt(Type.values().length)],
NAMES[random.nextInt(NAMES.length)]);
}
}
Теперь создаем случайный список Item с помощью циклов. Пишем следующий код:
List<Item> items = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
items.add(Item.random());
}
Код с потоками данных выглядит следующим образом:
List<Item> items = Stream.generate(Item::random).limit(length).toList();
Превосходный и легко читаемый код. Более того, List, возвращаемый методом toList(), представляет собой неизменяемый список. Так что вы можете пользоваться неизменяемостью List и размещать его в любых местах кода, не беспокоясь о побочных эффектах. Такой подход снижает вероятность появления ошибок в коде и облегчает его понимание.
Потоки данных предоставляют множество полезных методов, способствующих написанию лаконичного кода. Перечислим самые востребованные из них:
allMatch();
anyMatch();
count();
filter();
findFirst();
forEach();
map();
reduce();
sorted();
limit()
и многие другие методы, с описанием которых можно ознакомиться по ссылке на документацию Stream Javadoc.
Производительность
При обычных обстоятельствах потоки данных ведут себя как циклы и практически не влияют на время выполнения. Сравним основные варианты поведения потоков с реализацией циклов.
📌Читать дальше
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥4❤3
ТОП 20 ТЕСТОВЫХ ЗАДАНИЙ НА ИНТЕРВЬЮ ДЛЯ JAVA РАЗРАБОТЧИКА
https://itvdn.com/ru/blog/article/test-java-20#17
@javatg
https://itvdn.com/ru/blog/article/test-java-20#17
@javatg
ITVDN
ТОП 20 тестовых заданий на интервью для Java разработчика
В этой статье мы приведем достаточно большое количество примеров программ из тех, что просят написать соискателей во время прохождения интервью на вакансию Java разработчика. Указанные тестовые задания мы приводим с реальными примерами кода, заданными в…
🔥15👍4
🟡 Дайджест полезных материалов из мира: Java за неделю
Почитать:
— Как скомпилировать Spring Boot приложение в native image с помощью GraalVm и развернуть его с помощью Docker
— Объяснения по шардинга баз данных
— Синхронизация в Java, часть 1: состояния гонки, блокировки и условия
— Как задеплоить монолитный pet проект на Java с 0 и не сойти с ума… Часть 1
— Авторизация в Spring Boot приложении с Spring Security 3.1.0 и PostgreSQL
— Ракету пустил и забыл. Или как заставить DI работать
— Поднимаем кластер PostgreSQL в Docker и Testcontainers
— Meeting & Mastering Java
— Navigating Code Testing Waters with Mockito: Your Testing Crew for Smooth Sailing
— I'm Learning Java s̶c̶r̶i̶p̶t̶
— Journey of completing Oracle Java Certification OCA 1Z0-808 exam
— Object Oriented Programming (OOP)
— A Deep Dive into Parking Spot LLD Design
— Difference between Interface and Abstract Class
— I’m continuing jDOSBox
— Mastering Background Processing in Android with WorkManager: A Guide to Efficient Background Processing
— [Digest] Java, Kotlin, Spring, Cloud, and More - Episode 8
Посмотреть:
🌐 Тестовое собеседование Java разработчика #28 - Леонид Земенков
Хорошего дня!
❤️ Лайк, за подборку
@javatg
Почитать:
— Как скомпилировать Spring Boot приложение в native image с помощью GraalVm и развернуть его с помощью Docker
— Объяснения по шардинга баз данных
— Синхронизация в Java, часть 1: состояния гонки, блокировки и условия
— Как задеплоить монолитный pet проект на Java с 0 и не сойти с ума… Часть 1
— Авторизация в Spring Boot приложении с Spring Security 3.1.0 и PostgreSQL
— Ракету пустил и забыл. Или как заставить DI работать
— Поднимаем кластер PostgreSQL в Docker и Testcontainers
— Meeting & Mastering Java
— Navigating Code Testing Waters with Mockito: Your Testing Crew for Smooth Sailing
— I'm Learning Java s̶c̶r̶i̶p̶t̶
— Journey of completing Oracle Java Certification OCA 1Z0-808 exam
— Object Oriented Programming (OOP)
— A Deep Dive into Parking Spot LLD Design
— Difference between Interface and Abstract Class
— I’m continuing jDOSBox
— Mastering Background Processing in Android with WorkManager: A Guide to Efficient Background Processing
— [Digest] Java, Kotlin, Spring, Cloud, and More - Episode 8
Посмотреть:
🌐 Тестовое собеседование Java разработчика #28 - Леонид Земенков
Хорошего дня!
❤️ Лайк, за подборку
@javatg
👍17❤8🔥5
⚡Легкий способ получать свежие обновлении и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
Машинное обучение: @ai_machinelearning_big_data
Go: @Golang_google
C#: @csharp_ci
Базы данных: @sqlhub
Python: @python_job_interview
C/C++/: @cpluspluc
Data Science: @data_analysis_ml
Devops: @devOPSitsec
Rust: @rust_code
Javascript: @javascriptv
React: @react_tg
PHP: @phpshka
Docker: @docker
Android: @android_its
Мобильная разработка: @mobdevelop
Linux: linuxacademy
Big Data: www.tg-me.com/bigdatai
Хакинг: @linuxkalii
Java:@javatg
Собеседования: @machinelearning_interview
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
🔥ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: @english_forprogrammers
Машинное обучение: @ai_machinelearning_big_data
Go: @Golang_google
C#: @csharp_ci
Базы данных: @sqlhub
Python: @python_job_interview
C/C++/: @cpluspluc
Data Science: @data_analysis_ml
Devops: @devOPSitsec
Rust: @rust_code
Javascript: @javascriptv
React: @react_tg
PHP: @phpshka
Docker: @docker
Android: @android_its
Мобильная разработка: @mobdevelop
Linux: linuxacademy
Big Data: www.tg-me.com/bigdatai
Хакинг: @linuxkalii
Java:@javatg
Собеседования: @machinelearning_interview
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
🔥ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: @english_forprogrammers
👍5👎3🔥2
1. JavaШаблоны проектирвоания
2. Cобеседования
3. Алгоритмы
4. Проекты
5. Awesome Java
6. Baeldung Tutorials
7. JHipster
8. Spring Framework
9. Spring Boot Tutorials by Java Guides
10. сracking the Coding Interview in Java
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥5❤2