Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥3❤1
Это принцип объектно-ориентированного программирования (ООП), который скрывает детали реализации объекта и показывает только его наиболее важные характеристики. Она позволяет сосредоточиться на сущности объекта, игнорируя его внутреннюю сложность.
В Java абстракция достигается через:
Абстрактные классы
Интерфейсы
Абстрактный класс — это класс, который не может быть создан напрямую, но может содержать:
Абстрактные методы (без реализации, только сигнатуры);
Обычные методы (с реализацией).
Используется, если вы хотите описать общее поведение для группы классов, но часть поведения оставить на усмотрение конкретных подклассов.
abstract class Animal {
// Абстрактный метод — реализуется в подклассах
abstract void makeSound();
// Обычный метод
void eat() {
System.out.println("This animal eats food.");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof!");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.makeSound(); // Woof!
dog.eat(); // This animal eats food.
Animal cat = new Cat();
cat.makeSound(); // Meow!
}
}Интерфейс — это чистый контракт, который определяет набор методов, которые класс должен реализовать.
В отличие от абстрактного класса:
Интерфейс не может содержать полей (кроме
static final).Класс может реализовать несколько интерфейсов (множественное наследование).
interface Vehicle {
void start(); // метод без реализации
void stop();
}
class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car is starting.");
}
@Override
public void stop() {
System.out.println("Car is stopping.");
}
}
class Bike implements Vehicle {
@Override
public void start() {
System.out.println("Bike is starting.");
}
@Override
public void stop() {
System.out.println("Bike is stopping.");
}
}
public class Main {
public static void main(String[] args) {
Vehicle car = new Car();
car.start(); // Car is starting.
car.stop(); // Car is stopping.
Vehicle bike = new Bike();
bike.start(); // Bike is starting.
bike.stop(); // Bike is stopping.
}
}Программистам не нужно знать все детали реализации объекта. Они работают только с его интерфейсом.
Код становится понятным и модульным, так как мы сосредоточиваемся на важной логике.
Абстракция позволяет использовать один и тот же код для разных объектов.
Если нужно изменить реализацию, это не затронет остальную часть программы (если она работает через абстрактный контракт).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2🔥1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥2❤1
Модель памяти Java (Java Memory Model, JMM) определяет, как взаимодействуют потоки через память и как изменения, сделанные одним потоком, становятся видимыми для других потоков. Модель памяти Java является фундаментальной частью многопоточной среды в Java, обеспечивающей корректность и предсказуемость поведения многопоточных программ.
JMM определяет, как потоки взаимодействуют с переменными (данными), хранящимися в общей памяти. Каждая переменная в Java хранится в основной памяти (main memory), и потоки могут иметь локальные копии этих переменных в своих рабочих кешах.
Когда поток читает переменную, он может читать ее из своей локальной копии или из основной памяти. Когда поток записывает переменную, он может записывать ее в свою локальную копию или непосредственно в основную память.
Последовательная согласованность гарантирует, что действия всех потоков будут выполняться в том порядке, в котором они были написаны в коде, если нет явных указаний на обратное.
Видимость означает, что изменения, сделанные одним потоком, становятся видимыми для других потоков. В JMM видимость изменений обеспечивается с помощью синхронизации.
JMM допускает оптимизации, такие как переупорядочивание инструкций, чтобы улучшить производительность, но гарантирует, что видимость и порядок выполнения будут сохраняться, как описано в спецификации.
public class VisibilityExample {
private static boolean flag = false;
private static int counter = 0;
public static void main(String[] args) throws InterruptedException {
Thread writer = new Thread(() -> {
counter = 42;
flag = true;
});
Thread reader = new Thread(() -> {
while (!flag) {
// Ждем пока флаг не станет true
}
System.out.println("Counter: " + counter);
});
writer.start();
reader.start();
writer.join();
reader.join();
}
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
- JRE (Java Runtime Environment): включает только среду выполнения для запуска Java-программ (JVM и стандартные библиотеки).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥1
Да, лямбда-выражения являются важной частью современной разработки на Java, и я активно их использую в своей работе. Лямбда-выражения помогают писать более лаконичный и выразительный код, особенно при работе с коллекциями и потоками данных. Вот несколько распространенных случаев использования лямбда-выражений в Java:
Использование лямбда-выражений с методом
forEach позволяет компактно и удобно итерировать по элементам коллекций. List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));С использованием Stream API и лямбда-выражений можно легко фильтровать, сортировать и преобразовывать коллекции.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
filteredNames.forEach(System.out::println); // Вывод: AliceЛямбда-выражения упрощают сортировку коллекций с использованием метода
sort. List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort((name1, name2) -> name1.compareTo(name2));
names.forEach(System.out::println);Лямбда-выражения широко используются с функциональными интерфейсами, такими как
Predicate, Function, Consumer и Supplier. // Predicate
Predicate<String> startsWithA = s -> s.startsWith("A");
boolean result = startsWithA.test("Alice"); // true
// Function
Function<String, Integer> lengthFunction = s -> s.length();
int length = lengthFunction.apply("Hello"); // 5
// Consumer
Consumer<String> printConsumer = s -> System.out.println(s);
printConsumer.accept("Hello, World!"); // Вывод: Hello, World!
// Supplier
Supplier<String> stringSupplier = () -> "Hello, Supplier!";
String suppliedString = stringSupplier.get();
System.out.println(suppliedString); // Вывод: Hello, Supplier!
Лямбда-выражения с использованием параллельных потоков позволяют легко выполнять параллельные вычисления.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
.mapToInt(Integer::intValue)
.sum();
System.out.println("Sum: " + sum); // Вывод: Sum: 15
Предположим, у нас есть список сотрудников, и мы хотим отфильтровать и отсортировать их по имени.
import java.util.*;
import java.util.stream.Collectors;
class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Employee{name='" + name + "', age=" + age + '}';
}
}
public class LambdaExample {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", 30),
new Employee("Bob", 25),
new Employee("Charlie", 35),
new Employee("David", 28)
);
// Фильтрация и сортировка сотрудников по имени
List<Employee> filteredAndSorted = employees.stream()
.filter(e -> e.getAge() > 27)
.sorted(Comparator.comparing(Employee::getName))
.collect(Collectors.toList());
filteredAndSorted.forEach(System.out::println);
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤1
- flatMap: преобразует элементы и объединяет результаты в один поток, устраняя вложенность.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍7
CAP-теорема (Consistency, Availability, Partition Tolerance) утверждает, что в распределенной системе невозможно одновременно обеспечить три свойства:
все узлы видят одни и те же данные в один момент времени.
каждый запрос получает ответ, даже если некоторые узлы вышли из строя.
система продолжает работать, даже если сеть разделилась на изолированные части.
Рассмотрим сценарий с распределенной системой, состоящей из двух узлов (A и B), которые могут обмениваться данными.
узлы A и B больше не могут обмениваться данными.
Теперь у нас есть выбор
это значит, что данные на A и B должны оставаться идентичными. Однако, так как они не могут обмениваться данными, запросы к B не могут быть обработаны до восстановления связи (нарушается доступность).
это значит, что оба узла должны продолжать отвечать на запросы. Однако, так как они не могут синхронизироваться, данные на A и B могут отличаться (нарушается согласованность). Так как разделение сети (P) может произойти в реальных условиях, система вынуждена выбирать между C и A. Таким образом, невозможно одновременно обеспечить все три свойства (C, A, P).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🤔3🤯3
Это принцип ООП, который скрывает реализацию объекта и предоставляет доступ только к необходимой информации через методы. Она обеспечивает контроль доступа к данным и защиту от некорректного использования.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19👀3🤔1
Java Server Pages (JSP) — это технология для создания динамических веб-страниц с использованием Java. JSP позволяет смешивать HTML с Java-кодом для генерации динамического контента на сервере.
Вставка Java-кода в HTML-страницы.
Скриплеты: <% ... %>
Выражения: <%= ... %>
Директивы: <%@ ... %>
Декларации: <%! ... %>
Поддержка использования JavaBeans для разделения логики и представления.
Расширение функциональности через собственные теги.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Здесь легко научиться:
▪️ Разрабатывать высоконагруженные серверные приложения
▪️ Управлять сложными базами данных
▪️ Организовывать эффективную многопоточную обработку данных
▪️ Проходить технические собеседования в ведущие IT-компании
Самый необычный канал про Java, подписывайся – @Java_per_month
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Класс HttpServlet объявлен абстрактным, потому что он предоставляет базовый функционал для обработки HTTP-запросов, но сам по себе не предназначен для непосредственного использования. Разработчики должны переопределять его методы, такие как doGet или doPost, чтобы реализовать специфичное поведение для своего приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥4👾1
HQL (Hibernate Query Language) – это язык запросов, используемый в Hibernate (фреймворке для работы с базами данных в Java), который похож на SQL, но оперирует не таблицами и столбцами, а объектами и их свойствами.
Когда мы работаем с базами данных в Hibernate, мы используем объектно-реляционное отображение (ORM), где каждая таблица представляется как класс, а строки – как объекты. Однако иногда нам нужно делать запросы к базе данных, например:
Получить список объектов, соответствующих определённому критерию
Отфильтровать, отсортировать или объединить данные
Выполнить массовое обновление или удаление
Можно, конечно, использовать чистый SQL, но тогда мы потеряем преимущества ORM, такие как переносимость кода между разными базами данных. HQL решает эту проблему, позволяя писать запросы в объектных терминах, а Hibernate сам преобразует их в правильный SQL для конкретной базы данных.
HQL очень похож на SQL, но вместо таблиц и столбцов мы используем имена классов и их полей.
Допустим, у нас есть класс User, связанный с таблицей users:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
// Геттеры и сеттеры
}
Теперь напишем HQL-запрос, чтобы получить всех пользователей старше 18 ле
String hql = "FROM User WHERE age > 18";
List<User> users = session.createQuery(hql, User.class).getResultList();
Выборка только имен пользователей
String hql = "SELECT u.name FROM User u";
List<String> names = session.createQuery(hql, String.class).getResultList();
Запрос с параметрами (предотвращает SQL-инъекции)
String hql = "FROM User WHERE name = :name";
Query<User> query = session.createQuery(hql, User.class);
query.setParameter("name", "Иван");
List<User> users = query.getResultList();
HQL автоматически адаптируется под MySQL, PostgreSQL, Oracle и другие базы.
вместо таблиц и столбцов мы работаем с сущностями (классами Java).
использование параметров (
setParameter()) предотвращает SQL-инъекции. поддержка JOIN, GROUP BY, ORDER BY и других SQL-конструкций.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤1
1. doGet(HttpServletRequest req, HttpServletResponse resp): для обработки GET-запросов.
2. doPost(HttpServletRequest req, HttpServletResponse resp): для обработки POST-запросов.
3. doPut(HttpServletRequest req, HttpServletResponse resp): для обработки PUT-запросов.
4. doDelete(HttpServletRequest req, HttpServletResponse resp): для обработки DELETE-запросов.
5. service(HttpServletRequest req, HttpServletResponse resp): для определения типа HTTP-запроса и вызова соответствующего метода.
6. init() и destroy(): для настройки сервлета и освобождения ресурсов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Garbage Collector (GC) в Java начинает сборку мусора, когда объекты в памяти больше не используются и не имеют активных ссылок.
GC понимает, что объект можно удалить, если на него больше не ссылается ни одна переменная или он стал недостижимым.
class Demo {
int value;
}
public class Main {
public static void main(String[] args) {
Demo obj = new Demo(); // Создан объект в памяти (Heap)
obj = null; // Теперь на него нет ссылки → GC его удалит
}
}Если в куче (Heap) осталось мало свободной памяти, JVM может запустить GC.
GC в Java автоматический, и его запуск зависит от алгоритма сборщика мусора. Некоторые из них:
Serial GC (для маленьких программ)
Parallel GC (по умолчанию в Java 8)
G1 GC (по умолчанию в Java 11+)
ZGC, Shenandoah GC (для высоконагруженных систем)
Устарело, потому что не умеет работать с циклическими ссылками.
Основной метод, который использует GC в Java.
GC начинает с корневых объектов (GC Roots) и проверяет, какие объекты достижимы.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Swipe right or swipe left
Что делать, если твои мэтчи в жизни не такие точные, как твой код?
Спокойно, 14 февраля в 19:00 по МСК мы разберём, как ML анализирует speed dating и предсказывает match.
📌 Мы возьмем реальные данные со speed dating.
📌 Обучим модель, которая скажет: match или swipe left.
📌 Разберём, какие признаки реально важны (спойлер: работа в IT — не прям гарантия успеха (наши маркетологи подтверждают 😥).
💡 Приходи, если хочешь прокачать свой Python, ML и, возможно, станешь идеальной парой, как самый стильные форсы.
👉 Записаться
Что делать, если твои мэтчи в жизни не такие точные, как твой код?
Спокойно, 14 февраля в 19:00 по МСК мы разберём, как ML анализирует speed dating и предсказывает match.
📌 Мы возьмем реальные данные со speed dating.
📌 Обучим модель, которая скажет: match или swipe left.
📌 Разберём, какие признаки реально важны (спойлер: работа в IT — не прям гарантия успеха (наши маркетологи подтверждают 😥).
💡 Приходи, если хочешь прокачать свой Python, ML и, возможно, станешь идеальной парой, как самый стильные форсы.
👉 Записаться
Методы HTTP, такие как POST, PUT, и DELETE, не являются неизменяемыми, поскольку они изменяют состояние сервера, добавляя, обновляя или удаляя данные. В отличие от них, методы GET и HEAD считаются неизменяемыми, так как они только запрашивают данные, не влияя на сервер.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤯2🤔1
Симметричность – это свойство, при котором если A связано с B, то B связано с A.
В логике и алгебре отношение \( R \) называется симметричным, если:
a R b \Rightarrow b R a
Но, например, отношение "a > b" не симметрично, потому что если a > b, то b > a – это неверно.
В Java симметричность важна при переопределении метода
equals(). Если
a.equals(b) == true, то обязательно должно быть b.equals(a) == true. Ошибочный код (нарушает симметричность) class Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof String) { // ❌ Сравниваем с String (ошибка)
return this.name.equals(obj);
}
return false;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Alice");
System.out.println(p.equals("Alice")); // true
System.out.println("Alice".equals(p)); // false ❌ (нарушена симметричность)
}
}Правильный способ
@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);
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
2. POST: отправка данных в теле запроса.
3. PUT: для обновления данных на сервере.
4. DELETE: для удаления данных.
5. PATCH: для частичного обновления.
6. HEAD: отправка заголовков без тела.
7. OPTIONS: получение информации о доступных методах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥1
обрабатывает HTTP-запросы и отдает статический контент (HTML, CSS, JS, изображения).
запускает бизнес-логику приложения, выполняет обработку данных и работает с базой данных.
Принимает HTTP-запросы от браузера.
Отдает статические файлы (HTML, CSS, JS, картинки).
Может перенаправлять запросы к Application Server.
Apache HTTP Server
Nginx
Microsoft IIS
Допустим, пользователь открывает сайт
example.com/index.html: Браузер отправляет HTTP-запрос:
GET /index.html HTTP/1.1
Host: example.com
Веб-сервер (например, Nginx) получает запрос и отправляет браузеру файл
index.html. Web Server НЕ обрабатывает логику приложения, он просто отправляет файлы клиенту.
Обрабатывает динамические запросы (например, авторизацию, платежи, работу с БД).
Выполняет Java-код (Servlet, EJB, Spring, Hibernate).
Может генерировать HTML-страницы на сервере (JSP, Thymeleaf).
Управляет транзакциями и соединениями с базой данных.
Tomcat (самый популярный в мире Java-сервер)
WildFly (JBoss)
GlassFish
WebLogic, WebSphere
Допустим, пользователь заходит на
example.com/login: Браузер отправляет HTTP-запрос:
POST /login HTTP/1.1
Host: example.com
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2🔥1
- Данные передаются в строке URL.
- Ограничение на длину данных (зависит от браузера/сервера).
- Менее безопасен, так как параметры видны в URL.
2. POST:
- Данные передаются в теле запроса.
- Подходит для отправки больших объемов данных.
- Более безопасен, так как данные не отображаются в URL.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🤔3🔥1