Java Server Pages (JSP) является мощной технологией для создания динамически генерируемых веб-страниц на стороне сервера. Предоставляет множество преимуществ и решает ряд задач, которые делают его необходимым в разработке веб-приложений:
add(), remove(), size(), isEmpty() и iterator(), которые должны быть реализованы всеми коллекциями.ArrayList, LinkedList и Vector.HashSet, LinkedHashSet и TreeSet.LinkedList реализует как List, так и Queue. Также есть PriorityQueue для элементов, которые должны обрабатываться в порядке приоритета.Collection интерфейса. Описывает структуру для хранения пар ключ/значение. Ключи уникальны, а значения могут дублироваться. Реализации включают HashMap, LinkedHashMap, TreeMap и Hashtable.HashSet, сохраняя порядок вставки элементов.HashMap, сохраняя порядок вставки ключей.Иерархия коллекций обеспечивает унифицированный способ работы с различными типами данных. Она предоставляет гибкость для выбора подходящей структуры данных в зависимости от требований к производительности, порядку элементов и уникальности значений. Использование этих коллекций позволяет разработчикам эффективно хранить, извлекать, удалять и обрабатывать данные в Java-приложениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🤯5👍3🔥1
Anonymous Quiz
76%
System.exit()
9%
Runtime.exit()
5%
Program.terminate()
10%
Application.shutdown()
❤1👍1
SOLID — это акроним, представляющий пять основных принципов ООП и дизайна, направленных на повышение гибкости, масштабируемости и поддерживаемости ПО. Они помогает избежать проблемы с проектированием, такие как жесткая зависимость между компонентами программы и сложности в внесении изменений или добавлении новых функций.
class UserSettings {
void changeEmail(User user) {
if(checkAccess(user)) {
// Изменение email пользователя
}
}
boolean checkAccess(User user) {
// Проверка прав доступа
return true;
}
}Здесь класс
UserSettings нарушает SRP, если бы в нем также были методы для управления пользователями. Лучше вынести метод checkAccess в отдельный класс.SOLID принципы направлены на создание гибкой, масштабируемой архитектуры, которая легко поддается изменениям и развитию. Используя эти принципы, можно создавать системы, которые легче понимать, поддерживать и расширять.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍10🎉1
Anonymous Quiz
4%
Библиотека для работы с сетевыми соединениями
94%
Библиотека для работы с базами данных
1%
Библиотека для работы с графическим интерфейсом
1%
Библиотека для работы с файловой системой
🤯20😁3❤2👍2
Иерархия исключений организована в виде дерева наследования, где все классы исключений являются потомками класса Throwable. Он делится на два основных подкласса: Error и Exception.
От него напрямую наследуются классы Error и Exception. Этот класс содержит методы для получения сообщения об ошибке, локализованного сообщения, причины исключения и стека вызовов, а также методы для подавления исключений и работы со стеком вызовов.
Error описывает серьёзные ошибки, возникающие на уровне виртуальной машины и библиотеки языка, из-за которых приложение обычно не может восстановиться. Примеры включают OutOfMemoryError и StackOverflowError. Ошибки этого типа обычно не предназначены для обработки приложением.
Являются непроверяемыми исключениями. Они обозначают ошибки, такие как неверное приведение типов (ClassCastException), обращение по нулевой ссылке (NullPointerException) и выход за пределы массива (ArrayIndexOutOfBoundsException). Эти исключения не требуют обязательной обработки в блоке try-catch.
Требуют обязательной обработки в блоке try-catch или должны быть объявлены в сигнатуре метода с помощью throws. Они бозначают условия, с которыми приложение может предвидеть и справиться. Примеры включают IOException, FileNotFoundException и ClassNotFoundException.
Иерархия исключений обеспечивает структурированный и гибкий способ обработки ошибок и исключительных ситуаций в приложениях. Позволяет различать серьёзные проблемы системного уровня, с которыми приложение не может справиться.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥8
Anonymous Quiz
2%
public
12%
private
37%
protected
49%
default
😁16👀3❤1👍1
Object - суперкласс для всех классов. Все объекты, включая массивы, наследуют методы этого класса. Они предоставляют функции, которые доступны для любого объекта. Вот основные методы:
clone() - создает и возвращает копию объекта. Метод защищенный, поэтому его можно вызвать только внутри класса объекта или в классах потомках.equals(Object obj) - определяет равенство между двумя объектами. По умолчанию, этот метод сравнивает ссылки на объекты.finalize() - вызывается перед удалением объекта сборщиком мусора. Метод устарел.getClass() - возвращает Class, который представляет класс данного объекта. Можно использовать для получения имени во время выполнения.hashCode() - возвращает хеш-код, который используется для оптимизации хранения в структурах данных.notify() - пробуждает один поток, который ожидает на объекте (вызвавший wait()). Этот метод должен вызываться в синхронизированном контексте.notifyAll() - пробуждает все ожидающие потоки. Должен вызываться в синхронизированном контексте.toString() - возвращает строковое представление. По умолчанию, возвращает класс и хеш-код, но часто переопределяется для предоставления более информативного представления.wait() - заставляет текущий поток ожидать, пока другой поток не вызовет notify() или notifyAll(). Существуют перегруженные версии wait(long timeout) и wait(long timeout, int nanos), позволяющие указать максимальное время ожидания.Эти методы предоставляют основу для механизмов, таких как сравнение объектов, их клонирование, уведомление и ожидание в многопоточных средах, а также для работы с хеш-таблицами. Играют важную роль в проектировании и реализации Java-программ.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤3👍3
Anonymous Quiz
65%
Runnable
33%
Thread
2%
Callable
1%
Future
🤯5👍3❤2
Исключения (exceptions) важная часть обработки ошибок. Есть две основные категории: проверяемые (checked) и непроверяемые (unchecked).
try-catch или должны быть указаны в сигнатуре метода с помощью ключевого слова throws. IOException, FileNotFoundException, ClassNotFoundException и другие.try {
FileInputStream file = new FileInputStream("non_existent_file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}В этом примере
FileNotFoundException является проверяемым исключением, и его необходимо обрабатывать в блоке try-catch.NullPointerException, IndexOutOfBoundsException, ArithmeticException и другие.int result = 10 / 0; // Приводит к ArithmeticException
Здесь
ArithmeticException является непроверяемым исключением, вызванным делением на ноль.Разделение позволяет управлять потенциальными ошибками, которые могут быть исправлены, и отличать их от ошибок времени выполнения, которые чаще всего являются результатом ошибок в коде. Это способствует написанию более надежного и устойчивого к ошибкам кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9😁1
Anonymous Quiz
61%
System.currentTimeMillis()
20%
System.getCurrentTime()
10%
Date.getTime()
9%
Calendar.getTimeInMillis()
👍8❤1🤔1
Anonymous Quiz
92%
Процесс освобождения неиспользуемой памяти
0%
Процесс создания новых объектов
3%
Процесс упорядочивания данных в памяти
5%
Процесс удаления файлов
🤔5👍2❤1
Anonymous Quiz
18%
Анонимные классы для обработки событий
77%
Краткий способ написания анонимных функций
3%
Классы для работы с потоками
2%
Методы для сериализации объектов
👍8🔥1
Anonymous Quiz
8%
Метки для управления потоком
89%
Способ добавления метаданных к коду
2%
Методы для управления памятью
2%
Классы для обработки исключений
👍5👾3
Anonymous Quiz
39%
cast
8%
convert
8%
as
44%
instanceof
🤯26😁9🤔6❤2👍1
hashCode() и equals() играют важную роль в работе с объектами, особенно когда речь идет о коллекциях, таких как
HashSet, HashMap, и Hashtable. Они определены в классе Object, и поэтому доступны для переопределения всеми классами. Правильное переопределение этих методов важно для эффективной работы коллекций, которые используют хеширование.Контракт
hashCode() и equals() - определяет, как эти методы должны взаимодействовать друг с другом:Если два объекта равны согласно методу
equals(Object obj), тогда вызов hashCode() на каждом из объектов должен возвращать одинаковое целое значение. Это не значит, что объекты, не равные друг другу, должны возвращать различные хеш-коды. Однако, разные хеш-коды могут помочь улучшить производительность хеш-таблиц.hashCode() двух объектов возвращает одинаковое значение, это не обязательно означает, что объекты равны согласно equals(). Ситуация, когда разные объекты имеют одинаковые хеш-коды, называется коллизией.equals(Object obj) используется для проверки равенства двух объектов. По умолчанию, этот метод проверяет равенство ссылок, что означает, что два объекта считаются равными, только если они указывают на одно и то же место в памяти. Переопределение метода equals() позволяет сравнивать объекты по содержанию.x, x.equals(x) должно возвращать true.x и y, x.equals(y) должно возвращать true тогда и только тогда, когда y.equals(x) возвращает true.x, y, и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, то и x.equals(z) должно возвращать true.x и y, многократные вызовы x.equals(y) должны последовательно возвращать true или последовательно возвращать false.x, x.equals(null) должно возвращать false.Переопределение
hashCode() возвращает хеш-код объекта, который используется хеш-таблицами для определения места хранения объекта. При переопределении equals(), необходимо также переопределить (), чтобы поддерживать общий контракт для методов hashCode() и equals().public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
В этом примере,
equals() сравнивает объекты по name и age, а hashCode() использует эти же поля для генерации хеш-кода. Это обеспечивает соблюдение контракта между equals() и hashCode().Правильное переопределение equals() и hashCode() критически важно для корректной работы коллекций, основанных на хеш-таблицах. Это обеспечивает эффективное распределение объектов в коллекции и корректное сравнение объектов по содержанию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤3
Anonymous Quiz
97%
import
2%
include
1%
using
0%
require
🤯39👾5😁4👍2👀2
Deadlock (взаимная блокировка) — это ситуация в многопоточном программировании, при которой два или более потока вечно ожидают друг друга, освободят ли они ресурсы, занятые в данный момент. Каждый из потоков держит замок (lock) на некотором ресурсе и ожидает получения замка на другом ресурсе, который в это время занят другим потоком. В результате ни один из потоков не может продолжить выполнение, поскольку каждый из них ждет освобождения ресурса, занятого другим потоком.
Представьте ситуацию, где есть два потока и два ресурса (например, два файла или два объекта в памяти).
В такой ситуации оба потока не могут продолжить выполнение, так как каждый из них ожидает освобождения ресурса, уже захваченного другим потоком. Это и есть deadlock.
Deadlock — это состояние, когда два или более потока вечно ждут друг друга, освободят ли они занятые ресурсы, что приводит к остановке выполнения программы. Избежать этого можно с помощью правильного проектирования и стратегий управления доступом к ресурсам.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍8
Anonymous Quiz
51%
Процесс сохранения состояния объекта в файл
4%
Процесс клонирования объекта
31%
Процесс преобразования объекта в другой тип
14%
Процесс передачи объекта по сети
👾18😁6👍2🎉2❤1
Ключевые слова final, finally, и finalize имеют совершенно разные цели и контексты использования, хотя на первый взгляд могут показаться похожими из-за схожести их названий.
Это модификатор, который может быть использован с переменными, методами и классами.
Это блок кода, который используется вместе с блоками
try и catch для обработки исключений. Блок finally выполняется всегда после выполнения блока try/catch, независимо от того, было ли выброшено исключение или нет. Это идеальное место для кода очистки, например, для закрытия файловых потоков или освобождения других ресурсов.final используется для создания констант, предотвращения наследования классов и переопределения методов.finally гарантирует выполнение кода после блока try/catch, обычно для очистки ресурсов.finalize предназначен для очистки перед уничтожением объекта, но его использование не рекомендуется.Каждое из этих ключевых слов имеет уникальное применение и важно в контексте разработки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😁2❤1
Anonymous Quiz
94%
equals(), hashCode(), toString()
4%
equals(), clone(), copy()
2%
toString(), print(), parse()
1%
hashCode(), parse(), format()
❤5🤯2👀2😁1
Идея многопоточности заключается в параллельном выполнении нескольких задач в рамках одного приложения для более эффективного использования ресурсов компьютера, особенно процессорного времени, и для улучшения отзывчивости программы.
В однопоточном приложении в любой момент времени выполняется только одна задача. Если эта задача включает в себя ожидание (например, ввод пользователя или чтение данных с диска), процессорное время не используется эффективно. Она же позволяет одновременно выполнять другие задачи во время ожидания, тем самым повышая производительность и отзывчивость приложения.
Примером многопоточности может служить создание потоков через наследование от класса
Thread или реализацию интерфейса Runnable:class MyThread extends Thread {
public void run() {
System.out.println("Поток запущен.");
}
}
class MyRunnable implements Runnable {
public void run() {
System.out.println("Поток запущен через Runnable.");
}
}
public class ThreadExample {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start();
Thread t2 = new Thread(new MyRunnable());
t2.start();
}
}В этом примере создаются и запускаются два потока, каждый из которых выполняет свою задачу параллельно основному потоку программы.
Однако она также вводит сложность в разработку программного обеспечения, поскольку разработчикам необходимо учитывать вопросы синхронизации доступа к общим ресурсам, управления состоянием потоков и потенциальных проблем с безопасностью потоков, таких как гонки за данные (race conditions), взаимные блокировки (deadlocks) и проблемы с последовательностью операций.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11