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
Anonymous Quiz
89%
Создание методов с одинаковым именем, но разными параметрами
4%
Создание методов с одинаковым именем и параметрами
7%
Переопределение методов в подклассах
1%
Использование методов из интерфейсов
😁3👍2❤1
JSP Expression Language (EL) поддерживает различные типы операторов, которые позволяют выполнять разнообразные операции на данных. Эти операторы включают в себя арифметические, логические, операторы сравнения, условные операторы и операторы доступа к свойствам и коллекциям. Рассмотрим каждый из этих типов операторов подробнее.
Позволяют выполнять математические операции на числах.
${5 + 3} <!-- Результат: 8 -->
${10 - 4} <!-- Результат: 6 -->
${2 * 3} <!-- Результат: 6 -->
${10 / 2} <!-- Результат: 5 -->
${10 % 3} <!-- Результат: 1 -->
Позволяют выполнять логические операции, такие как И (AND), ИЛИ (OR), НЕ (NOT).
true, если оба операнда истинны. ${true && false} <!-- Результат: false -->
${true and true} <!-- Результат: true -->
true, если хотя бы один из операндов истинен. ${true || false} <!-- Результат: true -->
${false or false} <!-- Результат: false -->
true, если операнд ложен. ${!true} <!-- Результат: false -->
${not false} <!-- Результат: true -->
Позволяют сравнивать два значения.
true, если операнды равны. ${5 == 5} <!-- Результат: true -->
${5 eq 5} <!-- Результат: true -->
true, если операнды не равны. ${5 != 3} <!-- Результат: true -->
${5 ne 3} <!-- Результат: true -->
true, если первый операнд меньше второго. ${3 < 5} <!-- Результат: true -->
${3 lt 5} <!-- Результат: true -->
true, если первый операнд меньше или равен второму. ${3 <= 5} <!-- Результат: true -->
${3 le 5} <!-- Результат: true -->
true, если первый операнд больше второго. ${5 > 3} <!-- Результат: true -->
${5 gt 3} <!-- Результат: true --> Позволяет выполнять условное выражение и возвращает одно из двух значений в зависимости от логического условия.
${(5 > 3) ? 'Greater' : 'Lesser'} <!-- Результат: Greater -->Позволяют получать доступ к свойствам объектов и элементам коллекций и массивов.
${user.name} <!-- Доступ к свойству name объекта user -->
${users[0].name} <!-- Доступ к первому элементу списка users -->
${map['key']} <!-- Доступ к значению по ключу 'key' в карте -->
Арифметические операторы
<p>Sum: ${5 + 3}</p> <!-- Вывод: Sum: 8 -->
<p>Difference: ${10 - 4}</p> <!-- Вывод: Difference: 6 -->
<p>Product: ${2 * 3}</p> <!-- Вывод: Product: 6 -->
<p>Quotient: ${10 / 2}</p> <!-- Вывод: Quotient: 5 -->
<p>Remainder: ${10 % 3}</p> <!-- Вывод: Remainder: 1 -->JSP Expression Language (EL) поддерживает несколько типов операторов, включая арифметические, логические, операторы сравнения, условный оператор и операторы доступа к свойствам и коллекциям. Эти операторы позволяют выполнять разнообразные операции на данных, упрощая код JSP страниц и улучшая читаемость и поддержку.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤔4❤1
Anonymous Quiz
22%
public, private, protected, package
2%
public, private, internal, protected
74%
public, private, protected, default
1%
public, private, protected, internal
😁10👍2❤1
JSP Expression Language (EL) предоставляет набор неявных (внутренних) объектов, которые упрощают доступ к данным и их обработку в JSP страницах. Эти неявные объекты JSP EL различаются от неявных объектов JSP и обеспечивают доступ к контексту выполнения веб-приложения.
pageScope
Предоставляет доступ к атрибутам области видимости страницы (page scope).
<% pageContext.setAttribute("pageAttribute", "Page Scope Value"); %>
<p>Page Attribute: ${pageScope.pageAttribute}</p>requestScope
Предоставляет доступ к атрибутам области видимости запроса (request scope).
<% request.setAttribute("requestAttribute", "Request Scope Value"); %>
<p>Request Attribute: ${requestScope.requestAttribute}</p>sessionScope
Предоставляет доступ к атрибутам области видимости сессии (session scope).
<% session.setAttribute("sessionAttribute", "Session Scope Value"); %>
<p>Session Attribute: ${sessionScope.sessionAttribute}</p>applicationScope
Предоставляет доступ к атрибутам области видимости приложения (application scope).
<% application.setAttribute("applicationAttribute", "Application Scope Value"); %>
<p>Application Attribute: ${applicationScope.applicationAttribute}</p>param
Предоставляет доступ к параметрам запроса (query parameters) в виде строк.
<!-- URL: http://example.com/page.jsp?name=John -->
<p>Request Parameter: ${param.name}</p>
paramValues
Предоставляет доступ к параметрам запроса в виде массивов строк (для параметров с несколькими значениями).
<!-- URL: http://example.com/page.jsp?name=John&name=Doe -->
<p>Request Parameter Values: ${paramValues.name[0]}, ${paramValues.name[1]}</p>
header
Предоставляет доступ к заголовкам HTTP запроса в виде строк.
<p>User-Agent: ${header['User-Agent']}</p>headerValues
Предоставляет доступ к заголовкам HTTP запроса в виде массивов строк (для заголовков с несколькими значениями).
<p>Header Values: ${headerValues['Accept'][0]}, ${headerValues['Accept'][1]}</p>request, response, session, application).${...} и обеспечивают более чистый и понятный способ доступа к данным.request.getParameter("name")).pageScope, requestScope, sessionScope, и applicationScope, что позволяет легко различать источники данных.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>JSP Example</noscript>
</head>
<body>
<% request.setAttribute("attribute", "Request Scope Value"); %>
<p>Request Attribute: <%= request.getAttribute("attribute") %></p>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>JSP EL Example</noscript>
</head>
<body>
<% request.setAttribute("attribute", "Request Scope Value"); %>
<p>Request Attribute: ${requestScope.attribute}</p>
</body>
</html>
Неявные объекты JSP EL (
pageScope, requestScope, sessionScope, applicationScope, param, paramValues, header, headerValues, cookie, initParam, pageContext) предоставляют удобный и чистый способ доступа к данным и контексту выполнения веб-приложения. В отличие от неявных объектов JSP, они обеспечивают более структурированный и читаемый подход к управлению данными и их обработке в JSP страницах.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🤯1
Anonymous Quiz
25%
Способность метода вызываться с разными параметрами
63%
Способность объекта принимать множество форм
8%
Способность класса наследовать несколько классов
3%
Способность переменной менять тип
😁8🤯5🤔3👍2
JSTL (JSP Standard Tag Library) — это библиотека стандартных тегов для JSP (JavaServer Pages), которая предоставляет набор общих функций для JSP страниц. JSTL упрощает разработку веб-приложений, уменьшая количество Java-кода, который нужно писать в JSP, за счёт использования стандартных тегов для выполнения различных задач.
Основные функции:
<%@ taglib uri="htp://jav.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="htp://jav.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<noscript>Пример JSTL</noscript>
</head>
<body>
<h2>Пример использования циклов и условий JSTL</h2>
<c:choose>
<c:when test="${user != null}">
<p>Добро пожаловать, ${user.name}!</p>
</c:when>
<c:otherwise>
<p>Пожалуйста, войдите в систему.</p>
</c:otherwise>
</c:choose>
<h2>Пример форматирования даты JSTL</h2>
<fmt:formatDate value="${currentDate}" pattern="yyyy-MM-dd" />
<h2>Пример итерации по коллекции JSTL</h2>
<ul>
<c:forEach var="item" items="${items}">
<li>${item}</li>
</c:forEach>
</ul>
</body>
</html>
JSTL позволяет писать меньше Java-кода и использовать более понятные и удобные теги для выполнения часто встречающихся задач в JSP.
🔥
🔒
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Anonymous Quiz
85%
clone()
12%
copy()
1%
replicate()
2%
duplicate()
👍7❤1
Библиотека JSP Standard Tag Library (JSTL) состоит из нескольких групп тегов, каждая из которых предназначена для выполнения определенных типов задач.
Основные теги JSTL предоставляют основные функциональные возможности, такие как итерации, условные конструкции, управление переменными и другие базовые операции.
<c:out value="${user.name}" />
<c:if>: Выполняет условную проверку и отображает содержимое, если условие истинно. <c:if test="${user.loggedIn}">
<p>Welcome, ${user.name}!</p>
</c:if>
<c:choose>,<c:choose>
<c:when test="${user.role == 'admin'}">
<p>Admin Section</p>
</c:when>
<c:otherwise>
<p>User Section</p>
</c:otherwise>
</c:choose>
<c:forEach var="item" items="${items}">
<p>${item}</p>
</c:forEach>Теги форматирования JSTL используются для форматирования текста, чисел, дат и выполнения интернационализации.
<fmt:formatNumber>: Форматирует число. <fmt:formatNumber value="${amount}" type="currency" />
<fmt:formatDate>: Форматирует дату. <fmt:formatDate value="${date}" pattern="yyyy-MM-dd" />
<fmt:parseNumber>: Парсит строку в число.<fmt:parseNumber var="number" value="1,234.56" type="number" />
Позволяют выполнять запросы к базе данных и обрабатывать результаты.
<sql:setDataSource>: Устанавливает источник данных.<sql:setDataSource var="dataSource" driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb"
user="root" password="password" />
<sql:query dataSource="${dataSource}" var="result">
SELECT * FROM users
</sql:query>
<sql:update>: Выполняет SQL-операцию обновления (INSERT, UPDATE, DELETE). <sql:update dataSource="${dataSource}">
UPDATE users SET name='John Doe' WHERE id=1
</sql:update>Используются для работы с XML-документами, таких как парсинг, трансформация и выполнение XPath-запросов.
<x:parse>: Парсит XML-документ. <x:parse var="doc" xml="${xmlContent}" />
Также предоставляет набор функций для выполнения различных операций на строках, коллекциях и других данных.
${fn:contains(user.name, 'John')}
fn:containsIgnoreCase: Проверяет, содержит ли строка подстроку без учета регистра. ${fn:containsIgnoreCase(user.name, 'john')} fn:endsWith: Проверяет, заканчивается ли строка заданной подстрокой. ${fn:endsWith(user.name, 'Doe')}Эти группы тегов JSTL помогают создавать более чистый, читабельный и поддерживаемый код в JSP страницах, облегчая выполнение распространённых задач и улучшая структуру веб-приложений.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤯2
Anonymous Quiz
35%
Предварительная компиляция кода до выполнения
48%
Компиляция кода во время выполнения
5%
Компиляция кода во время написания
12%
Компиляция кода при запуске программы
👍3
Расширение функциональности JSP может быть достигнуто различными способами, включая использование сторонних библиотек, создание пользовательских тегов и теговых библиотек, а также интеграцию с другими Java фреймворками.
JavaServer Pages Standard Tag Library (JSTL)
JSTL предоставляет набор стандартных тегов для выполнения распространённых задач, таких как итерация, условные конструкции, работа с коллекциями, форматирование и интернационализация.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<c:if test="${user.loggedIn}">
<p>Welcome, ${user.name}!</p>
</c:if>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd" />
<sql:query dataSource="${dataSource}" var="result">
SELECT * FROM users
</sql:query>
Пользовательские теги позволяют инкапсулировать повторяющийся код и функциональность в простые и переиспользуемые компоненты.
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>custom</short-name>
<uri>http://example.com/custom</uri>
<tag>
<name>hello</name>
<tag-class>com.example.tags.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
package com.example.tags;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
public class HelloTag extends TagSupport {
@Override
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello, World!");
} catch (IOException e) {
throw new JspException("Error: " + e.getMessage());
}
return SKIP_BODY;
}
}
<%@ taglib uri="http://example.com/custom" prefix="custom" %>
<custom:hello />
Использование Spring MVC
Это мощный веб-фреймворк, который упрощает создание веб-приложений с разделением логики и представления. Он позволяет использовать контроллеры для обработки запросов и передачу данных на JSP страницы.
@Controller
public class UserController {
@GetMapping("/user")
public String getUser(Model model) {
User user = new User("John Doe");
model.addAttribute("user", user);
return "user";
}
}
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<html>
<head>
<noscript>User Page</noscript>
</head>
<body>
<h1>Welcome, <spring:eval expression="user.name" /></h1>
</body>
</html>
Эти методы помогут сделать код более чистым, поддерживаемым и функциональным.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👀2❤1
Anonymous Quiz
10%
Интерфейсы могут содержать поля
65%
Абстрактные классы могут реализовывать методы
8%
Интерфейсы могут содержать конструкторы
16%
Абстрактные классы не могут наследоваться
🤔12🤯4👀2👾2❤1
Для переноса строки в HTML с помощью JSP можно использовать несколько методов, включая непосредственно HTML теги, JSP Expression Language (EL) и JSTL (JavaServer Pages Standard Tag Library).
Самый простой способ сделать перенос строки в HTML — использовать тег
<br>.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>Line Break Example</noscript>
</head>
<body>
<p>This is line 1.<br>This is line 2.</p>
</body>
</html>
Если получаете строку из бэкэнда и хотите вставить переносы строк, можно преобразовать символы новой строки (
\n) в HTML тег <br>.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<noscript>EL Line Break Example</noscript>
</head>
<body>
<%
String text = "This is line 1.\nThis is line 2.";
request.setAttribute("text", text);
%>
<p>${fn:replace(text, '\n', '<br>')}</p>
</body>
</html>
c:forEachМожно разделить строку на части и вывести каждую часть в отдельном абзаце или строке.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<noscript>JSTL Line Break Example</noscript>
</head>
<body>
<%
String text = "This is line 1.\nThis is line 2.\nThis is line 3.";
request.setAttribute("text", text);
%>
<c:forEach var="line" items="${fn:split(text, '\n')}">
<p>${line}</p>
</c:forEach>
</body>
</html>
pre тегаДля отображения многострочного текста без необходимости замены символов новой строки можно использовать HTML тег
<pre>.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<noscript>Preformatted Text Example</noscript>
</head>
<body>
<%
String text = "This is line 1.\nThis is line 2.\nThis is line 3.";
request.setAttribute("text", text);
%>
<pre>${text}</pre>
</body>
</html>
Также можно создать пользовательский метод в классе Java, который будет заменять символы новой строки на теги
<br>, и использовать его в JSP странице.package com.example.util;
public class StringUtil {
public static String convertNewlinesToHtml(String text) {
if (text == null) {
return "";
}
return text.replace("\n", "<br>");
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.example.util.StringUtil" %>
<html>
<head>
<noscript>Custom Method Line Break Example</noscript>
</head>
<body>
<%
String text = "This is line 1.\nThis is line 2.";
%>
<p><%= StringUtil.convertNewlinesToHtml(text) %></p>
</body>
</html>
<br> с помощью функции fn:replace. c:forEach: Разделение текста на строки и вывод каждой строки отдельно. <pre>: Для отображения многострочного текста без изменений.<br>.Каждый из этих методов имеет свои преимущества и используется в зависимости от конкретных требований и контекста задачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Anonymous Quiz
11%
Типы переменных определяются во время выполнения
80%
Типы переменных определяются во время компиляции
2%
Типы переменных могут изменяться во время выполнения
6%
Типы переменных могут не указываться
🔥3