Telegram Web Link
🖥 50 вопросов для собеседования по микросервисам для Java-разработчиков 2023

За последние несколько лет, микросервисы быстро стали ведущей архитектурой многих технологических компаний, настолько, что все следят за ними.

Микросервис — это веб-сервис, отвечающий за один элемент логики в некой предметной области (очень похоже на класс).

Например, у вас может быть микросервис для аутентификации и авторизации в вашем приложении, один микросервис для обработки потока заказов, другой для пользователей и так далее.

В последние годы спрос на микросервисы сильно вырос, но как и у любой другой технологии, у неё есть свои плюсы и минусы.

Читать дальше
Зеркало

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Java-Studies

Большой Репозиторий с учебными заметками и программами
для фундаментальных и важных концепций разработки на Java.

Полезный репозиторий с хорошими заметками и кодом. Схемы и детальное обьяснения всех основных концепций.

Дженерики, алгоритмы, Api, сокеты и многое другое.

🖥 Github

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача: найдите первый неповторяющийся символ в строке, выполнив только один обход

Для заданной строки найдите в ней первый неповторяющийся символ, выполнив только один ее обход.

Например,

Input:

string is ABCDBAGHC

Output:

первый неповторяющийся символ: D


Простым решением было бы сохранить количество каждого символа в map или массиве, пройдя его один раз.

Затем еще раз просмотреть строку, чтобы найти первый символ, имеющий значение 1. Временная сложность этого решения равна O(n), где n длина входной строки. Проблема с этим решением заключается в том, что строка проходится дважды, что нарушает ограничения программы.

Мы можем решить эту задачу за один обход строки. Идея состоит в том, чтобы использовать map для хранения количества каждого отдельного символа и индекса его первого или последнего вхождения в строку. Затем пройтись по map и найти символ с минимальным индексом строки.


import java.util.HashMap;
import java.util.Map;

// Pair class
class Pair<U, V>
{
public U first; // первое поле пары
public V second; // второе поле пары

// Создает новую пару с указанными значениями
private Pair(U first, V second)
{
this.first = first;
this.second = second;
}

// наш метод для создания неизменяемого экземпляра Typed Pair
public static <U, V> Pair <U, V> of(U a, V b)
{
// вызывам приватный конструктор
return new Pair<>(a, b);
}
}

class Main
{
// Функция для поиска первого неповторяющегося символа в
// строке, выполнив только один ее обход
public static int findNonRepeatingChar(String str)
{
// базовый вариант
if (str == null || str.length() == 0) {
return -1;
}

// map для хранения количества символов и индекса их
// последнее вхождение в строку
Map<Character, Pair<Integer, Integer>> map = new HashMap<>();

for (int i = 0; i < str.length(); i++)
{
map.putIfAbsent(str.charAt(i), Pair.of(0, 0));
map.get(str.charAt(i)).first++;
map.get(str.charAt(i)).second = i;
}

// сохраняет индекс первого неповторяющегося символа
int min_index = -1;

// пройти по map и найти символ со счетом 1 и
// минимальный индекс строки
for (var value: map.values())
{
int count = value.first;
int firstIndex = value.second;

if (count == 1 && (min_index == -1 || firstIndex < min_index)) {
min_index = firstIndex;
}
}

return min_index;
}

public static void main(String[] args)
{
String str = "ABCDBAGHC";

int index = findNonRepeatingChar(str);
if (index != -1)
{
System.out.println("The first non-repeating character in the string is "
+ str.charAt(index));
} else {
System.out.println("первый неповторяющийся символ:");
}
}
}

Вывод:
первый неповторяющийся символ: D


Временная сложность этого решения O(n) так как мы делаем один обход строки длины n и один обход map.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Spring Boot 101: Введение в создание веб-приложений

Это статья для Java разработчиков, в которой подробно разобраны все этапы создания приложения на Spring.

Читать
Зеркало

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Введение в Gradle - систему для автоматизации сборки приложений. Часть 1.

Gradle — система для автоматизации сборки приложений и сбора статистики об использовании программных библиотек, применяющая языки Groovy, Java, JavaScript, Kotlin и т. д., а также решения из фреймворков Apache Ant и Apache Maven.

