🤔 Какие типы данных есть в контексте JVM?
В контексте JVM (Java Virtual Machine) типы данных делятся на два основных класса: примитивные типы данных и ссылочные типы данных.
🚩Примитивные типы данных
Примитивные типы данных представляют собой базовые типы, которые не являются объектами и хранят непосредственно значения. Они делятся на числовые типы, логический тип и символьный тип.
🟠Числовые типы
Целочисленные типы
byte: 8-битный знаковый целочисленный тип данных (диапазон от -128 до 127).
short: 16-битный знаковый целочисленный тип данных (диапазон от -32,768 до 32,767).
int: 32-битный знаковый целочисленный тип данных (диапазон от -2^31 до 2^31-1).
long: 64-битный знаковый целочисленный тип данных (диапазон от -2^63 до 2^63-1).
Типы с плавающей точкой
float: 32-битный IEEE 754 тип данных с плавающей точкой одинарной точности.
double: 64-битный IEEE 754 тип данных с плавающей точкой двойной точности.
🟠Логический тип
🟠Символьный тип
🚩Ссылочные типы данных
Ссылочные типы данных представляют собой объекты и массивы. Они хранят ссылку на область памяти, где хранятся данные объекта или массива.
🟠Классы (Classes)
Любой объектный тип данных является экземпляром класса. Классы могут быть как стандартными (например,
🟠Интерфейсы (Interfaces)
Интерфейсы определяют набор методов, которые должны быть реализованы классами, которые их реализуют.
🟠Массивы (Arrays)
Массивы могут быть одномерными или многомерными и могут хранить как примитивные, так и ссылочные типы данных.
🚩Пример примитивных и ссылочных типов данных
Ставь 👍 и забирай 📚 Базу знаний
В контексте JVM (Java Virtual Machine) типы данных делятся на два основных класса: примитивные типы данных и ссылочные типы данных.
🚩Примитивные типы данных
Примитивные типы данных представляют собой базовые типы, которые не являются объектами и хранят непосредственно значения. Они делятся на числовые типы, логический тип и символьный тип.
🟠Числовые типы
Целочисленные типы
byte: 8-битный знаковый целочисленный тип данных (диапазон от -128 до 127).
short: 16-битный знаковый целочисленный тип данных (диапазон от -32,768 до 32,767).
int: 32-битный знаковый целочисленный тип данных (диапазон от -2^31 до 2^31-1).
long: 64-битный знаковый целочисленный тип данных (диапазон от -2^63 до 2^63-1).
Типы с плавающей точкой
float: 32-битный IEEE 754 тип данных с плавающей точкой одинарной точности.
double: 64-битный IEEE 754 тип данных с плавающей точкой двойной точности.
🟠Логический тип
boolean: Представляет логическое значение (true или false).🟠Символьный тип
char: 16-битный тип данных, представляющий символ Unicode (диапазон от '\u0000' до '\uffff').🚩Ссылочные типы данных
Ссылочные типы данных представляют собой объекты и массивы. Они хранят ссылку на область памяти, где хранятся данные объекта или массива.
🟠Классы (Classes)
Любой объектный тип данных является экземпляром класса. Классы могут быть как стандартными (например,
String, Integer), так и пользовательскими.🟠Интерфейсы (Interfaces)
Интерфейсы определяют набор методов, которые должны быть реализованы классами, которые их реализуют.
🟠Массивы (Arrays)
Массивы могут быть одномерными или многомерными и могут хранить как примитивные, так и ссылочные типы данных.
🚩Пример примитивных и ссылочных типов данных
public class DataTypesExample {
public static void main(String[] args) {
// Примитивные типы данных
byte aByte = 10;
short aShort = 100;
int anInt = 1000;
long aLong = 10000L;
float aFloat = 10.5f;
double aDouble = 10.55;
boolean aBoolean = true;
char aChar = 'A';
// Ссылочные типы данных
String aString = "Hello, World!";
Integer anInteger = 1000;
int[] anArray = {1, 2, 3, 4, 5};
// Вывод примитивных типов данных
System.out.println("byte: " + aByte);
System.out.println("short: " + aShort);
System.out.println("int: " + anInt);
System.out.println("long: " + aLong);
System.out.println("float: " + aFloat);
System.out.println("double: " + aDouble);
System.out.println("boolean: " + aBoolean);
System.out.println("char: " + aChar);
// Вывод ссылочных типов данных
System.out.println("String: " + aString);
System.out.println("Integer: " + anInteger);
System.out.println("Array: " + java.util.Arrays.toString(anArray));
}
}Ставь 👍 и забирай 📚 Базу знаний
👍8
🤔 Что известно про приведение типов? Что такое понижение и повышение типа?
- Повышение типа (Widening) — безопасное преобразование от меньшего типа к большему (например, int → long).
- Понижение типа (Narrowing) — преобразование от большего типа к меньшему, требует явного указания и может привести к потере данных (double → int).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Повышение типа (Widening) — безопасное преобразование от меньшего типа к большему (например, int → long).
- Понижение типа (Narrowing) — преобразование от большего типа к меньшему, требует явного указания и может привести к потере данных (double → int).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥5👍2
🤔 Каким образом можно заставить поток выполнится приоритет и есть ли такая возможность в Java?
В Java у каждого потока есть приоритет, но он не гарантирует порядок выполнения.
🟠Использование `setPriority(int priority)`
Java позволяет задавать приоритет потока с помощью метода
🟠Почему `setPriority()` не даёт 100% контроль?
Приоритет – это всего лишь рекомендация для ОС.
Распределение процессорного времени зависит от планировщика ОС.
В Windows, Linux, macOS приоритеты работают по-разному, и Java не контролирует их на низком уровне.
🟠Как действительно заставить поток выполниться первым?
Реальные способы управления порядком выполнения:
а) Использование
Позволяет дождаться выполнения одного потока перед запуском другого.
б) Использование
Позволяет гарантированно выполнять потоки по очереди.
Ставь 👍 и забирай 📚 Базу знаний
В Java у каждого потока есть приоритет, но он не гарантирует порядок выполнения.
🟠Использование `setPriority(int priority)`
Java позволяет задавать приоритет потока с помощью метода
setPriority(), который принимает значение от 1 до 10: Thread.MIN_PRIORITY (1) – минимальный приоритет Thread.NORM_PRIORITY (5) – стандартный приоритет (по умолчанию) Thread.MAX_PRIORITY (10) – максимальный приоритет class MyThread extends Thread {
public MyThread(String name, int priority) {
super(name);
setPriority(priority);
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " выполняется с приоритетом " + getPriority());
}
}
}
public class Main {
public static void main(String[] args) {
MyThread low = new MyThread("Low Priority", Thread.MIN_PRIORITY);
MyThread high = new MyThread("High Priority", Thread.MAX_PRIORITY);
low.start();
high.start();
}
}🟠Почему `setPriority()` не даёт 100% контроль?
Приоритет – это всего лишь рекомендация для ОС.
Распределение процессорного времени зависит от планировщика ОС.
В Windows, Linux, macOS приоритеты работают по-разному, и Java не контролирует их на низком уровне.
🟠Как действительно заставить поток выполниться первым?
Реальные способы управления порядком выполнения:
а) Использование
join()Позволяет дождаться выполнения одного потока перед запуском другого.
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread high = new MyThread("High Priority", Thread.MAX_PRIORITY);
Thread low = new MyThread("Low Priority", Thread.MIN_PRIORITY);
high.start();
high.join(); // Ждём, пока high завершится
low.start(); // Теперь запускается low
}
}б) Использование
Executors.newSingleThreadExecutor() Позволяет гарантированно выполнять потоки по очереди.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> System.out.println("Задача 1"));
executor.submit(() -> System.out.println("Задача 2"));
executor.shutdown();
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍6🤔1
🤔 Перечисли основные виды селекторов.
Основные виды селекторов:
- Селектор по тегу (div, p);
- Селектор по классу (.my-class);
- Селектор по идентификатору (#my -id);
- Групповые селекторы (h1, h2);
- Потомковые (div p);
- Дочерние (div > p);
- Соседние (h1 + p);
- Универсальный (*).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Основные виды селекторов:
- Селектор по тегу (div, p);
- Селектор по классу (.my-class);
- Селектор по идентификатору (
- Групповые селекторы (h1, h2);
- Потомковые (div p);
- Дочерние (div > p);
- Соседние (h1 + p);
- Универсальный (*).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊10🔥3🤔2
🤔 Что такое heap, stack?
В контексте Java, Heap (куча) и Stack (стек) являются областями памяти, используемыми JVM для управления памятью, необходимой для выполнения программы. Каждая из этих областей имеет свои характеристики и используется для разных целей.
🚩Heap (Куча)
Heap — это область памяти, выделенная для динамического распределения памяти объектов и массивов. Все объекты, созданные с использованием оператора
🟠Особенности
Куча разделена на поколения: молодое поколение (Young Generation) и старое поколение (Old Generation).
Молодое поколение включает в себя области Eden Space и Survivor Spaces (S0 и S1).
Старое поколение хранит долгоживущие объекты.
🟠Управление памятью
Куча управляется сборщиком мусора (Garbage Collector), который автоматически освобождает память, занятую объектами, которые больше не используются.
🟠Использование
Куча используется для хранения объектов, массивов и классов, информация о которых сохраняется на протяжении всего времени их жизни.
🚩Stack (Стек)
Стек — это область памяти, используемая для управления вызовами методов и хранения локальных переменных, параметров методов и информации о возвратах.
🟠Особенности
Каждый поток имеет свой собственный стек.
Стек хранит кадры (frames) для каждого вызова метода. Каждый кадр содержит локальные переменные метода и информацию о вызовах.
🟠Управление памятью
Память в стеке автоматически управляется при вызове методов и выходе из них. Когда метод вызывается, создается новый кадр в стеке; когда метод завершает выполнение, его кадр удаляется из стека.
🟠Использование
Стек используется для хранения примитивных типов данных и ссылок на объекты, которые находятся в куче.
Локальные переменные методов и параметры методов хранятся в стеке.
Ставь 👍 и забирай 📚 Базу знаний
В контексте Java, Heap (куча) и Stack (стек) являются областями памяти, используемыми JVM для управления памятью, необходимой для выполнения программы. Каждая из этих областей имеет свои характеристики и используется для разных целей.
🚩Heap (Куча)
Heap — это область памяти, выделенная для динамического распределения памяти объектов и массивов. Все объекты, созданные с использованием оператора
new, размещаются в куче.🟠Особенности
Куча разделена на поколения: молодое поколение (Young Generation) и старое поколение (Old Generation).
Молодое поколение включает в себя области Eden Space и Survivor Spaces (S0 и S1).
Старое поколение хранит долгоживущие объекты.
🟠Управление памятью
Куча управляется сборщиком мусора (Garbage Collector), который автоматически освобождает память, занятую объектами, которые больше не используются.
🟠Использование
Куча используется для хранения объектов, массивов и классов, информация о которых сохраняется на протяжении всего времени их жизни.
public class Example {
public static void main(String[] args) {
Example obj = new Example(); // obj создается в куче
}
}🚩Stack (Стек)
Стек — это область памяти, используемая для управления вызовами методов и хранения локальных переменных, параметров методов и информации о возвратах.
🟠Особенности
Каждый поток имеет свой собственный стек.
Стек хранит кадры (frames) для каждого вызова метода. Каждый кадр содержит локальные переменные метода и информацию о вызовах.
🟠Управление памятью
Память в стеке автоматически управляется при вызове методов и выходе из них. Когда метод вызывается, создается новый кадр в стеке; когда метод завершает выполнение, его кадр удаляется из стека.
🟠Использование
Стек используется для хранения примитивных типов данных и ссылок на объекты, которые находятся в куче.
Локальные переменные методов и параметры методов хранятся в стеке.
public class Example {
public static void main(String[] args) {
int localVar = 10; // localVar хранится в стеке
Example obj = new Example(); // Ссылка на obj хранится в стеке, а сам объект — в куче
obj.method();
}
public void method() {
int anotherVar = 20; // anotherVar хранится в стеке
}
}Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Зачем добавили ArrayList, если уже был Vector?
- Vector — синхронизирован, что делает его менее производительным;
- ArrayList — не синхронизирован, работает быстрее;
- Добавление ArrayList даёт контроль над потокобезопасностью.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Vector — синхронизирован, что делает его менее производительным;
- ArrayList — не синхронизирован, работает быстрее;
- Добавление ArrayList даёт контроль над потокобезопасностью.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6💊3
🤔 Чем отличается обычный объект от Bean?
В Spring термин Bean (бин) означает объект, управляемый Spring-контейнером.
🟠Обычный объект (Java POJO)
Создаётся вручную, Spring о нём ничего не знает
🟠Spring Bean (управляемый объект)
Spring создаёт и управляет бином через аннотации.
Теперь объект создаётся Spring-контейнером
Ставь 👍 и забирай 📚 Базу знаний
В Spring термин Bean (бин) означает объект, управляемый Spring-контейнером.
🟠Обычный объект (Java POJO)
Создаётся вручную, Spring о нём ничего не знает
class Car {
void drive() {
System.out.println("Машина едет...");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car(); // Создаём объект вручную
car.drive();
}
}🟠Spring Bean (управляемый объект)
Spring создаёт и управляет бином через аннотации.
import org.springframework.stereotype.Component;
@Component // Сообщает Spring, что этот класс - Bean
class Car {
void drive() {
System.out.println("Spring-машина едет...");
}
}
Теперь объект создаётся Spring-контейнером
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class); // Получаем Bean из Spring-контейнера
car.drive();
}
}
Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Что будет, если применить volatile к объектам?
volatile применимо к ссылке на объект, но не к самому объекту.
Это значит:
- ссылка будет видна всем потокам;
- поля объекта не становятся volatile, если они изменяются напрямую;
- это не защищает от состояний гонки внутри объекта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
volatile применимо к ссылке на объект, но не к самому объекту.
Это значит:
- ссылка будет видна всем потокам;
- поля объекта не становятся volatile, если они изменяются напрямую;
- это не защищает от состояний гонки внутри объекта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Чем stub отличается от mock?
В тестировании разница между Stub и Mock заключается в их предназначении и способе использования.
🚩Stub (Заглушка)
Stub – это простейший объект-заглушка, который возвращает заранее заданные данные. Он не проверяет, какие методы были вызваны, а просто отвечает на запросы.
🚩Mock (Макет)
Mock – это объект, который имитирует поведение реального объекта и позволяет проверять вызовы методов (сколько раз был вызван, с какими аргументами и т. д.).
Ставь 👍 и забирай 📚 Базу знаний
В тестировании разница между Stub и Mock заключается в их предназначении и способе использования.
🚩Stub (Заглушка)
Stub – это простейший объект-заглушка, который возвращает заранее заданные данные. Он не проверяет, какие методы были вызваны, а просто отвечает на запросы.
class UserRepositoryStub implements UserRepository {
@Override
public User findById(Long id) {
return new User(id, "Иван"); // Просто возвращает статичные данные
}
}🚩Mock (Макет)
Mock – это объект, который имитирует поведение реального объекта и позволяет проверять вызовы методов (сколько раз был вызван, с какими аргументами и т. д.).
UserRepository userRepository = mock(UserRepository.class);
when(userRepository.findById(1L)).thenReturn(new User(1L, "Иван"));
User user = userRepository.findById(1L);
verify(userRepository, times(1)).findById(1L); // Проверяем, что метод был вызван 1 раз
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Какой механизм используется при реализации параллельных стримов?
Параллельные стримы используют ForkJoinPool, а именно его общий (common) пул потоков.
Он применяет алгоритм fork-join:
- разбивает задачи на подзадачи,
- распределяет их между потоками.
Это позволяет выполнять операции над потоками в разных потоках параллельно, если они не зависят друг от друга.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Параллельные стримы используют ForkJoinPool, а именно его общий (common) пул потоков.
Он применяет алгоритм fork-join:
- разбивает задачи на подзадачи,
- распределяет их между потоками.
Это позволяет выполнять операции над потоками в разных потоках параллельно, если они не зависят друг от друга.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний