В наших проектах мы используем микросервисную архитектуру. При возникновении узких мест в производительности достаточно много времени тратится на мониторинг и разбор логов. При логировании таймингов отдельных операций в лог-файл, как правило, сложно понять что привело к вызову этих операций, отследить последовательность действий или смещение во времени одной операции относительно другой в разных сервисах.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥1👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
👏7😁2🔥1
Leetcode. Задача 169. Majority Element. (easy)
Дан массив nums размера n, верните элемент большинства.
Элемент большинства — это элемент, который встречается более чем ⌊n / 2⌋ раз. Можно предположить, что элемент большинства всегда существует в массиве.
Пример:
👨💻 Алгоритм:
1⃣ Использование HashMap для подсчета:
Создайте HashMap для отслеживания количества каждого элемента в массиве.
2⃣ Подсчет вхождений элементов:
Пройдите по массиву nums, увеличивая счетчик в HashMap для каждого элемента.
3⃣ Поиск элемента большинства:
Определите элемент большинства, просмотрев HashMap и найдя ключ с максимальным значением, которое должно быть больше ⌊n / 2⌋
😎 Решение:
Дан массив nums размера n, верните элемент большинства.
Элемент большинства — это элемент, который встречается более чем ⌊n / 2⌋ раз. Можно предположить, что элемент большинства всегда существует в массиве.
Пример:
Input: nums = [1,1,2,2,1]
Output: 1
Создайте HashMap для отслеживания количества каждого элемента в массиве.
Пройдите по массиву nums, увеличивая счетчик в HashMap для каждого элемента.
Определите элемент большинства, просмотрев HashMap и найдя ключ с максимальным значением, которое должно быть больше ⌊n / 2⌋
class Solution {
public int majorityElement(int[] nums) {
HashMap<Integer, Integer> hash = new HashMap<>();
int res = 0;
int majority = 0;
for (int n : nums) {
hash.put(n, 1 + hash.getOrDefault(n, 0));
if (hash.get(n) > majority) {
res = n;
majority = hash.get(n);
}
}
return res;
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2👏1
Ответ -
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2👏2
Java Generics — это одно из самых значительных изменений за всю историю языка Java. «Дженерики», доступные с Java 5, сделали использование Java Collection Framework проще, удобнее и безопаснее. Ошибки, связанные с некорректным использованием типов, теперь обнаруживаются на этапе компиляции. Да и сам язык Java стал еще безопаснее. Несмотря на кажущуюся простоту обобщенных типов, многие разработчики сталкиваются с трудностями при их использовании. В этом посте я расскажу об особенностях работы с Java Generics, чтобы этих трудностей у вас было поменьше. Пригодится, если вы не гуру в дженериках, и поможет избежать много трудностей при погружении в тему.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2😁1
Паттерн проектирования "Компоновщик" (Composite) позволяет объединять объекты в древовидную структуру для представления иерархий "часть-целое". Он помогает клиентам работать с отдельными объектами и группами объектов единообразно.
interface Car {
void draw(String color);
}
class SportCar implements Car {
public void draw(String color) {
System.out.println("SportCar color: " + color);
}
}
class UnknownCar implements Car {
public void draw(String color) {
System.out.println("UnknownCar color: " + color);
}
}
class Drawing implements Car {
private List<Car> cars = new ArrayList<Car>();
public void draw(String color) {
for(Car car : cars) {
car.draw(color);
}
}
public void add(Car s){
this.cars.add(s);
}
}
public class CompositeTest {
public static void main(String[] args) {
Car sportCar = new SportCar();
Car unknownCar = new UnknownCar();
Drawing drawing = new Drawing();
drawing.add(sportCar);
drawing.add(unknownCar);
drawing.draw("green");
}
}Таким образом, паттерн Компоновщик помогает организовать иерархии объектов и упрощает работу с ними в клиентском коде.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1🔥1👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👏2🔥1
Разработчику на Java часто приходится сталкиваться с различными структурами данных. Это могут быть массивы, всевозможные коллекции или реализации Map. Казалось бы, всё с ними ясно и понятно, но существует несколько мелочей, о которые легко споткнуться.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2❤1👏1
Паттерн проектирования "Прокси" (Proxy) предоставляет суррогатный или заместительный объект, который управляет доступом к другому объекту. Этот паттерн используется для контроля доступа к объекту, добавления дополнительной логики перед или после вызова метода реального объекта, а также для ленивой инициализации.
interface Image {
void display();
}
class RealImage implements Image {
private String file;
public RealImage(String file){
this.file = file;
load(file);
}
private void load(String file){
System.out.println("Загрузка " + file);
}
public void display() {
System.out.println("Просмотр " + file);
}
}
class ProxyImage implements Image {
private String file;
private RealImage image;
public ProxyImage(String file){
this.file = file;
}
public void display() {
if(image == null){
image = new RealImage(file);
}
image.display();
}
}
public class ProxyTest {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
image.display();
image.display();
}
}Таким образом, паттерн Прокси позволяет эффективно управлять доступом к объектам и добавлять дополнительные функции, не изменяя их реализацию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥1
Ответ -
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👏3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8🔥5👍2
Ответ -
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4👏4
Паттерн проектирования "Летучий вес" (Flyweight) используется для оптимизации памяти и повышения производительности, особенно когда необходимо создать множество объектов с одинаковыми или схожими свойствами. Этот паттерн позволяет разделять общее состояние объектов и хранить уникальные данные отдельно.
// Интерфейс для летучего веса
public interface MyCharacter {
void display(int position);
}
//Конкретный летучий вес
public class FlyweightCharacter implements MyCharacter {
private final char character;
public FlyweightCharacter(char character) {
this.character = character;
}
@Override
public void display(int position) {
System.out.println("Character: " + character + ", Position: " + position);
}
}
// Фабрика для создания и хранения летучих весов
public class CharacterFactory {
private final Map<Character, FlyweightCharacter> characters = new HashMap<>();
public FlyweightCharacter getCharacter(char character) {
// Если символ уже существует, вернуть его; иначе создать новый
if (!characters.containsKey(character)) {
characters.put(character, new FlyweightCharacter(character));
}
return characters.get(character);
}
}
public class Main {
public static void main(String[] args) {
CharacterFactory factory = new CharacterFactory();
// Создаем строку символов
String text = "HELLO FLYWEIGHT";
for (int i = 0; i < text.length(); i++) {
char currentChar = text.charAt(i);
FlyweightCharacter flyweightChar = factory.getCharacter(currentChar);
flyweightChar.display(i);
}
}
}
Таким образом, паттерн Прокси позволяет эффективно управлять доступом к объектам и добавлять дополнительные функции, не изменяя их реализацию.
Таким образом, паттерн "Летучий вес" помогает эффективно управлять памятью и производительностью при работе с большим количеством объектов с общими свойствами.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2
Java Collection Framework — иерархия интерфейсов и их реализаций, которая является частью JDK и позволяет разработчику пользоваться большим количесвом структур данных из «коробки».
Данная статья поможет начинающим разработчикам понять ключевые отличия одних коллекций от других, а более опытным разработчикам просто освежить материал в памяти.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2👏2❤1
Leetcode. Задача 55. Jump Game. (medium)
Вам дан массив целых чисел nums. Изначально вы находитесь на первом индексе массива, и каждый элемент массива представляет вашу максимальную длину прыжка в этой позиции.
Верните true, если вы можете достичь последнего индекса, или false в противном случае.
Пример:
👨💻 Алгоритм:
1⃣ Начиная с последнего элемента начинаем проверять достижимость каждого элемента
2⃣ Если элемент достижим, то меняем значение goal на индекс достижимого элемента
3⃣ В конце проверяем условие, что мы пришли к начальной позиции
😎 Решение:
🖥 Java Developer | Backend | #⃣ #задача #java
Вам дан массив целых чисел nums. Изначально вы находитесь на первом индексе массива, и каждый элемент массива представляет вашу максимальную длину прыжка в этой позиции.
Верните true, если вы можете достичь последнего индекса, или false в противном случае.
Пример:
Input: nums = [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
class Solution {
public boolean canJump(int[] nums) {
int goal = nums.length - 1;
for (int i = nums.length - 2; i >= 0; i--) {
if (i + nums[i] >= goal) {
goal = i;
}
}
return goal == 0;
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥4🤩2
Ответ -
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3
В данной статье автор рассматривает популярные best-practice для применения коллекций.
Из опыта code-review и ответов на StackOverflow набралось немало моментов, касающихся Java Collections API, которые мне казались очевидными, но другие разработчики о них почему-то не знали или знали, но не чувствовали уверенности их применять. В этой статье я собираю в общую кучу всё, что накопилось.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥3👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7🔥5