плагины на JavaScript, C++, Swift, Scala. Система распространяется как программное обеспечение с открытым исходным кодом по лицензии Apache License 2.0.

Назначение Gradle
Ручная сборка приложения для запуска на устройстве требует много времени и ресурсов. Она затягивает процесс разработки и релиза.

Gradle решает реализацию больших многомодульных сборок путем последовательного и параллельного выполнения основных и добавочных модулей.

Читать дальше
Github
Книга DevOps Tools for Java Developers

@javatg
🖥 13 фантастических плагинов для Android Studio

В этой статье я покажу вам лучшие плагины, которые я использовал, чтобы сделать приятный интерфейс, повысить свою производительность и, конечно же, сделать IDE Android Studio чертовски потрясающей.

📌 Статья

#android #androidstudio

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Решаем задачи с Codewars

Комбинации слов, образованные заменой данных цифр соответствующими алфавитами

Для заданного набора положительных чисел найти все возможные комбинации слов, образованные заменой цифр соответствующими символами английского алфавита, т. е. подмножество {1} можно заменить на A, {2} можно заменить на B, {1, 0} можно заменить на J, {2, 1} можно заменить на U, так далее.

Для каждого i-того элемент, есть две возможности – либо этот i тый элемент будет суммироваться со следующимс (i+1) элементом, если число, образованное ими меньше 26 (кол-во букв в английском алфавите) или iый элемент формирует новый символ сам по себе.

class Main
{
private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Функция для поиска всех возможных комбинаций слов, образованных
путем замены заданных чисел на соответствующие символы английского алфавита
public static void recur(int[] digits, int i, String str)
{
if (i == digits.length)
{
System.out.println(str);
return;
}

int sum = 0;

// обрабатываем следующие две цифры (i и (i+1))
for (int j = i; j <= Integer.min(i + 1, digits.length - 1); j++)
{
sum = (sum * 10) + digits[j];

// если допустимый символ можно сформировать, взяв одну или обе цифры,
// добавляем его к выводу и повторяем для оставшихся цифр
if (sum > 0 && sum <= 26) {
recur(digits, j + 1, str + alphabet.charAt(sum - 1));
}
}
}

public static void findCombinations(int[] digits)
{
// базовый вариант
if (digits == null || digits.length == 0) {
return;
}

String str = "";
recur(digits, 0, str);
}

public static void main(String[] args)
{
int[] digits = { 1, 2, 2 };

findCombinations(digits);
}
}


Мы также можем решить эту проблему, используя двоичное дерево и рекурсию.

// Класс для хранения узла бинарного дерева
class Node
{
String key;
Node left, right;

// Конструктор
Node(String key)
{
this.key = key;
left = right = null;
}
}

class Main
{
private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

// Функция для печати всех листовых узлов бинарного дерева
public static void print(Node node)
{
if (node == null) {
return;
}

if (node.left == null && node.right == null) {
System.out.print(node.key + " ");
}
else {
print(node.right);
print(node.left);
}
}

// Функция для построения бинарного дерева, в котором каждый конечный узел содержит уникальная комбинация слов


public static void construct(Node root, int[] digits, int i)
{
// Базовый случай: пустое дерево
if (root == null || i == digits.length) {
return;
}

// проверяем, существует ли `digits[i+1]`
if (i + 1 < digits.length)

int sum = 10 * digits[i] + digits[i + 1];

// если обе цифры могут образовывать допустимый символ, создаем из него левого потомка
if (sum <= 26) {
root.left = new Node(root.key + alphabet.charAt(sum - 1));
}

// строим левое поддерево по оставшимся цифрам
construct(root.left, digits, i + 2);
}

// обрабатываем текущую цифру и создаем из нее нужного потомка
root.right = new Node(root.key + alphabet.charAt(digits[i] - 1));

// строим правое поддерево по оставшимся цифрам
construct(root.right, digits, i + 1);
}

public static void main(String[] args)
{
int[] digits = { 1, 2, 2, 1 };

Node root = new Node("");

construct(root, digits, 0);

print(root);
}
}


Вывод: ABBA ABU AVA LBA LU

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 5 Шаблонов проектирования на Java, которые решают основные проблемы!

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

