Pascal4eg / Java

 Java | Фишки и трюки

Параметр fetch

@Entity
@Table(name="post")
class Post {
    @Column(name="id")
    public Integer id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    public List<Comment> comments;
}

Параметр fetch в аннотациях @ManyToOne, @ManyToMany, @OneToOne, @OneToMany определяет как будет загружаться связанная сущность: вместе с загрузкой родительской сущности или в момент обращения к аннотированному полю.

...

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

Память кучи

В Java память кучи (heap memory) является областью памяти, где хранятся объекты и массивы. Куча управляется сборщиком мусора (garbage collector), который автоматически освобождает память, занятую объектами, которые больше не используются.

Динамическое выделение
Объекты в Java создаются динамически во время выполнения программы. Куча предоставляет пространство для хранения этих объектов, и их размер может изменяться в процессе выполнения программы.

...

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

DataInputStream и DataOutputStream

try {
    // Запись данных в файл с использованием DataOutputStream
    DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
    dos.writeInt(42);
    dos.writeDouble(3.14);
    dos.writeUTF("Привет, мир!");
    dos.close();

    // Чтение данных из файла с использованием DataInputStream
    DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
    int intValue = dis.readInt();
    double doubleValue = dis.readDouble();
    String stringValue = dis.readUTF();
    System.out.println("int: " + intValue); // int: 42
    System.out.println("double: " + doubleValue); // double: 3.14
    System.out.println("string: " + stringValue); // string: Привет, мир!
    dis.close();
} catch (IOException e) {
    e.printStackTrace();
}

DataInputStream и DataOutputStream предоставляют методы для чтения и записи примитивных данных из и в поток ввода/вывода. Эти классы добавляют функциональность к обычным потокам ввода/вывода, позволяя удобно считывать и записывать данные различных типов, таких как целые числа, числа с плавающей запятой, символы и т.д., без необходимости вручную преобразовывать их в байты.

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

Стековая память

Для оптимального запуска приложения, JVM делит память на стек и кучу. Всякий раз, когда мы объявляем новые переменные и объекты, вызываем новый метод, объявляем строку или выполняем аналогичные операции, JVM выделяет память для этих операций либо из стековой памяти, либо из кучи.

Стековая память в Java используется для распределения статической памяти и выполнения потока - каждый поток исполнения в Java имеет свой собственный стек, создаваемый вместе с потоком. Этот стек содержит кадры стека, каждый из которых представляет вызов метода. Каждый кадр содержит примитивные значения, специфичные для метода (переданные в метод и объявленные в нем), и ссылки на объекты, находящиеся в куче.

...

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

Класс Console

import java.io.Console;

public class Con {
    private static final String PASSWORD = "123";

    public static void main(String[] args) {
        Console console = System.console();
        String name = console.readLine("Enter your name: ");
        char[] pass = console.readPassword("Enter password: ");
        if (PASSWORD.equals(new String(pass))) {
            console.printf("Welcome, %s", name);
        } else {
            console.printf("access denied");
        }
    }
}

В JDK 6 и более поздних версиях мы можем использовать класс Console из пакета java.io для чтения и записи в консоль.

Если нам нужно прочитать конфиденциальную информацию, например пароль, мы можем использовать метод readPassword(), чтобы запросить у пользователя пароль и прочитать пароль из консоли с отключенным эхом.

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

Функциональное программирование (ФП)

Функциональное программирование (ФП) - это парадигма программирования, которая базируется на работе с функциями как основными строительными блоками программ. В ФП данные рассматриваются как неизменяемые и функции рассматриваются как математические функции, которые принимают входные данные и возвращают результат без видимых побочных эффектов. Вот основные концепции функционального программирования:

...

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

SequencedCollection

В Java 21 появилась новая группа интерфейсов коллекций, самым основным из которых является SequencedCollection. Он расширяет базовый интерфейс Collection, добавляя в него ряд полезных методов для манипуляций с первым и последним элементами, а также для инвертирования коллекции:

...

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

instanceof

public interface Shape { }
public class Triangle implements Shape { }
public class IsoscelesTriangle extends Triangle { } 

...

Shape shape = new Triangle();
Triangle triangle = new Triangle();
IsoscelesTriangle isoscelesTriangle = new IsoscelesTriangle();
Shape nonspecificShape = null;

assertTrue(shape instanceof Shape) ;
assertTrue(triangle instanceof Shape);
assertTrue(isoscelesTriangle instanceof Shape);
assertFalse(nonspecificShape instanceof Shape);

assertTrue(shape instanceof Triangle);
assertTrue(triangle instanceof Triangle);
assertTrue(isoscelesTriangle instanceof Triangle);
assertFalse(nonspecificShape instanceof Triangle);

assertFalse(shape instanceof IsoscelesTriangle);
assertFalse(triangle instanceof IsoscelesTriangle);
assertTrue(isoscelesTriangle instanceof IsoscelesTriangle);
assertFalse(nonspecificShape instanceof IsoscelesTriangle);

Ключевое слово instanceof — это бинарный оператор, и мы можем использовать его для проверки того, является ли определенный объект экземпляром заданного типа. Следовательно, результат операции либо истинен, либо ложен. Кроме того, ключевое слово instanceof — это наиболее распространенный и простой способ проверить, является ли объект подтипом другого типа.

...

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

Является ли слово палиндромом

public class Palindrome {
    public static void main(String[] args) {
        String word = "шалаш";
        System.out.println(isPalindrome(word));
    }

    private static boolean isPalindrome(String word) {
        int count = word.length() / 2;
        int j = word.length() - 1;
        for (int i = 0; i < count; i++) {
            if (word.charAt(i) != word.charAt(j)) {
                return false;
            }
            j--;
        }
        return true;
    }
}

Суть алгоритма в том, что бы сравнивать поочередно первую букву с последней, вторую с предпоследней и так далее. Как только одна из пар не совпадет, сразу выходим - слово не палиндром.

...

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

Метод equals()

public class User {
    public Integer id;
    public String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        return o instanceof User &&
                id != null &&
                id.equals(((User) o).id);
    }
}

Метод equals() используется для сравнения двух объектов на равенство. Он определен в классе Object и, по умолчанию, выполняет сравнение ссылок на объекты (то есть проверяет, являются ли объекты одним и тем же объектом в памяти). Многие классы переопределяют этот метод, чтобы сравнивать содержимое объектов, а не только ссылки.

...

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