Java | Фишки и трюки
Відкрити в Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg
Показати більше6 775
Підписники
-624 години
-277 днів
-5830 днів
Триває завантаження даних...
Схожі канали
Хмара тегів
Вхідні та вихідні згадування
---
---
---
---
---
---
Залучення підписників
вересень '26
вересень '26
+11
в 0 каналах
серпень '26
+51
в 9 каналах
Get PRO
липень '26
+38
в 0 каналах
Get PRO
червень '26
+98
в 0 каналах
Get PRO
травень '26
+128
в 10 каналах
Get PRO
квітень '26
+52
в 1 каналах
Get PRO
березень '26
+51
в 8 каналах
Get PRO
лютий '26
+42
в 3 каналах
Get PRO
січень '26
+38
в 0 каналах
Get PRO
грудень '25
+75
в 25 каналах
Get PRO
листопад '25
+108
в 11 каналах
Get PRO
жовтень '25
+50
в 0 каналах
Get PRO
вересень '25
+28
в 6 каналах
Get PRO
серпень '25
+187
в 24 каналах
Get PRO
липень '25
+156
в 16 каналах
Get PRO
червень '25
+169
в 29 каналах
Get PRO
травень '25
+221
в 32 каналах
Get PRO
квітень '25
+290
в 35 каналах
Get PRO
березень '25
+291
в 32 каналах
Get PRO
лютий '25
+1 295
в 114 каналах
Get PRO
січень '25
+292
в 14 каналах
Get PRO
грудень '24
+196
в 1 каналах
Get PRO
листопад '24
+302
в 21 каналах
Get PRO
жовтень '24
+439
в 9 каналах
Get PRO
вересень '24
+226
в 1 каналах
Get PRO
серпень '24
+281
в 3 каналах
Get PRO
липень '24
+462
в 16 каналах
Get PRO
червень '24
+229
в 1 каналах
Get PRO
травень '24
+395
в 9 каналах
Get PRO
квітень '24
+874
в 9 каналах
Get PRO
березень '24
+408
в 6 каналах
Get PRO
лютий '24
+339
в 7 каналах
Get PRO
січень '24
+330
в 5 каналах
Get PRO
грудень '23
+595
в 10 каналах
Get PRO
листопад '23
+663
в 12 каналах
Get PRO
жовтень '23
+656
в 8 каналах
Get PRO
вересень '23
+538
в 0 каналах
| Дата | Залучення підписників | Згадування | Канали | |
| 15 вересня | 0 | |||
| 14 вересня | 0 | |||
| 13 вересня | 0 | |||
| 12 вересня | +1 | |||
| 11 вересня | +1 | |||
| 10 вересня | +1 | |||
| 09 вересня | 0 | |||
| 08 вересня | 0 | |||
| 07 вересня | +1 | |||
| 06 вересня | +1 | |||
| 05 вересня | +2 | |||
| 04 вересня | 0 | |||
| 03 вересня | +1 | |||
| 02 вересня | +1 | |||
| 01 вересня | +2 |
Дописи каналу
Метод Arrays.fill() для инициализации массива
Класс
java.util.Arrays имеет несколько методов с именем fill(), которые принимают разные типы аргументов и заполняют весь массив одним и тем же значением:
long array[] = new long[5];
Arrays.fill(array, 30);
У метода также есть несколько альтернатив, которые устанавливают диапазон массива в определенное значение:
int array[] = new int[5];
Arrays.fill(array, 0, 3, -50);
Обратите внимание, что метод принимает массив, индекс первого элемента, индекс последнего элемента (не включительно) и значение.| 2 | 🔴 Тестовый собес с Java-разработчиком уже завтра!
[+ разбор 50 сложных вопросов в подарок ]
16 сентября (уже завтра!) в 19:00 по мск приходи онлайн, чтобы посмотреть на настоящее интервью на Middle Java-разработчика!
Собеседование проведёт Виктор Анохин — Senior из Wildberries, ех-Билайн
Как это будет:
📂 Виктор задаст разработчику вопросы и задачи, которые могут спросить на реальном собесе
📂 После каждого ответа респондента ты услышишь подробный комментарий от ментора и поймёшь, чего на самом деле ожидает собеседующий на интервью
📂 В конце сможешь задать любой вопрос Виктору и получить на него развёрнутый ответ
Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы
И ты можешь посмотреть его бесплатно 🔥
Только завтра, в прямом эфире!
🎁 Подарок для всех, кто зарегается на веб — файл с ОТВЕТАМИ НА 50 СЛОЖНЫХ ВОПРОСОВ с Java-собеседований 🔥
Переходи в бот, чтобы попасть на эфир и забрать подарок 👉 @shortcut_sh_bot
Реклама.
О рекламодателе. | 413 |
| 3 | ⌨️ Чем абстрактный класс отличается от интерфейса? В каких случаях следует использовать абстрактный класс, а в каких интерфейс?
В Java абстрактный класс и интерфейс представляют два различных механизма для достижения абстракции и обеспечения множественного наследования. Вот основные различия между ними:
1️⃣ Абстрактный класс (Abstract Class):
👉 Может содержать как абстрактные методы (методы без тела), так и обычные методы с реализацией.
👉 Может иметь переменные экземпляра (поля).
👉 Может содержать конструкторы.
👉 Поддерживает одиночное наследование: подкласс можно наследовать только от одного абстрактного класса.
abstract class Animal {
String name;
abstract void makeSound();
void eat() {
System.out.println(name + " is eating.");
}
}
2️⃣ Интерфейс (Interface):
👉 Содержит только абстрактные методы (в Java 8 и выше может содержать методы с реализацией, помеченные ключевым словом default).
👉 Не может иметь переменных экземпляра, кроме переменных, объявленных как static final.
👉 Не содержит конструкторов.
👉 Поддерживает множественное наследование: класс может реализовывать несколько интерфейсов.
interface Animal {
void makeSound();
void eat();
}
Когда использовать:
👉 Используйте абстрактные классы, когда у вас есть общая реализация для нескольких классов и вы хотите предоставить базовый функционал.
👉 Используйте интерфейсы, когда вам нужна поддержка множественного наследования, или когда классы, возможно, уже наследуют от других классов.
Обычно считается хорошей практикой использовать интерфейсы для определения контракта и абстрактные классы для предоставления базовой реализации. В Java 8 и более новых версиях с появлением интерфейсов с методами по умолчанию (default methods), различия стали менее явными, и выбор может зависеть от конкретной ситуации. | 492 |
| 4 | 🎸 Приглашаем на Java Rock Star Meetup
Самая ламповая встреча Java-коммьюнити состоится уже в ближайшую пятницу. Вместе с крутыми спикерами будем копаться под капотом JVM, холиварить и общаться в неформальной атмосфере.
🗓 18 сентября, 18:00, Москва, Лофт Casa Picassa на Бауманской.
Что в программе?
⚙️ Иван Углянский, эксперт по JVM и компиляторам, расскажет о Project Valhalla: зачем нужны Java value-типы и почему новый подход наконец даёт надежду довести многострадальный проект до финиша.
🤖 Максим Козлов, сооснователь и CTO GitFlic, разберет, как в агентном SDLC сохранить связь между требованиями, кодом и реальным результатом.
Участие бесплатное, нужна только регистрация. Присоединяйся к рок-звёздам Java!
Реклама. АО "АКСИОМ". ИНН 7838124039. | 429 |
| 5 | Методы и конструкторы в enum
Перечисления (enum) — это классы Java, определяющие наборы констант. Самый простой enum выглядит так:
public enum Vehicle { CAR, BUS, BICYCLE, SCOOTER }
Но на самом деле, enum в Java обладают гораздо более широким функционалом. Они поддерживают поля, методы, интерфейсы и т.д. Они также Comparable и Serializable и могут имплементировать все методы объекта.
Для наглядности давайте создадим enum Animal и присвоим каждому элементу цвет:
public enum Animal {
DOG("black"),
CAT("white"),
RAT("gray");
private final String color;
Animal(String color){
this.color = color;
}
public String getColor(){
return color;
}
}
Теперь мы можем выполнить перебор элементов массива с помощью статического метода values():
public class Main {
public static void main(String[] args) {
for (Animal a : Animal.values()) {
System.out.println(a.name() + " - " + a.getColor());
}
}
}
Мы получим следующий результат:
DOG - black
CAT - white
RAT - gray
Каждой константе можно присвоить разное поведение при выполнении определенного метода. Например, можно сделать основной метод абстрактным и переопределить его в каждой константе:
public enum Operation {
PLUS { double evaluate(double x, double y) { return x + y; } },
MINUS { double evaluate(double x, double y) { return x - y; } },
abstract double evaluate(double x, double y);
}
Всё это обеспечивает удобную работу с перечислениями в Java. | 536 |
| 6 | JSON – невероятно удобный и полезный формат для хранения и обмена данными. Java полностью поддерживает его.
Сериализовать данные можно так:
JSONObject author = new JSONObject();
author.put("name", "J. K. Rowling");
author.put("numberOfBooks", 22);
JSONArray books = new JSONArray();
books.put("Harry Potter and the Philosopher's Stone");
books.put("Harry Potter and the Chamber of Secrets");
books.put("Harry Potter and the Prisoner of Azkaban");
author.put("books", books);
System.out.print(author);
Получится вот такая JSON-строка:
{"books":["Harry Potter and the Philosopher's Stone","Harry Potter and the Chamber of Secrets","Harry Potter and the Prisoner of Azkaban"],"name":"J. K. Rowling","numberOfBooks":22}
Десериализация на Java выглядит примерно так:
JSONObject author = new JSONObject(serializedString);
System.out.println("name: " + author.get("name"));
System.out.println("numberOfBooks: " + author.get("numberOfBooks"));
JSONArray books = (JSONArray) author.get("books");
Iterator<Object> i = books.iterator();
System.out.println("books:");
while (i.hasNext()) {
System.out.println(i.next());
}
Нужно добавить зависимость:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency> | 875 |
| 7 | ⌨️ Фишка: Создание итератора для пользовательского класса.
Код:
import java.util.Iterator;
public class CustomClass implements Iterable<String> {
private String[] elements;
public CustomClass(String[] elements) {
this.elements = elements;
}
@Override
public Iterator<String> iterator() {
return new CustomIterator();
}
private class CustomIterator implements Iterator<String> {
private int index = 0;
@Override
public boolean hasNext() {
return index < elements.length;
}
@Override
public String next() {
if (this.hasNext()) {
return elements[index++];
} else {
throw new NoSuchElementException();
}
}
}
public static void main(String[] args) {
String[] arr = {"one", "two", "three"};
CustomClass customClass = new CustomClass(arr);
for (String element : customClass) {
System.out.println(element);
}
}
}
💁♂️ Этот код позволяет создать итератор для пользовательского класса CustomClass. Итератор позволяет перебирать элементы массива elements и использовать их в цикле for-each. | 1 061 |
| 8 | 🔴 Завтра тестовое собеседование с Java-разработчиком
2 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе. | 441 |
| 9 | ⌨️ Параллельное выполнение задач с использованием ExecutorService
ExecutorService - это интерфейс, который предоставляет удобный способ для управления параллельным выполнением задач. Он предоставляет пул потоков для выполнения задач и управляет их жизненным циклом:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
// Создание пула потоков
ExecutorService executor = Executors.newFixedThreadPool(5);
// Подача задач на выполнение
for (int i = 0; i < 10; i++) {
executor.execute(new Task(i));
}
// Остановка пула потоков после выполнения задач
executor.shutdown();
}
static class Task implements Runnable {
private int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Выполнение задачи " + taskId + " в потоке " +
Thread.currentThread().getName());
}
}
}
🧑💻Этот код создает пул из 5 потоков и подает на выполнение 10 задач. Каждая задача выводит свой идентификатор и имя потока, в котором она выполняется. После выполнения всех задач пул потоков останавливается. | 985 |
| 10 | АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ
Проект «Terminal» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны курсы, книги, полезные инструменты и практические тренажёры для всех разработчиков:
• Практические курсы и задания
• Книги и статьи известных авторов
• Полезные инструменты и ресурсы
• IT-новости и инсайды
Обучение по всем направлениям: SQL, Python, ML, Frontend, PHP, C++, Go, Git, Linux, QA, Java, Vibe-coding, InfoSec и др.
⌨️ подписаться | 548 |
| 11 | ⌨️ Метод для глубокого копирования объектов. Это часто используется, когда нужно создать копию объекта, сохраняя его данные, но не связи с другими объектами.
📌 Вот пример метода для глубокого копирования:
import java.io.*;
public class DeepCopyExample {
public static void main(String[] args) {
Person person = new Person("John", 30);
Person deepCopy = deepCopy(person);
System.out.println("Original: " + person.getName() + ", " + person.getAge());
System.out.println("Deep copy: " + deepCopy.getName() + ", " + deepCopy.getAge());
}
public static <T extends Serializable> T deepCopy(T object) {
try {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
objectOutputStream.writeObject(object);
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteInputStream);
T copy = (T) objectInputStream.readObject();
return copy;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
}
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
✅ В этом примере мы создаем класс Person, который реализует интерфейс Serializable, чтобы объекты этого класса можно было сериализовать и десериализовать. Затем мы создаем метод deepCopy, который принимает объект и возвращает его глубокую копию.
Мы используем ByteArrayOutputStream и ObjectOutputStream, чтобы записать объект в байтовый массив, а затем ByteArrayInputStream и ObjectInputStream, чтобы прочитать копию объекта из массива.
В методе main мы создаем объект Person, затем создаем его глубокую копию с помощью метода deepCopy и выводим на экран значения оригинального и скопированного объекта. | 921 |
| 12 | На Stepik запустили годный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем»
В программе только важные аспекты:
— troubleshooting Docker и образов
— диагностика сетевых проблем
— настройка readiness/liveness probes
— отладка pod’ов, деплоев и ingress
— анализ логов контейнеров и кластера
— разбор ошибок CrashLoopBackOff, OOMKilled, ImagePullBackOff и других
Собеседования на DevOps/SRE сейчас всё чаще строятся вокруг реальных инцидентов. Данный курс фокусируется именно на таких сценариях и помогает в подготовке к практическим вопросам
48 часов доступен со скидкой 25%
↗️ Пройти курс на Stepik | 558 |
| 13 | ⌨️ Использования анонимных классов:
Анонимный класс - это класс без имени, который объявляется и создается внутри другого класса или метода. Он удобен, когда требуется определить класс, который будет использоваться только один раз, и нет необходимости создавать отдельный класс.
public class Main {
interface Greeting {
void sayHello();
}
public static void main(String[] args) {
Greeting greeting = new Greeting() { // объявление и создание анонимного класса
@Override
public void sayHello() {
System.out.println("Привет, мир!");
}
};
greeting.sayHello(); // вызов метода sayHello у анонимного класса
}
}
✅В данном примере мы определили интерфейс Greeting, содержащий метод sayHello(). Затем, в методе main(), мы создали анонимный класс, реализующий интерфейс Greeting и переопределивший метод sayHello(). Затем мы вызываем метод sayHello() у объекта анонимного класса.
📝Таким образом, анонимные классы предоставляют удобный способ создания и использования классов "на лету", что может быть полезно, когда требуется определить классы, которые будут использоваться только в одном месте программы. | 776 |
| 14 | Вайбкодим «Полный путь разработки AI-агентов: от MCP до Agentic RAG»
Образовательная программа на Stepik по разработке современных AI-агентов.
Начинаем с Model Context Protocol: создаём MCP-серверы, подключаем инструменты и внешние API, а затем переходим к разработке Agentic RAG-систем с памятью, рассуждением, поиском знаний и оценкой качества.
• Model Context Protocol и MCP-серверы
• LangChain, LangGraph, LlamaIndex
• API, инструменты, ресурсы и промпты
• Классический RAG → Agentic RAG
• ReAct, память и планирование
• Графы знаний и свои инструменты
• Трассировка и подготовка к production
Успей, скидка 20% действует 48 часов
↗️ Начать обучение на Stepik | 569 |
| 15 | ⌨️ Использование класса java.time.Duration для рассчета разницы во времени между двумя моментами.
Код для расчета разницы во времени:
import java.time.Duration;
import java.time.LocalDateTime;
public class TimeDifferenceCalculator {
public static void main(String[] args) {
LocalDateTime startTime = LocalDateTime.of(2022, 1, 1, 10, 0, 0);
LocalDateTime endTime = LocalDateTime.of(2022, 1, 1, 12, 30, 0);
Duration duration = Duration.between(startTime, endTime);
long hours = duration.toHours();
long minutes = duration.toMinutes() % 60;
long seconds = duration.getSeconds() % 60;
System.out.println("Time difference: " + hours + " hours, " + minutes + " minutes, " + seconds + " seconds.");
}
}
В этом примере мы создаем два объекта LocalDateTime - startTime и endTime, представляющие начальное и конечное время соответственно. Затем мы используем метод Duration.between() для расчета разницы во времени между startTime и endTime.
Далее, мы используем методы toHours(), toMinutes() и getSeconds() для получения часов, минут и секунд в полученной разнице времени. Наконец, мы выводим результаты на экран.
Эта фишка полезна для рассчета временных интервалов, например, для измерения времени выполнения определенной операции или анализа времени работы программы. | 789 |
| 16 | 📣 Разместите рекламу в этом канале — её увидят
Аудитория Telegram остаётся активной, что бы ни говорили. Индекс читаемости это подтверждает: охваты каналов по тематикам держатся, люди продолжают читать.
Реклама в Telegram — это законно: ФАС в 2026 году официально подтвердил, что она разрешена.
👉 Заказать размещение в этом канале можно через Telega.in — с маркировкой и закрывающими документами, за пару минут.
Форматы и цены — по ссылке. | 455 |
| 17 | ⌨️ Использование аннотации @FunctionalInterface для определения функциональных интерфейсов.
Функциональные интерфейсы - это интерфейсы, которые содержат только один абстрактный метод и могут использоваться как типы данных для лямбда-выражений или методов высшего порядка.
При использовании аннотации @FunctionalInterface вы указываете компилятору, что этот интерфейс должен содержать только один абстрактный метод, чтобы избежать возможных ошибок при использовании лямбда-выражений или ссылок на методы.
Ниже приведен пример кода, демонстрирующий использование аннотации @FunctionalInterface:
@FunctionalInterface
interface Calculator {
int calculate(int a, int b);
}
public class FunctionalInterfaceExample {
public static void main(String[] args) {
Calculator addition = (a, b) -> a + b;
System.out.println("Результат сложения: " + addition.calculate(5, 3));
Calculator subtraction = (a, b) -> a - b;
System.out.println("Результат вычитания: " + subtraction.calculate(5, 3));
}
}
В этом примере мы создаем функциональный интерфейс Calculator, содержащий метод calculate. Затем мы создаем экземпляры интерфейса, используя лямбда-выражения, и вызываем метод calculate для выполнения операций сложения и вычитания.
Применение аннотации @FunctionalInterface помогает нам убедиться, что в интерфейсе действительно определен только один абстрактный метод, и предотвращает случайные ошибки при использовании функциональных интерфейсов в нашем коде. | 1 158 |
| 18 | Самое интересное в российском PostgreSQL этой осенью!
Регистрируйтесь на бесплатную конференцию по PostgreSQL и технологиям СУБД — Tantor JAM 2026. 10 сентября, Москва. 📅
Что будет на конференции:
✅ AI-first мониторинг СУБД: что уже сегодня можно передать ИИ-агентам и как меняется профессия DBA;
✅ аналитика и HTAP без внешней обвязки, внутри Postgres;
✅ как за два года изменился PostgreSQL для 1С;
✅ защита данных в Tantor Postgres.
Как всегда — технические доклады, живое общение с разработчиками и архитекторами, обмен опытом, а еще — вечерняя программа в честь пятилетия «Тантор Лабс».
Участие бесплатное.
10.09.2026, Москва
Зарегистрироваться
#реклама 16+
tantorlabs.ru
О рекламодателе | 509 |
| 19 | ⌨️ Использование методов default и static в интерфейсах. Эти методы позволяют добавлять конкретные реализации в интерфейсы, что делает их более гибкими и позволяет избежать некоторых проблем множественного наследования.
Пример с default методом в интерфейсе:
interface Greeter {
void greet();
// Default метод в интерфейсе
default void greetWithExclamation() {
System.out.println("Привет, мир!");
}
}
class EnglishGreeter implements Greeter {
public void greet() {
System.out.println("Hello, World!");
}
}
class RussianGreeter implements Greeter {
public void greet() {
System.out.println("Привет, мир!");
}
// Переопределение default метода
@Override
public void greetWithExclamation() {
System.out.println("Привет, мир!!!");
}
}
public class InterfaceDefaultMethodExample {
public static void main(String[] args) {
Greeter englishGreeter = new EnglishGreeter();
englishGreeter.greet(); // Вызовет: Hello, World!
englishGreeter.greetWithExclamation(); // Вызовет: Привет, мир!
Greeter russianGreeter = new RussianGreeter();
russianGreeter.greet(); // Вызовет: Привет, мир!
russianGreeter.greetWithExclamation(); // Вызовет: Привет, мир!!!
}
}
Пример со static методом в интерфейсе:
interface Calculator {
static int add(int a, int b) {
return a + b;
}
static int subtract(int a, int b) {
return a - b;
}
}
public class InterfaceStaticMethodExample {
public static void main(String[] args) {
// Нет необходимости создавать экземпляр интерфейса
int sum = Calculator.add(5, 3); // 8
int difference = Calculator.subtract(5, 3); // 2
System.out.println("Сумма: " + sum + ", Разница: " + difference);
}
}
В этих примерах методы default и static в интерфейсе предоставляют замечательные возможности для разработки. Методы default позволяют добавить новые функции в интерфейсы без нарушения контракта с существующими реализациями. static методы в интерфейсах позволяют определять вспомогательные методы, которые могут быть вызваны без объекта интерфейса, предоставляя большую гибкость и удобство в использовании. | 970 |
| 20 | Решайте задачи и готовьтесь к техсекции на стажировку
А ты сможешь решить алгоритмическую задачу за час и без подсказок?
Яндекс проводит бесплатные тренировки по алгоритмам для тех, кто хочет систематизировать знания, прокачать решение задач и подготовиться к техническому собеседованию.
-Короткие видеоуроки
-Практические задачи
-Регулярные соревнования
-Решение задач на время
-Рейтинг и награды
-Возможность получить сертификат
Мы тренируем не только знание алгоритмов, но и умение применять их тогда, когда рядом нет подсказок.
Проверь свои алгоритмические навыки и прокачай слабые места.
Регистрируйся на бесплатные тренировки!
Записаться онлайн
#реклама 16+
yandex.ru
О рекламодателе | 532 |