Читать
Зеркало

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Поднимаем стенд Spring микросервисов в Kubernetes

В статье будет описан процесс поднятия домашнего стенда для экспериментов c k8s, c базовым CI/CD для микросервисов Spring.

Код статьи c инструкцией установки доступен в репозиториях:

https://github.com/alexandr-leonov/eda-configuration
https://github.com/alexandr-leonov/eda-order-service

➡️ Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Изучаем J-Юнит в Java: тестирование и возможные его аннотации

В программировании для написания всевозможных программ и игр разработчик может использовать разнообразные функции и инструменты.

У Java него есть средства, которые значительно упрощают процесс работы с создаваемыми утилитами. Одна из них носит название JUnit. Ей будет уделено основное внимание в данной статье.

Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Список полезных ресурсов для Java-разработчиков 2023.

В данной статье я хочу поделиться различными полезными библиотеками и инструментами для повышения производительности Java-приложений.

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

Читать
Зеркало

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 RoadMap для Java-разработчика 2023

Эта дорожная карта отвечает на многие актуальные вопросы, например, какие технологии должен изучать Java-разработчик? Какие инструменты делают вас лучшим разработчиком на Java? Какой фреймворк Java-разработчик должен обязательно знать?

Читать
Зеркало

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Java Memory Management: A comprehensive guide to garbage collection and JVM tuning (2022)
Автор
: Maaike van Putten

Описание: Понимание того, как Java организует память, важно для каждого специалиста по Java, но эта конкретная тема является общим пробелом в знаниях для многих профессионалов в области программного обеспечения. Глубокие знания о функционировании и управлении памятью невероятно полезны при написании и анализе кода, а также при отладке проблем с памятью.

В этой книге вы начнете с изучения основ памяти Java. После этого вы погрузитесь в различные сегменты по отдельности. Вы изучите стек, кучу и метапространство. Книга также покажет вам, как настраивать, контролировать и профилировать управление памятью JVM. В последующих главах вы узнаете, как избежать и обнаружить утечки памяти.

К концу этой книги вы поймете, как Java управляет памятью и как настроить ее на благо ваших приложений.

📚 Книга

@javatg
🖥 Простое ускорение Java с помощью Quarkus и JHipster

Quarkus — "родной" для Kubernetes Java-платформе для создания высокопроизводительных веб, бессерверных (serverless) и нативных приложений (оптимизированных для используемых микропроцессоров).

В ней используются предварительная компиляция AOT и агрессивная оптимизация, например сканирование путей к классам, перезагрузка конфигурации и предварительная конфигурация самозагрузки приложения в процессе сборки. Результатом становится впечатляющая скорость загрузки. Другими словами, приложения, созданные с Quarkus, запускаются не просто быстро, а очень быстро!

Так же как для платформ Spring и Micronaut, в Quarkus можно использовать преимущество GraalVM для преобразования JVM-приложений в нативные исполняемые файлы, что ещё больше повышает их быстродействие.

📌Читать дальше

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 В чем разница между HashMap и IdentityHashMap? Для чего нужна IdentityHashMap?

