Что выведет код?
#Tasks
import java.util.EnumMap;
import java.util.Map;
enum Color { RED, GREEN, BLUE }
public class Task171125 {
public static void main(String[] args) {
Map<Color, String> map = new EnumMap<>(Color.class);
map.put(Color.RED, "red");
map.put(Color.GREEN, null);
map.put(null, "null value");
System.out.println(map.get(Color.RED));
System.out.println(map.get(Color.GREEN));
System.out.println(map.get(null));
System.out.println(map.size());
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
57%
red null null value 3
0%
red null null 3
0%
red null null value 2
43%
NullPointerException
Вопрос с собеседований
Что такое autoboxing и unboxing в Java?🤓
Ответ:
Autoboxing — автоматическое преобразование примитивного типа в объект-обёртку, а unboxing — обратное действие.
Эти механизмы упрощают работу с коллекциями и API, работающими с объектами, но могут создавать накладные расходы и незаметные боковые эффекты при частых преобразованиях.
#собеседование
Что такое autoboxing и unboxing в Java?
Ответ:
Эти механизмы упрощают работу с коллекциями и API, работающими с объектами, но могут создавать накладные расходы и незаметные боковые эффекты при частых преобразованиях.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
История IT-технологий сегодня — 18 ноября
ℹ️ Кто родился в этот день
Пол В. Мокапетрис (родился 18 ноября 1948 года в Бостоне , штат Массачусетс, США) — американский инженер и учёный, создатель системы доменных имён DNS, чья архитектура до сих пор лежит в основе адресации в Интернете.
🌐 Знаковые события
2013 — запущена американская межпланетная станция Mars Atmosphere and Volatile Evolution.
#Biography #Birth_Date #Events #18Ноября
Пол В. Мокапетрис (родился 18 ноября 1948 года в Бостоне , штат Массачусетс, США) — американский инженер и учёный, создатель системы доменных имён DNS, чья архитектура до сих пор лежит в основе адресации в Интернете.
2013 — запущена американская межпланетная станция Mars Atmosphere and Volatile Evolution.
#Biography #Birth_Date #Events #18Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Раздел 6. Коллекции в Java
Глава 5. Map — отображения (словари)
Практика: В «Библиотеке» создать Map<String, Book> для быстрого поиска книги по названию.
В предыдущих практических статьях мы работали с массивом для хранения книг, Set для уникальных авторов и Queue для очереди читателей. Теперь расширим проект: добавим Map<String, Book> для быстрого поиска книги по названию (title как ключ, объект Book как значение). Это позволит демонстрировать ассоциативный доступ и уникальность ключей в Map. Когда добавляем книгу, она автоматически добавляется в Map; поиск будет происходить по ключу с использованием методов Map.
Перед началом убедитесь, что ваш проект готов, и вспомните ключевые концепции Map из предыдущих уроков: хранение пар ключ-значение, уникальность ключей, быстрый доступ по ключу.
Откройте проект «Библиотека»:
Запустите IntelliJ IDEA и откройте существующий проект LibraryProject. Убедитесь, что классы Book и Library существуют: Book с полями title, author, year (и геттерами, методом printDetails), Library с массивом книг, счетчиком bookCount, методом addBook, Set для авторов и другими методами из прошлых статей.
Импортируйте необходимые пакеты:
В файлах, где будете использовать Map, убедитесь, что импортированы java.util.Map и java.util.HashMap (или другая реализация). IDE подскажет, когда вы начнете писать код — используйте Ctrl+Enter для автодобавления импорта.
Выберите реализацию Map: Для этого используйте HashMap<String, Book> — это базовая реализация для быстрого поиска без порядка. Если хотите поэкспериментировать, попробуйте LinkedHashMap для сохранения порядка вставки книг.
Обновление класса Book (если нужно)
Класс Book уже имеет поле title типа String, которое будет ключом в Map. Если у вас нет геттера для title, добавьте его — он может пригодиться для проверок.
Добавьте геттер для title:
Откройте файл Book.java.
Добавьте публичный метод getTitle(), который возвращает значение поля title.
Это обеспечит инкапсуляцию и позволит получать ключ для Map.
Интеграция Map в класс Library
Map будет храниться в классе Library, чтобы ассоциировать названия книг с объектами Book для быстрого поиска.
Добавьте поле для Map<String, Book>:
Откройте файл Library.java.
Объявите приватное поле bookMap типа Map<String, Book>, инициализированное как new HashMap<> (или LinkedHashMap<>).
Это отображение будет использовать title как ключ (String) и объект Book как значение.
Обновите метод addBook(Book book):
В методе addBook, после добавления книги в массив (books[bookCount] = book; bookCount++;), добавьте пару в Map.
Получите title из книги (через getTitle()).
Используйте put(title, book) для добавления в bookMap.
Проверьте, существует ли уже ключ с помощью containsKey(title): Если да, выведите сообщение "Книга с таким названием уже существует, обновляем" (put перезапишет значение).
Если массив переполнен, не добавляйте в Map — обработайте ошибку (например, выведите сообщение).
Создайте публичный метод findBookByTitle(String title), который:
Использует containsKey(title) для проверки наличия книги в bookMap.
Если ключ существует — возвращает объект Book с помощью get(title) и, optionally, вызывает printDetails() на нем или выводит сообщение "Книга найдена".
Если не существует — выводит сообщение "Книга не найдена" и возвращает null (или бросает исключение, если хотите).
Это продемонстрирует быстрый поиск по ключу.
Обработайте удаление книги (опционально):
Если в проекте есть метод для удаления книги (например, removeBookByTitle(String title)), добавьте remove(title) из bookMap после удаления из массива.
Это обеспечит consistency между массивом и Map.
Обновление класса Main для тестирования
Теперь протестируем Map в Main, добавив книги и выполнив поиск.
Создайте объекты и добавьте книги:
В методе main создайте объект Library.
Создайте несколько объектов Book с разными title (некоторые с одинаковыми, чтобы проверить уникальность ключей — Map перезапишет).
Вызовите addBook для каждой книги — Map заполнится автоматически.
Глава 5. Map — отображения (словари)
Практика: В «Библиотеке» создать Map<String, Book> для быстрого поиска книги по названию.
В предыдущих практических статьях мы работали с массивом для хранения книг, Set для уникальных авторов и Queue для очереди читателей. Теперь расширим проект: добавим Map<String, Book> для быстрого поиска книги по названию (title как ключ, объект Book как значение). Это позволит демонстрировать ассоциативный доступ и уникальность ключей в Map. Когда добавляем книгу, она автоматически добавляется в Map; поиск будет происходить по ключу с использованием методов Map.
Перед началом убедитесь, что ваш проект готов, и вспомните ключевые концепции Map из предыдущих уроков: хранение пар ключ-значение, уникальность ключей, быстрый доступ по ключу.
Откройте проект «Библиотека»:
Запустите IntelliJ IDEA и откройте существующий проект LibraryProject. Убедитесь, что классы Book и Library существуют: Book с полями title, author, year (и геттерами, методом printDetails), Library с массивом книг, счетчиком bookCount, методом addBook, Set для авторов и другими методами из прошлых статей.
Импортируйте необходимые пакеты:
В файлах, где будете использовать Map, убедитесь, что импортированы java.util.Map и java.util.HashMap (или другая реализация). IDE подскажет, когда вы начнете писать код — используйте Ctrl+Enter для автодобавления импорта.
Выберите реализацию Map: Для этого используйте HashMap<String, Book> — это базовая реализация для быстрого поиска без порядка. Если хотите поэкспериментировать, попробуйте LinkedHashMap для сохранения порядка вставки книг.
Обновление класса Book (если нужно)
Класс Book уже имеет поле title типа String, которое будет ключом в Map. Если у вас нет геттера для title, добавьте его — он может пригодиться для проверок.
Добавьте геттер для title:
Откройте файл Book.java.
Добавьте публичный метод getTitle(), который возвращает значение поля title.
Это обеспечит инкапсуляцию и позволит получать ключ для Map.
Интеграция Map в класс Library
Map будет храниться в классе Library, чтобы ассоциировать названия книг с объектами Book для быстрого поиска.
Добавьте поле для Map<String, Book>:
Откройте файл Library.java.
Объявите приватное поле bookMap типа Map<String, Book>, инициализированное как new HashMap<> (или LinkedHashMap<>).
Это отображение будет использовать title как ключ (String) и объект Book как значение.
Обновите метод addBook(Book book):
В методе addBook, после добавления книги в массив (books[bookCount] = book; bookCount++;), добавьте пару в Map.
Получите title из книги (через getTitle()).
Используйте put(title, book) для добавления в bookMap.
Проверьте, существует ли уже ключ с помощью containsKey(title): Если да, выведите сообщение "Книга с таким названием уже существует, обновляем" (put перезапишет значение).
Если массив переполнен, не добавляйте в Map — обработайте ошибку (например, выведите сообщение).
Создайте публичный метод findBookByTitle(String title), который:
Использует containsKey(title) для проверки наличия книги в bookMap.
Если ключ существует — возвращает объект Book с помощью get(title) и, optionally, вызывает printDetails() на нем или выводит сообщение "Книга найдена".
Если не существует — выводит сообщение "Книга не найдена" и возвращает null (или бросает исключение, если хотите).
Это продемонстрирует быстрый поиск по ключу.
Обработайте удаление книги (опционально):
Если в проекте есть метод для удаления книги (например, removeBookByTitle(String title)), добавьте remove(title) из bookMap после удаления из массива.
Это обеспечит consistency между массивом и Map.
Обновление класса Main для тестирования
Теперь протестируем Map в Main, добавив книги и выполнив поиск.
Создайте объекты и добавьте книги:
В методе main создайте объект Library.
Создайте несколько объектов Book с разными title (некоторые с одинаковыми, чтобы проверить уникальность ключей — Map перезапишет).
Вызовите addBook для каждой книги — Map заполнится автоматически.
Протестируйте поиск:
Вызовите findBookByTitle с существующим title — должна вывести детали книги.
Вызовите с несуществующим title — сообщение о ненахождении.
Вызовите с title, который был перезаписан — должна вернуться последняя версия книги.
Протестируйте обновление:
Добавьте книгу с существующим title — Map обновит значение, выведите сообщение в addBook.
Тестирование и отладка
После реализации протестируйте, чтобы убедиться в правильной работе Map.
Запустите проект:
Правой кнопкой на Main.java → Run 'Main.main()'.
В консоли увидите сообщения о добавлении и результаты поиска (детали книг или "не найдена").
Проверьте уникальность ключей:
Добавьте две книги с одним title — в Map должна остаться последняя, и поиск вернет её.
Отладка:
Установите breakpoint в методе addBook перед put и после — шагайте (F8) и смотрите размер Map (bookMap.size()) и значение по ключу (bookMap.get(title)).
Если ошибки: NullPointerException (если Map не инициализировано или title null) — добавьте проверки if (title != null && !title.isEmpty()).
ClassCastException — если типы не совпадают (но с generics маловероятно).
Эксперименты:
Измените реализацию Map на LinkedHashMap — проверьте, сохраняется ли порядок ключей при итерации (если добавите цикл по keySet() в print метод).
Попробуйте TreeMap — добавьте Comparator, если нужно сортировать по title (TreeMap требует Comparable для ключей).
Полезные советы для новичков
Инициализация Map: Всегда инициализируйте в конструкторе Library (bookMap = new HashMap<>();), чтобы избежать NullPointerException.
Проверка перед put: Используйте containsKey(title) для логики (если ключ существует, можно предупредить или обновить).
Null-ключи: Избегайте null в title — добавьте проверку в addBook (if (title == null) return;).
Расширение проекта: Подумайте о методе listAllBooks(), который итерирует по values() Map и вызывает printDetails на каждой книге.
Массив vs Map: Заметьте, как Map упрощает поиск по сравнению с перебором массива — это преимущество ассоциативного доступа.
Практическое задание
Задача 1: Добавьте в Library метод updateBook(String title, Book newBook), который использует containsKey для проверки и put для обновления, если книга существует.
Задача 2: В addBook добавьте проверку: Если title уже в Map, не добавляйте в массив, а обновите значение в Map и выведите "Книга обновлена".
Задача 3: В Main добавьте 4-5 книг, включая дубликат по title, протестируйте поиск и обновление — убедитесь, что Map хранит уникальные ключи.
#Java #для_новичков #beginner #Map #Practice
Вызовите findBookByTitle с существующим title — должна вывести детали книги.
Вызовите с несуществующим title — сообщение о ненахождении.
Вызовите с title, который был перезаписан — должна вернуться последняя версия книги.
Протестируйте обновление:
Добавьте книгу с существующим title — Map обновит значение, выведите сообщение в addBook.
Тестирование и отладка
После реализации протестируйте, чтобы убедиться в правильной работе Map.
Запустите проект:
Правой кнопкой на Main.java → Run 'Main.main()'.
В консоли увидите сообщения о добавлении и результаты поиска (детали книг или "не найдена").
Проверьте уникальность ключей:
Добавьте две книги с одним title — в Map должна остаться последняя, и поиск вернет её.
Отладка:
Установите breakpoint в методе addBook перед put и после — шагайте (F8) и смотрите размер Map (bookMap.size()) и значение по ключу (bookMap.get(title)).
Если ошибки: NullPointerException (если Map не инициализировано или title null) — добавьте проверки if (title != null && !title.isEmpty()).
ClassCastException — если типы не совпадают (но с generics маловероятно).
Эксперименты:
Измените реализацию Map на LinkedHashMap — проверьте, сохраняется ли порядок ключей при итерации (если добавите цикл по keySet() в print метод).
Попробуйте TreeMap — добавьте Comparator, если нужно сортировать по title (TreeMap требует Comparable для ключей).
Полезные советы для новичков
Инициализация Map: Всегда инициализируйте в конструкторе Library (bookMap = new HashMap<>();), чтобы избежать NullPointerException.
Проверка перед put: Используйте containsKey(title) для логики (если ключ существует, можно предупредить или обновить).
Null-ключи: Избегайте null в title — добавьте проверку в addBook (if (title == null) return;).
Расширение проекта: Подумайте о методе listAllBooks(), который итерирует по values() Map и вызывает printDetails на каждой книге.
Массив vs Map: Заметьте, как Map упрощает поиск по сравнению с перебором массива — это преимущество ассоциативного доступа.
Практическое задание
Задача 1: Добавьте в Library метод updateBook(String title, Book newBook), который использует containsKey для проверки и put для обновления, если книга существует.
Задача 2: В addBook добавьте проверку: Если title уже в Map, не добавляйте в массив, а обновите значение в Map и выведите "Книга обновлена".
Задача 3: В Main добавьте 4-5 книг, включая дубликат по title, протестируйте поиск и обновление — убедитесь, что Map хранит уникальные ключи.
#Java #для_новичков #beginner #Map #Practice
Что выведет код?
#Tasks
import java.util.LinkedHashMap;
import java.util.Map;
public class Task181125 {
public static void main(String[] args) {
Map<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true);
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.get("a");
map.get("b");
map.put("d", 4);
map.get("c");
System.out.println(map.keySet());
}
}
#Tasks
👍2
👍1
Вопрос с собеседований
Зачем нужен паттерн Decorator?🤓
Ответ:
Decorator позволяет расширять функциональность объекта без изменения его исходного класса, оборачивая его в новые слои поведения.
Это даёт гибкость, избегает наследования, упрощает комбинацию функций и помогает соблюдать принципы SOLID, особенно Open/Closed.
#собеседование
Зачем нужен паттерн Decorator?
Ответ:
Это даёт гибкость, избегает наследования, упрощает комбинацию функций и помогает соблюдать принципы SOLID, особенно Open/Closed.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
История IT-технологий сегодня — 19 ноября
ℹ️ Кто родился в этот день
Не нашел((
🌐 Знаковые события
1969 — американский космический корабль «Аполлон-12», пилотируемый астронавтами Чарльзом Конрадом, Аланом Бином и Ричардом Гордоном, осуществил посадку на Луну.
#Biography #Birth_Date #Events #19Ноября
Не нашел((
1969 — американский космический корабль «Аполлон-12», пилотируемый астронавтами Чарльзом Конрадом, Аланом Бином и Ричардом Гордоном, осуществил посадку на Луну.
#Biography #Birth_Date #Events #19Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Если Вы работаете в IT, как давно вы устроились в текущую компанию?
Anonymous Poll
10%
Более 3х лет назад
40%
От 1 до 3 года
40%
Менее года назад
10%
Менее полугода
🗿2😱1
Запросы и мутации в GraphQL
GraphQL опирается на две основные операции:
Query — безопасные операции чтения данных.
Mutation — операции изменения состояния (создание, обновление, удаление).
Обе операции используют один и тот же язык запросов, отличаются только семантикой:
Query не влияет на состояние системы, Mutation — влияет.
1. Как выглядит запрос (Query)
GraphQL-запрос — декларативное описание структуры данных, которую клиент хочет получить.
Простой пример:
Здесь:
query — тип операции (можно опустить: GraphQL сам определит, что это запрос).
user(id: 42) — вызов поля корневого типа Query.
{ name, avatar } — конкретные поля, которые клиент хочет получить.
GraphQL не вернёт дополнительные поля и не допустит отсутствующих — запрос полностью определяет форму ответа.
Ответ будет ровно такой:
2. Как работает передача аргументов
Аргументы передаются в круглых скобках и могут быть любого типа, определённого в схеме:
скаляры, enum, input-объекты.
Пример схемы:
Пример запроса:
Ответ будет:
2.1. Переменные запроса (не хардкодим аргументы)
GraphQL поддерживает variables, что особенно важно для фронтенда.
Запрос:
Передаваемые переменные:
Сервер объединяет запрос с переменными и выполняет его.
Преимущества переменных:
запрос можно кэшировать,
тело операции не меняется,
безопаснее, чем вставлять значения в строку.
3. Что делает Mutation
Mutation изменяет данные.
Пример схемы:
Пример запроса:
Mutation возвращает объект результата, содержащий новое состояние или подтверждение.
Ответ:
Важный принцип:
Mutation считается одиночной транзакцией.
Даже если внутри происходит много действий, GraphQL гарантирует их упорядоченное выполнение.
4. Возврат данных в нужной форме
GraphQL всегда возвращает данные:
в структуре, которую запросил клиент
в иерархии, описанной в запросе
строго тех типов, которые указаны в схеме
Пример: вложенная выборка.
Ответ:
#Java #middle #GraphQL #Query #Mutation
GraphQL опирается на две основные операции:
Query — безопасные операции чтения данных.
Mutation — операции изменения состояния (создание, обновление, удаление).
Обе операции используют один и тот же язык запросов, отличаются только семантикой:
Query не влияет на состояние системы, Mutation — влияет.
1. Как выглядит запрос (Query)
GraphQL-запрос — декларативное описание структуры данных, которую клиент хочет получить.
Простой пример:
query {
user(id: 42) {
name
avatar
}
}Здесь:
query — тип операции (можно опустить: GraphQL сам определит, что это запрос).
user(id: 42) — вызов поля корневого типа Query.
{ name, avatar } — конкретные поля, которые клиент хочет получить.
GraphQL не вернёт дополнительные поля и не допустит отсутствующих — запрос полностью определяет форму ответа.
Ответ будет ровно такой:
{
"data": {
"user": {
"name": "Den",
"avatar": "https://example.com/den.png"
}
}
}
Никаких “лишних” полей.2. Как работает передача аргументов
Аргументы передаются в круглых скобках и могут быть любого типа, определённого в схеме:
скаляры, enum, input-объекты.
Пример схемы:
type Query {
posts(limit: Int, authorId: ID): [Post!]!
}Пример запроса:
query {
posts(limit: 5, authorId: 42) {
id
title
}
}Ответ будет:
{
"data": {
"posts": [
{ "id": "101", "title": "GraphQL SDL" },
{ "id": "102", "title": "gRPC vs GraphQL" }
]
}
}2.1. Переменные запроса (не хардкодим аргументы)
GraphQL поддерживает variables, что особенно важно для фронтенда.
Запрос:
query GetUser($id: ID!) {
user(id: $id) {
name
avatar
}
}Передаваемые переменные:
{
"id": 42
}Сервер объединяет запрос с переменными и выполняет его.
Преимущества переменных:
запрос можно кэшировать,
тело операции не меняется,
безопаснее, чем вставлять значения в строку.
3. Что делает Mutation
Mutation изменяет данные.
Пример схемы:
type Mutation {
createPost(input: CreatePostInput!): Post!
}Пример запроса:
mutation {
createPost(input: { title: "GraphQL", content: "SDL explained" }) {
id
title
}
}Mutation возвращает объект результата, содержащий новое состояние или подтверждение.
Ответ:
{
"data": {
"createPost": {
"id": "501",
"title": "GraphQL"
}
}
}Важный принцип:
Mutation считается одиночной транзакцией.
Даже если внутри происходит много действий, GraphQL гарантирует их упорядоченное выполнение.
4. Возврат данных в нужной форме
GraphQL всегда возвращает данные:
в структуре, которую запросил клиент
в иерархии, описанной в запросе
строго тех типов, которые указаны в схеме
Пример: вложенная выборка.
query {
user(id: 1) {
name
posts(limit: 2) {
title
comments {
text
}
}
}
}Ответ:
{
"data": {
"user": {
"name": "Den",
"posts": [
{
"title": "GraphQL Basics",
"comments": [
{ "text": "Отличная статья" }
]
},
{
"title": "SDL Tutorial",
"comments": []
}
]
}
}
}
Сервер не может изменить структуру ответа — она определяется клиентом.#Java #middle #GraphQL #Query #Mutation
👍2
5. Ошибки и partial responses
GraphQL всегда возвращает JSON-объект с двумя ключами:
Что важно:
GraphQL может вернуть часть данных, даже если произошла ошибка.
пример: запрос
допустим, поле posts упало из-за ошибки в БД.
Ответ:
GraphQL:
не останавливает выполнение всего запроса,
возвращает то, что смог,
указывает путь к проблемному полю.
Это концепция partial response, которой нет ни в REST, ни в gRPC.
6. Как Mutation обрабатывает ошибки
Mutation также может вернуть частичный результат, но чаще ошибка означает, что произошло отклонение операции:
GraphQL намеренно не использует коды HTTP-статуса, кроме:
200 — запрос обработан
400 — синтаксическая ошибка запроса
500 — ошибка самого сервера GraphQL (не бизнес-ошибка)
#Java #middle #GraphQL #Query #Mutation
GraphQL всегда возвращает JSON-объект с двумя ключами:
data
errors
Что важно:
GraphQL может вернуть часть данных, даже если произошла ошибка.
пример: запрос
query {
user(id: 1) {
name
posts {
title
likes
}
}
}допустим, поле posts упало из-за ошибки в БД.
Ответ:
{
"data": {
"user": {
"name": "Den",
"posts": null
}
},
"errors": [
{
"message": "Database timeout",
"path": ["user", "posts"]
}
]
}GraphQL:
не останавливает выполнение всего запроса,
возвращает то, что смог,
указывает путь к проблемному полю.
Это концепция partial response, которой нет ни в REST, ни в gRPC.
6. Как Mutation обрабатывает ошибки
Mutation также может вернуть частичный результат, но чаще ошибка означает, что произошло отклонение операции:
{
"data": {
"createPost": null
},
"errors": [
{
"message": "User not authorized",
"path": ["createPost"]
}
]
}GraphQL намеренно не использует коды HTTP-статуса, кроме:
200 — запрос обработан
400 — синтаксическая ошибка запроса
500 — ошибка самого сервера GraphQL (не бизнес-ошибка)
#Java #middle #GraphQL #Query #Mutation
👍1
Что выведет код?
#Tasks
public class Task191125 {
public static void main(String[] args) {
Object obj = "42";
String result = switch (obj) {
case Integer i -> "Number: " + i;
case String s when s.length() > 3 -> "Long string";
case String ignored -> "Short string";
default -> "Unknown";
};
System.out.println(result);
}
}#Tasks
👍1
👍1
Вопрос с собеседований
Разница между ArrayDeque и Stack?🤓
Ответ:
Stack — устаревший synchronized-класс на базе Vector, а ArrayDeque — современная реализация без блокировок, быстрее и гибче.
ArrayDeque подходит для реализации стека и очереди, не имеет лишней синхронизации и обеспечивает высокую производительность.
#собеседование
Разница между ArrayDeque и Stack?
Ответ:
ArrayDeque подходит для реализации стека и очереди, не имеет лишней синхронизации и обеспечивает высокую производительность.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
История IT-технологий сегодня — 20 ноября
ℹ️ Кто родился в этот день
Thomas M. Siebel (род. 20 ноября 1952) — предприниматель и инженер, основал Siebel Systems; известен разработкой корпоративных CRM-решений и позднее — проектов в области AI (C3.ai).
🌐 Знаковые события
1985 — Выпущена Microsoft Windows 1.0.
#Biography #Birth_Date #Events #20Ноября
Thomas M. Siebel (род. 20 ноября 1952) — предприниматель и инженер, основал Siebel Systems; известен разработкой корпоративных CRM-решений и позднее — проектов в области AI (C3.ai).
1985 — Выпущена Microsoft Windows 1.0.
#Biography #Birth_Date #Events #20Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Глава 2. List — списки в Java
Интерфейс List и его особенности
В мире программирования, и в Java в частности, необходимость хранить и управлять наборами данных — одна из самых частых задач. Начинающие разработчики знакомы с массивами — простыми и эффективными, но обладающими серьезным недостатком: их размер фиксирован после создания. Что же делать, если количество элементов заранее неизвестно? На помощь приходит интерфейс List (список), который является одной из краеугольных концепций в Java Collections Framework (фреймворке коллекций Java).
Что такое интерфейс List?
List — это интерфейс, который расширяет более общий интерфейс Collection. Если говорить просто, List — это контракт, который обещает определенное поведение для всех классов, которые его реализуют. Сам по себе List не является классом, поэтому вы не можете создать объект типа «List». Он лишь определяет «правила игры», а конкретные классы, такие как ArrayList или LinkedList, уже следуют этим правилам, реализуя функционал по-своему.
Главная идея List — это упорядоченная последовательность. Это его ключевая особенность, отличающая его от других коллекций, например, Set (множества).
Ключевые особенности интерфейса List
Гарантированный порядок элементов.
Это самый важный принцип. Когда вы добавляете элементы в список, система запоминает именно ту последовательность, в которой вы их добавили. Элемент «A», добавленный первым, всегда будет находиться на позиции 0 (если только его не удалили или не переместили). Элемент «B», добавленный вторым, будет на позиции 1, и так далее. Этот порядок сохраняется на протяжении всей жизни списка (если только вы сами его не измените). Это кардинально отличает список от, например, мешка с яблоками, где порядок не важен.
Доступ по индексу.
Благодаря строгому порядку, List предоставляет возможность работать с элементами по их целочисленному индексу (позиции). Индексация всегда начинается с 0, как и в массивах. Вы можете «спросить» список: «Дай мне элемент, который находится на пятой позиции», и он его вернет. Эта операция является одной из базовых и высокооптимизированной в большинстве реализаций списков.
Допустимость дубликатов.
В отличие от множеств (Set), которые гарантируют уникальность своих элементов, список совершенно спокойно относится к повторяющимся значениям. Вы можете добавить одну и ту же строку «Привет» в список десять раз, и все десять копий будут храниться в нем как самостоятельные элементы, занимая разные позиции.
Динамический размер.
В отличие от массива, список не имеет фиксированной длины. Он является динамической структурой данных. Когда вы создаете пустой список, он занимает немного памяти. При добавлении каждого нового элемента список самостоятельно заботится о том, чтобы для него хватило места, при необходимости выделяя дополнительную память «про запас». Это избавляет программиста от необходимости заранее знать точное количество элементов и вручную управлять памятью.
Null-допустимость.
Список разрешает хранение специального значения null, которое обозначает отсутствие объекта. Это означает, что вы можете добавить null в список в качестве валидного элемента. Однако с этим нужно быть осторожным, так как при попытке выполнить какие-либо операции с этим null-элементом (например, вызвать его метод) может быть выброшено исключение NullPointerException.
#Java #для_новичков #beginner #List
Интерфейс List и его особенности
В мире программирования, и в Java в частности, необходимость хранить и управлять наборами данных — одна из самых частых задач. Начинающие разработчики знакомы с массивами — простыми и эффективными, но обладающими серьезным недостатком: их размер фиксирован после создания. Что же делать, если количество элементов заранее неизвестно? На помощь приходит интерфейс List (список), который является одной из краеугольных концепций в Java Collections Framework (фреймворке коллекций Java).
Что такое интерфейс List?
List — это интерфейс, который расширяет более общий интерфейс Collection. Если говорить просто, List — это контракт, который обещает определенное поведение для всех классов, которые его реализуют. Сам по себе List не является классом, поэтому вы не можете создать объект типа «List». Он лишь определяет «правила игры», а конкретные классы, такие как ArrayList или LinkedList, уже следуют этим правилам, реализуя функционал по-своему.
Главная идея List — это упорядоченная последовательность. Это его ключевая особенность, отличающая его от других коллекций, например, Set (множества).
Ключевые особенности интерфейса List
Гарантированный порядок элементов.
Это самый важный принцип. Когда вы добавляете элементы в список, система запоминает именно ту последовательность, в которой вы их добавили. Элемент «A», добавленный первым, всегда будет находиться на позиции 0 (если только его не удалили или не переместили). Элемент «B», добавленный вторым, будет на позиции 1, и так далее. Этот порядок сохраняется на протяжении всей жизни списка (если только вы сами его не измените). Это кардинально отличает список от, например, мешка с яблоками, где порядок не важен.
Доступ по индексу.
Благодаря строгому порядку, List предоставляет возможность работать с элементами по их целочисленному индексу (позиции). Индексация всегда начинается с 0, как и в массивах. Вы можете «спросить» список: «Дай мне элемент, который находится на пятой позиции», и он его вернет. Эта операция является одной из базовых и высокооптимизированной в большинстве реализаций списков.
Допустимость дубликатов.
В отличие от множеств (Set), которые гарантируют уникальность своих элементов, список совершенно спокойно относится к повторяющимся значениям. Вы можете добавить одну и ту же строку «Привет» в список десять раз, и все десять копий будут храниться в нем как самостоятельные элементы, занимая разные позиции.
Динамический размер.
В отличие от массива, список не имеет фиксированной длины. Он является динамической структурой данных. Когда вы создаете пустой список, он занимает немного памяти. При добавлении каждого нового элемента список самостоятельно заботится о том, чтобы для него хватило места, при необходимости выделяя дополнительную память «про запас». Это избавляет программиста от необходимости заранее знать точное количество элементов и вручную управлять памятью.
Null-допустимость.
Список разрешает хранение специального значения null, которое обозначает отсутствие объекта. Это означает, что вы можете добавить null в список в качестве валидного элемента. Однако с этим нужно быть осторожным, так как при попытке выполнить какие-либо операции с этим null-элементом (например, вызвать его метод) может быть выброшено исключение NullPointerException.
#Java #для_новичков #beginner #List
👍1
Абстракция и полиморфизм
Одна из сильных сторон использования интерфейса List — принцип полиморфизма. В своем коде вы можете объявить переменную типа List, а затем присвоить ей любой объект, который реализует этот интерфейс.
Это позволяет писать гибкий и слабосвязанный код. Основная логика вашей программы, которая использует методы add, get, remove, будет работать с любой реализацией List. А вы, в зависимости от конкретных требований к производительности (например, если чаще нужен быстрый доступ по индексу или частое добавление в начало), можете легко подменить одну реализацию на другую, не переписывая весь код.
#Java #для_новичков #beginner #List
Одна из сильных сторон использования интерфейса List — принцип полиморфизма. В своем коде вы можете объявить переменную типа List, а затем присвоить ей любой объект, который реализует этот интерфейс.
List<String> myList; // Объявление переменной интерфейсного типа
myList = new ArrayList<>(); // Работаем с динамическим массивом
// ... позже в коде ...
myList = new LinkedList<>(); // Теперь работаем со связным списком
Это позволяет писать гибкий и слабосвязанный код. Основная логика вашей программы, которая использует методы add, get, remove, будет работать с любой реализацией List. А вы, в зависимости от конкретных требований к производительности (например, если чаще нужен быстрый доступ по индексу или частое добавление в начало), можете легко подменить одну реализацию на другую, не переписывая весь код.
#Java #для_новичков #beginner #List
👍1
Что выведет код?
#Tasks
public class Task201125 {
public static void main(String arg) {
System.out.println("Hello from single arg main");
}
public static void main(String[] args) {
System.out.println("Hello from main");
}
public static void main() {
System.out.println("Hello from parameterless main");
}
}#Tasks
Варианты ответа:
Anonymous Quiz
60%
Hello from main
10%
Hello from parameterless main
20%
Ошибка компиляции
10%
Исключение времени выполнения