Java for Beginner
685 subscribers
585 photos
161 videos
12 files
900 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
📌 Факт дня:

А вы знали, что игра "Pac-Man" была вдохновлена пиццей?

Тору Иватани, создатель игры Pac-Man (1980), придумал персонажа, увидев пиццу, из которой вырезали кусок. Название "Pac-Man" происходит от японского звука "паку-паку", означающего открытие и закрытие рта.


proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Цитата дня: Джеффри Зельдман

"Контент важнее дизайна."


Джеффри Зельдман, пионер веб-дизайна, написал это в 2001 году в книге "Taking Your Talent to the Web".

Почитать короткую биографию
И его работа

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Sealed-классы и интерфейсы в Java (Java 17+)

1. Что такое sealed-классы и интерфейсы?

С выходом Java 17 (начиная с предварительной версии в Java 15), в язык добавили новую возможность — sealed-классы и интерфейсы. Это расширение системы типов, которое позволяет жестко контролировать и ограничивать наследование.

По умолчанию в Java любой класс open для расширения, если он не final. Но это иногда нарушает инкапсуляцию или архитектурные принципы. Например, ты можешь не хотеть, чтобы кто угодно наследовался от твоего базового класса. До Java 17 у тебя было всего два выбора:

final — нельзя наследовать вообще;

обычный класс — может быть расширен кем угодно.

Sealed-классы добавляют третий путь: ты сам указываешь, какие классы могут расширять данный базовый класс или реализовывать интерфейс.


2. Зачем нужны sealed-типы?

Ограничение наследования: Запрещает произвольное расширение класса/интерфейса.
Безопасность: Компилятор знает все возможные подтипы, что помогает в switch-выражениях и pattern matching.
Четкая архитектура: Позволяет явно указать, какие классы являются частью иерархии.


3. Синтаксис объявления
// Sealed-класс
public sealed class Shape permits Circle, Square, Rectangle { ... }

// Sealed-интерфейс
public sealed interface Animal permits Dog, Cat, Bird { ... }


sealed — модификатор, указывающий, что класс/интерфейс ограничен.
permits — список классов/интерфейсов, которые могут наследовать/реализовывать sealed-тип.


#Java #Training #Medium #Sealed
👍31
Что выведет код?

import java.util.HashSet;

public class Task220425 {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
Integer a = 128;
Integer b = 128;
set.add(a);
set.add(b);
set.add(null);
set.add(null);

System.out.println(set.size());
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
14%
1
53%
2
14%
3
19%
4
👍2
Пить надо с умом, а не с котом☝️ 🤪

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Вопросы с собеседования 👩‍💻

Какой метод используется для получения текущего объекта класса Thread?
Anonymous Quiz
10%
System.thread()
25%
Thread.getThread()
43%
Thread.currentThread()
Sealed-классы и интерфейсы в Java (Java 17+)

1. Правила для sealed-классов

Классы, указанные в permits, должны:
Быть прямыми наследниками sealed-класса.

Иметь один из модификаторов:
final — запрещает дальнейшее наследование.
sealed — разрешает наследование, но с новым permits.
non-sealed — снимает ограничения (класс становится открытым для наследования).


2. Пример sealed-иерархии
public sealed class Shape permits Circle, Square, Rectangle { ... }

public final class Circle extends Shape { ... } // Нельзя наследовать
public non-sealed class Square extends Shape { ... } // Можно наследовать
public sealed class Rectangle extends Shape permits FilledRectangle { ... }
public final class FilledRectangle extends Rectangle { ... }


3. Sealed-интерфейсы

Аналогично классам, но с реализацией:
public sealed interface Animal permits Dog, Cat { ... }
public final class Dog implements Animal { ... }
public record Cat() implements Animal { ... } // record тоже может реализовывать sealed-интерфейс


Pattern matching, ограничения и рекомендации

Sealed-типы отлично работают с switch:

public String getShapeType(Shape shape) {
return switch (shape) {
case Circle c -> "Circle";
case Square s -> "Square";
case Rectangle r -> "Rectangle";
// Компилятор знает все варианты, поэтому default не обязателен!
};
}


Ограничения

Sealed-класс и его наследники должны находиться в одном модуле или одном пакете (если модулей нет).
В permits нельзя указывать несуществующие классы.


Best practices

Используйте sealed для критичных иерархий (например, AST в компиляторах).
Предпочитайте final или sealed для большинства наследников, чтобы избежать неконтролируемого расширения.
Комбинируйте с record для неизменяемых DTO.


#Java #Training #Medium #Sealed
👍3
📌 Факт дня:

А вы знали, что первый CD был создан для хранения музыки?

Компакт-диск (CD), разработанный Philips и Sony в 1982 году, изначально предназначался для аудиозаписей. Первый коммерческий CD содержал альбом "The Visitors" группы ABBA, а позже CD стали стандартом для хранения данных.


proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Цитата дня: Дэн Бриклин

"Электронные таблицы изменили способ ведения бизнеса."


Дэн Бриклин, создатель VisiCalc, сказал это в 1979 году в интервью после запуска программы.

Почитать короткую биографию
И его работа. Стоит внимания

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Comparable и Comparator, их назначение и различия

В Java сортировка коллекций — важная задача, и для ее решения используются интерфейсы Comparable и Comparator. Они позволяют определять порядок элементов в коллекциях, таких как List, Set или Map, при использовании методов вроде Collections.sort() или Arrays.sort(). Понимание их различий, механизмов работы и правильного применения критично для написания эффективного кода.

Comparable: естественный порядок сортировки

Comparable — это интерфейс, определенный в пакете java.lang. Он используется, когда класс должен иметь "естественный" порядок сортировки, то есть порядок, который логически присущ объектам этого класса. Например, для строк естественный порядок — лексикографический, для чисел — числовой.

Класс, реализующий Comparable, должен имплементировать метод compareTo(T o), который возвращает:
Отрицательное число, если текущий объект "меньше" аргумента.
Ноль, если объекты равны.
Положительное число, если текущий объект "больше".


Пример реализации Comparable для класса Person, сортирующего по возрасту:
public class Person implements Comparable { private String name; private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}

@Override
public String toString() {
return name + " (" + age + ")";
}

}


Здесь объекты Person сортируются по возрастанию возраста.

Чтобы использовать такую сортировку, достаточно передать список объектов в Collections.sort():
List people = new ArrayList<>(); 
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people);
System.out.println(people); // Вывод: [Bob (25), Alice (30)]


Comparator: гибкая сортировка

Comparator — интерфейс из пакета java.util, предназначенный для определения альтернативных или внешних порядков сортировки.

Он полезен, когда:
Класс не реализует Comparable.
Требуется сортировка по разным критериям.
Нет доступа к исходному коду классов.


Comparator требует реализации метода compare(T o1, T o2), который сравнивает два объекта и возвращает аналогичные значения: отрицательное, ноль или положительное.

Пример Comparator для сортировки Person по имени:

import java.util.Comparator;

public class NameComparator implements Comparator {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}


Использование:
List people = new ArrayList<>(); 
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
Collections.sort(people,
new NameComparator());
System.out.println(people); // Вывод: [Alice (30), Bob (25)]


Ключевое различие

Comparable определяет естественный порядок внутри класса (реализуется самим классом).
Comparator определяет внешний порядок и может быть реализован отдельно, что делает его более гибким.


#Java #Training #Medium #Comparable #Comparator
👍4
И сколько часов сможешь на него списать.

https://t.me/Java_for_beginner_dev

#Mems
👍2
Что выведет код?

import java.util.HashSet;

public class Task230425 {
public static void main(String[] args) {
HashSet<Double> set = new HashSet<>();
set.add(0.0);
set.add(-0.0);
set.add(Double.NaN);
set.add(Double.NaN);

System.out.println(set.size());
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
11%
1
49%
2
22%
3
11%
4
8%
Java Forever!😂
👍3
Надо проверить... 😨🫢

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
🤷‍♂2🔥1
Comparable и Comparator, внутреннее устройство и варианты применения

Как работают Comparable и Comparator под капотом

Оба интерфейса используются в алгоритмах сортировки, таких как TimSort (применяется в Collections.sort() и Arrays.sort()). TimSort — это гибридный алгоритм, сочетающий сортировку слиянием и вставками, который оптимизирован для частично отсортированных данных.

Когда вы вызываете Collections.sort(), JVM передает объекты в метод compareTo (для Comparable) или compare (для Comparator). Алгоритм использует результаты сравнений для перестановки элементов.

Важно, чтобы реализация методов была консистентной:
Если a.compareTo(b) < 0, то b.compareTo(a) > 0.
Если a.compareTo(b) == 0, то b.compareTo(a) == 0.


Нарушение этих правил (например, несогласованность сравнений) может привести к некорректной сортировке или исключениям, таким как IllegalArgumentException.

Варианты применения

Сортировка по одному критерию с Comparable
Используется, когда класс имеет один логический порядок.

Например, класс Book может сортироваться по названию:
public class Book implements Comparable {

private String title; private double price;

public Book(String title, double price) {
this.title = title;
this.price = price;
}

@Override
public int compareTo(Book other) {
return this.title.compareTo(other.title);
}

}


Множественные критерии с Comparator
Comparator позволяет создавать разные способы сортировки.

Например, для класса Book можно создать несколько компараторов:
public class BookPriceComparator implements Comparator { 

@Override public int compare(Book b1, Book b2) {

return Double.compare(b1.getPrice(), b2.getPrice());

}
}

public class BookAuthorComparator implements Comparator {

@Override public int compare(Book b1, Book b2) {

return b1.getAuthor().compareTo(b2.getAuthor());
}
}


Использование:
List books = new ArrayList<>(); 
books.add(new Book("Java", 50.0));
books.add(new Book("Python", 40.0));
Collections.sort(books, new BookPriceComparator()); // Сортировка по цене


Лямбда-выражения и Comparator

С Java 8 можно использовать лямбда-выражения или метод Comparator.comparing() для упрощения кода:
List books = new ArrayList<>(); 
books.add(new Book("Java", 50.0));
books.add(new Book("Python", 40.0));
Collections.sort(books, Comparator.comparing(Book::getPrice)); // Сортировка по цене


Комбинированная сортировка

Comparator позволяет комбинировать критерии с помощью thenComparing():

List books = new ArrayList<>(); 
books.add(new Book("Java", 50.0));
books.add(new Book("Java", 40.0));
Collections.sort(books, Comparator.comparing(Book::getTitle) .thenComparing(Book::getPrice)); // Сначала по названию, затем по цене


#Java #Training #Medium #Comparable #Comparator
👍2
#Mems. Даже пауки вкатываются в IT.
👍31
📌 Факт дня:

А вы знали, что первый видеозвонок был сделан в 1927 году?

В 1927 году AT&T провела первый видеозвонок между Вашингтоном и Нью-Йорком, используя телевизионную технологию. Это было далеко от современных Zoom и Skype, но заложило основу для видеосвязи.


proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📌 Цитата дня: Джессика Ливингстон

"Идея сама по себе ничего не стоит без исполнения."


Джессика Ливингстон, соосновательница Y Combinator, сказала это в 2007 году в книге "Founders at Work".

Почитать короткую биографию
И ее история на хабре

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Comparable и Comparator. Нюансы использования Comparable

Неизменяемость порядка
Если класс реализует Comparable, его порядок сортировки должен быть неизменным. Например, изменение поля, по которому происходит сортировка, после добавления объекта в отсортированную коллекцию (например, TreeSet), может нарушить инварианты коллекции.

Совместимость с equals
Желательно, чтобы compareTo был согласован с equals. Это значит, что если a.compareTo(b) == 0, то a.equals(b) должно быть true. Нарушение этого правила может привести к неожиданному поведению в коллекциях, таких как TreeSet или TreeMap.

Пример проблемы:
public class Person implements Comparable { 

private String name; private int age;

@Override
public int compareTo(Person other) {
return this.name.compareTo(other.name); // Сравнение только по имени
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person)) return false;
Person other = (Person) obj;
return this.name.equals(other.name) && this.age == other.age;
}

}


Здесь compareTo считает объекты равными, если совпадают имена, но equals требует совпадения и возраста. Это может вызвать проблемы в TreeSet, где два объекта с одинаковым именем, но разным возрастом будут считаться одинаковыми.

Null-обработка
Метод compareTo должен корректно обрабатывать null, иначе возможен NullPointerException.

Например:
@Override public int compareTo(Person other) {
if (other == null) return 1; // null считается "меньше" return this.age - other.age;
}


Нюансы использования Comparator

Гибкость и переиспользование
Comparator можно создавать динамически, что делает его более гибким.

Например, для одноразовой сортировки можно использовать лямбда-выражение:
List people = new ArrayList<>(); 

Collections.sort(people, (p1, p2) -> p2.getAge() - p1.getAge()); // Сортировка по убыванию возраста


Null-обработка
Comparator должен учитывать возможность null-значений.

Java 8 предоставляет методы для упрощения работы с null:
Comparator nullSafeComparator = Comparator .nullsFirst(Comparator.comparing(Person::getName)); // null-объекты будут первыми


Производительность
Частое создание новых объектов Comparator (например, в цикле) может быть неэффективным. Лучше сохранять и переиспользовать экземпляры Comparator.

Типичные ошибки

Несогласованность сравнений
Если compareTo или compare нарушают транзитивность (например, a < b и b < c, но a > c), сортировка может завершиться с ошибкой.

Использование вычитания для чисел
Вместо this.age - other.age лучше использовать Integer.compare(this.age, other.age), чтобы избежать переполнения при больших числах.

Игнорирование контракта
Реализация compareTo или compare должна быть рефлексивной, симметричной и транзитивной.

#Java #Training #Medium #Comparable #Comparator
👍3