IdentityHashMap - это структура данных, так же реализующая интерфейс Map и использующая при сравнении ключей (значений) сравнение ссылок, а не вызов метода` ˚Другими словами, в IdentityHashMap два ключа k1 и k2 будут считаться равными, если они указывают на один объект, т.е. выполняется условие k1 == k2.

IdentityHashMap не использует метод hashCode(), вместо которого применяется метод System.identityHashCode(), по этой причине IdentityHashMap по сравнению с HashMap имеет более высокую производительность, особенно если последний хранит объекты с дорогостоящими методами equals() и hashCode().

Одним из основных требований к использованию HashMap является неизменяемость ключа, а, т.к. IdentityHashMap не использует методы equals() и hashCode(), то это правило на него не распространяется.

IdentityHashMap может применяться для реализации сериализации/клонирования. При выполнении подобных алгоритмов программе необходимо обслуживать хэш-таблицу со всеми ссылками на объекты, которые уже были обработаны. Такая структура не должна рассматривать уникальные объекты как равные, даже если метод equals() возвращает true.

Пример кода:

import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;

public class Q2 {

public static void main(String[] args) {
Q2 q = new Q2();
q.testHashMapAndIdentityHashMap();
}

private void testHashMapAndIdentityHashMap() {
CreditCard visa = new CreditCard("VISA", "04/12/2019");

Map<CreditCard, String> cardToExpiry = new HashMap<>();
Map<CreditCard, String> cardToExpiryIdenity = new IdentityHashMap<>();

System.out.println("adding to HM");
// inserting objects to HashMap
cardToExpiry.put(visa, visa.getExpiryDate());

// inserting objects to IdentityHashMap
cardToExpiryIdenity.put(visa, visa.getExpiryDate());
System.out.println("adding to IHM");

System.out.println("before modifying keys");
String result = cardToExpiry.get(visa) != null ? "Yes" : "No";
System.out.println("Does VISA card exists in HashMap? " + result);

result = cardToExpiryIdenity.get(visa) != null ? "Yes" : "No";
System.out.println("Does VISA card exists in IdenityHashMap? " + result);

// modifying value object
visa.setExpiryDate("02/11/2030");

System.out.println("after modifying keys");
result = cardToExpiry.get(visa) != null ? "Yes" : "No";
System.out.println("Does VISA card exists in HashMap? " + result);

result = cardToExpiryIdenity.get(visa) != null ? "Yes" : "No";
System.out.println("Does VISA card exists in IdenityHashMap? " + result);

System.out.println("cardToExpiry.containsKey");
System.out.println(cardToExpiry.containsKey(visa));
System.out.println("cardToExpiryIdenity.containsKey");
System.out.println(cardToExpiryIdenity.containsKey(visa));
}

}

class CreditCard {
private String issuer;
private String expiryDate;

public CreditCard(String issuer, String expiryDate) {
this.issuer = issuer;
this.expiryDate = expiryDate;
}

public String getIssuer() {
return issuer;
}

public String getExpiryDate() {
return expiryDate;
}

public void setExpiryDate(String expiry) {
this.expiryDate = expiry;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((expiryDate == null) ? 0 : expiryDate.hashCode());
result = prime * result + ((issuer == null) ? 0 : issuer.hashCode());
System.out.println("hashCode = " + result);
return result;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
@Override
public boolean equals(Object obj) {
System.out.println("equals !!! ");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CreditCard other = (CreditCard) obj;
if (expiryDate == null) {
if (other.expiryDate != null)
return false;
} else if (!expiryDate.equals(other.expiryDate))
return false;
if (issuer == null) {
if (other.issuer != null)
return false;
} else if (!issuer.equals(other.issuer))
return false;
return true;
}

}
Результат выполнения кода:

adding to HM
hashCode = 1285631513
adding to IHM
before modifying keys
hashCode = 1285631513
Does VISA card exists in HashMap? Yes
Does VISA card exists in IdenityHashMap? Yes
after modifying keys
hashCode = 791156485
Does VISA card exists in HashMap? No
Does VISA card exists in IdenityHashMap? Yes
cardToExpiry.containsKey
hashCode = 791156485
false
cardToExpiryIdenity.containsKey
true
🖥 Сравнение производительности сжатия данных MySQL на Java 2023

Каков лучший способ хранения двоичных данных в MySQL? Это вопрос, на который есть несколько ответов, в зависимости от ваших целей. Например, если вам нужно оптимизировать размер хранилища, вам, вероятно, потребуется использовать какой-либо алгоритм сжатия, который эффективно сжимает ваши данные. В моём случае мне действительно нужна высокая производительность, то есть максимально быстрое время отклика для извлечения большого двоичного объекта из MySQL.

Давайте отложим в сторону вопрос о том, подходит ли MySQL для хранения двоичных данных. Вопрос здесь будет заключаться в том, как хранить двоичные данные, чтобы считывание из БД происходило как можно быстрее?

Решением может быть использование сжатия данных. Однако это то, что требует сравнительного анализа, поскольку существует компромисс между использованием процессора для распаковки и скоростью сети. В этом тесте я собираюсь сравнить производительность между различными алгоритмами сжатия, сжатия с использованием самого MySQL и без использования сжатия вообще.

➡️ Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой результат выведет следующая программа?
2024/10/03 09:14:39
Back to Top
HTML Embed Code: