- Полей (переменные, описывающие состояние).
- Методов (поведение класса/объекта).
- Конструкторов (для создания объектов).
- Блоков инициализации (статических и нестатических).
- Вложенных классов и интерфейсов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥1
Цикл
forEach – это удобный способ перебора элементов коллекций в Java. Это специальный цикл, который упрощает перебор элементов коллекций и массивов. Он пришёл на замену классическому
for и while, делая код чище. List<String> names = List.of("Alice", "Bob", "Charlie");
for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i));
}Современный
forEach for (String name : names) {
System.out.println(name);
}С выходом Java 8 в интерфейсе
Iterable появился метод forEach(), который принимает лямбда-выражение. List<String> names = List.of("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));Или с ссылкой на метод (
::) names.forEach(System.out::println);
Метод
forEach() можно применять и к Map, передавая BiConsumer<K, V>. Map<Integer, String> users = Map.of(1, "Alice", 2, "Bob");
users.forEach((id, name) -> System.out.println(id + " -> " + name));
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25
- equals(): Используется для сравнения содержимого объектов (логическое равенство).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥1
Символ-разделитель в пути к файлу зависит от операционной системы:
Windows использует обратный слеш (
\) C:\Users\Username\Documents\file.txt
Linux / macOS используют прямой слеш (
/) /home/user/documents/file.txt
В Java есть кроссплатформенный способ получения разделителя пути:
import java.io.File;
public class PathExample {
public static void main(String[] args) {
String path = "home" + File.separator + "user" + File.separator + "file.txt";
System.out.println("Путь: " + path);
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥1
Inversion of Control (IoC) — это принцип проектирования, при котором управление созданием и жизненным циклом объектов передаётся внешней системе.
Без IoC код сильно зависит от конкретных классов, что усложняет тестирование и поддержку.
class Car {
private Engine engine;
public Car() {
this.engine = new Engine(); // Прямое создание зависимости ❌
}
}С IoC (зависимость передаётся извне)
class Car {
private final Engine engine;
public Car(Engine engine) { // Зависимость передаётся через конструктор
this.engine = engine;
}
}IoC достигается через паттерны проектирования, такие как:
Dependency Injection (DI) – передача зависимостей извне (через конструктор, поле или метод).
Factory Method – создание объектов через фабрики.
Event-driven подход – реакция на события вместо явного вызова методов.
Spring реализует IoC через контейнер IoC, который управляет созданием объектов (бинов) и их зависимостями.
@Component
class Engine {}
@Component
class Car {
private final Engine engine;
@Autowired
public Car(Engine engine) { // Spring автоматически передаст нужный объект
this.engine = engine;
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🤔1
- Stream API: Позволяет работать с потоками данных (фильтрация, преобразование, сбор).
- Optional: Для работы с отсутствующими значениями.
- Функциональные интерфейсы: Например, Function, Predicate, Supplier.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥1
FIFO (First-In, First-Out) – это принцип обработки данных: "первым вошёл – первым вышел".
Пример работы FIFO с
Queue import java.util.*;
public class FifoExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>(); // Можно заменить на ArrayDeque
queue.add("Первый");
queue.add("Второй");
queue.add("Третий");
System.out.println(queue.poll()); // Первый
System.out.println(queue.poll()); // Второй
System.out.println(queue.poll()); // Третий
}
}
Queue<Integer> queue = new LinkedList<>();
queue.add(10);
System.out.println(queue.peek()); // 10 (но не удаляет)
System.out.println(queue.poll()); // 10 (удаляет)
System.out.println(queue.poll()); // null (очередь пуста)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Фиксированный размер – при создании массива его длина задаётся раз и навсегда.
Нельзя изменить размер – нельзя добавить или удалить элементы после создания массива.
int[] numbers = new int[5]; // Размер 5, изменить нельзя!
В Java есть динамические структуры данных, например
ArrayList. import java.util.ArrayList;
import java.util.List;
public class DynamicArrayExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list); // [1, 2, 3]
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1🔥1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3❤1
XML (Extensible Markup Language) — это расширяемый язык разметки, который используется для хранения и передачи данных в формате, удобном для чтения как человеком, так и машиной.
XML используется для структурированного хранения информации. Он позволяет определять собственные теги и организовывать данные в удобном формате. Основные применения:
Обмен данными между системами (например, между сервером и клиентом).
Конфигурационные файлы (например,
web.xml в Java).Хранение данных (например, в файлах настроек, документах).
Веб-сервисы (SOAP использует XML для передачи сообщений).
XML-документ состоит из элементов (тегов), которые образуют древовидную структуру. Пример простого XML:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>Иван</name>
<age>30</age>
<city>Москва</city>
</person>
В Java XML часто используется для работы с конфигурациями и веб-сервисами. Популярные библиотеки для работы с XML:
DOM (Document Object Model) — загружает весь XML-файл в память, создавая дерево элементов.
SAX (Simple API for XML) — обрабатывает XML последовательно, без загрузки в память.
JAXB (Java Architecture for XML Binding) — позволяет преобразовывать Java-объекты в XML и обратно.
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import java.io.StringWriter;
@XmlRootElement
class Person {
private String name;
private int age;
public Person() {} // Пустой конструктор нужен для JAXB
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@XmlElement
public String getName() { return name; }
@XmlElement
public int getAge() { return age; }
}
public class Main {
public static void main(String[] args) throws JAXBException {
Person person = new Person("Иван", 30);
JAXBContext context = JAXBContext.newInstance(Person.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(person, writer);
System.out.println(writer.toString());
}
}
Вывод
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<name>Иван</name>
<age>30</age>
</person>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥2
GC начинает сборку мусора, когда объем доступной памяти становится низким или достигается определенный порог, установленный JVM. Он также может запускаться вручную, если система считает это необходимым, например, при достижении лимита кучи.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍1
FileFilter — это интерфейс в пакете java.io, используемый для фильтрации файлов в каталогах. Он применяется в методе listFiles(FileFilter filter) класса File и позволяет выбрать только те файлы, которые соответствуют заданным критериям.Этот интерфейс содержит всего один метод:
boolean accept(File pathname);
Допустим, мы хотим отфильтровать все файлы
.txt в заданной папке:import java.io.File;
import java.io.FileFilter;
public class TxtFileFilterExample {
public static void main(String[] args) {
File directory = new File("C:/example"); // Укажите свою папку
// Используем FileFilter для выбора файлов с расширением .txt
FileFilter txtFilter = new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.getName().endsWith(".txt");
}
};
// Получаем список файлов, соответствующих фильтру
File[] txtFiles = directory.listFiles(txtFilter);
// Выводим найденные файлы
if (txtFiles != null) {
for (File file : txtFiles) {
System.out.println("Файл: " + file.getName());
}
}
}
}
Выходные данные (если в папке
C:/example есть файлы .txt)Файл: notes.txt
Файл: tasks.txt
Вместо анонимного класса можно использовать лямбда-выражение:
FileFilter txtFilter = file -> file.isFile() && file.getName().endsWith(".txt");FileFilter принимает объект File, позволяя фильтровать как файлы, так и каталоги.FilenameFilter принимает только имя файла (без пути).import java.io.File;
import java.io.FilenameFilter;
public class TxtFilenameFilterExample {
public static void main(String[] args) {
File directory = new File("C:/example");
// Фильтр для файлов .txt
FilenameFilter txtFilter = (dir, name) -> name.endsWith(".txt");
String[] txtFiles = directory.list(txtFilter);
if (txtFiles != null) {
for (String file : txtFiles) {
System.out.println("Файл: " + file);
}
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Строка (String) является иммутабельным объектом, хранящимся в куче (heap). Под капотом строка представлена массивом char[] (до Java 9) или byte[] с дополнительной кодировкой (Compact Strings в Java 9+), что снижает потребление памяти.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍8❤3
В Java строки (
String) являются неизменяемыми (immutable) объектами и обрабатываются особым образом, особенно при их создании.Когда вы пишете:
String str1 = "Hello";
Когда вы создаёте строку так:
String str2 = new String("Hello");public class StringTest {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true (ссылаются на один объект в пуле)
System.out.println(str1 == str3); // false (разные объекты в памяти)
System.out.println(str1.equals(str3)); // true (содержимое одинаковое)
}
}В 99% случаев
new String() не нужен. Его создание расходует память и снижает производительность.Но он может быть полезен, если вы намеренно хотите создать новый объект, например, для защиты от изменения ссылок:
String safeCopy = new String(originalString); // Теперь это точно отдельный объект
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤1
1. Использование final char[] (до Java 9) – строка после создания не может быть изменена.
2. String Pool – при повторном использовании одинаковых строк объект не создается заново.
3. Безопасность многопоточного доступа – строки могут использоваться в потоках без блокировок.
4. Кэширование хеш-кода – ускоряет работу с HashMap, Set.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4
Транзитивность — это математическое и логическое свойство отношений, означающее, что если A связано с B, а B связано с C, то A связано с C.
Согласно контракту метода
equals(), он должен быть транзитивнымclass Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return name.equals(person.name);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Иван");
Person p2 = new Person("Иван");
Person p3 = new Person("Иван");
System.out.println(p1.equals(p2)); // true
System.out.println(p2.equals(p3)); // true
System.out.println(p1.equals(p3)); // true (транзитивность)
}
}Метод
compareTo() должен соблюдать транзитивность:class Student implements Comparable<Student> {
int age;
Student(int age) {
this.age = age;
}
@Override
public int compareTo(Student other) {
return Integer.compare(this.age, other.age);
}
}
public class Main {
public static void main(String[] args) {
Student s1 = new Student(25);
Student s2 = new Student(20);
Student s3 = new Student(15);
System.out.println(s1.compareTo(s2)); // > 0 (s1 > s2)
System.out.println(s2.compareTo(s3)); // > 0 (s2 > s3)
System.out.println(s1.compareTo(s3)); // > 0 (s1 > s3) (транзитивность)
}
}В Java классы могут наследоваться транзитивно
class Animal {}
class Mammal extends Animal {}
class Dog extends Mammal {}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
1. Единственный абстрактный метод (SAM - Single Abstract Method) – в интерфейсе должен быть ровно один абстрактный метод.
2. Допустимые default и static методы – могут присутствовать, но не считаются абстрактными.
3. Совместимость с лямбда-выражениями – позволяет использовать функциональный стиль.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤1🔥1
В базах данных и многопоточных системах транзакция — это атомарная последовательность операций, которая должна выполняться корректно и полностью.
Транзакция выполняется полностью или не выполняется вовсе.
Перевод 1000 рублей с одного счёта на другой:
- Списать 1000 рублей с А
- Зачислить 1000 рублей на B
Если вторая операция не удалась, первая должна быть отменена.
try {
connection.setAutoCommit(false); // Отключаем автокоммит
withdraw(accountA, 1000);
deposit(accountB, 1000);
connection.commit(); // Подтверждаем транзакцию
} catch (Exception e) {
connection.rollback(); // Откат в случае ошибки
}После транзакции данные должны оставаться в логически правильном состоянии.
Одна транзакция не должна мешать выполнению другой.
Два клиента одновременно бронируют одно и то же место в самолёте.
Система должна обработать их по очереди, а не одновременно.
В Java изолированность регулируется уровнями транзакций (
TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ и т. д.), чтобы избежать проблем, таких как "грязное чтение" или "фантомные записи".connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
После успешного завершения транзакции данные не должны теряться даже при сбоях (например, отключении электричества).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11