[Совет по Java #032]
Тема: Arrays.asList() возвращает список фиксированного размера.
Проблема: Метод Arrays.asList(T... a) возвращает не java.util.ArrayList, а внутренний статический класс Arrays.ArrayList, который не реализует операции изменения размера.
Этот список является представлением (view) переданного массива. Попытка вызвать add(), remove(), clear() или другие методы, изменяющие размер, выбрасывает UnsupportedOperationException. Даже метод clear(), который кажется безопасным, выбрасывает исключение.
Решение: Если нужен изменяемый список, создайте новый ArrayList на основе результата Arrays.asList(): new ArrayList<>(Arrays.asList(с)).
Начиная с Java 9, можно использовать List.of() для неизменяемых списков (еще более строгие ограничения) или List.copyOf(). Если массив уже существует, и нужно его изменяемое представление, используйте цикл или Stream API. Помните, что изменения существующих элементов через set() работают и отражаются на исходном массиве.
Объяснение: Arrays.asList() предназначен для быстрого создания оболочки вокруг массива для использования в API, требующих Collection. Возвращаемый объект хранит ссылку на исходный массив и не поддерживает изменение размера, так как массив имеет фиксированную длину. Методы add, remove, clear не переопределены и наследуются от AbstractList, где по умолчанию выбрасывают UnsupportedOperationException.
При этом метод set() переопределен и работает корректно, изменяя соответствующий элемент в массиве. Важно помнить, что изменения в списке видны в исходном массиве, и наоборот. Начиная с Java 8, для примитивных массивов удобнее использовать стримы с boxed(). Java 9 ввел List.of(), который создает полностью неизменяемые списки (даже set() не работает), что лучше для констант.
#Java #советы
Тема: Arrays.asList() возвращает список фиксированного размера.
Проблема: Метод Arrays.asList(T... a) возвращает не java.util.ArrayList, а внутренний статический класс Arrays.ArrayList, который не реализует операции изменения размера.
Этот список является представлением (view) переданного массива. Попытка вызвать add(), remove(), clear() или другие методы, изменяющие размер, выбрасывает UnsupportedOperationException. Даже метод clear(), который кажется безопасным, выбрасывает исключение.
Решение: Если нужен изменяемый список, создайте новый ArrayList на основе результата Arrays.asList(): new ArrayList<>(Arrays.asList(с)).
Начиная с Java 9, можно использовать List.of() для неизменяемых списков (еще более строгие ограничения) или List.copyOf(). Если массив уже существует, и нужно его изменяемое представление, используйте цикл или Stream API. Помните, что изменения существующих элементов через set() работают и отражаются на исходном массиве.
public class ArraysAsListExample {
public static void main(String[] args) {
String[] colorsArray = {"Red", "Green", "Blue"};
//Антипаттерн: модификация списка из Arrays.asList()
List<String> fixedList = Arrays.asList(colorsArray);
System.out.println("Fixed list: " + fixedList); // [Red, Green, Blue]
try {
fixedList.add("Yellow"); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Cannot add: " + e);
}
try {
fixedList.remove(0); // UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Cannot remove: " + e);
}
try {
fixedList.clear(); // Тоже UnsupportedOperationException
} catch (UnsupportedOperationException e) {
System.out.println("Cannot clear: " + e);
}
//Можно изменять существующие элементы
fixedList.set(0, "Cyan");
System.out.println("After set: " + fixedList); // [Cyan, Green, Blue]
// Обратите внимание: исходный массив тоже изменился!
System.out.println("Original array: " + Arrays.toString(colorsArray)); // [Cyan, Green, Blue]
//Решение 1: копирование в новый ArrayList
List<String> mutableList = new ArrayList<>(Arrays.asList(colorsArray));
mutableList.add("Yellow");
mutableList.remove(0);
System.out.println("Mutable list: " + mutableList);
//Решение 2: Java 8+ Stream для примитивов
List<Integer> numbers = Arrays.stream(new int[]{1, 2, 3})
.boxed()
.collect(Collectors.toList());
numbers.add(4);
System.out.println("From stream: " + numbers);
//Решение 3: Java 9+ неизменяемые списки
List<String> immutable = List.of("A", "B", "C");
// immutable.add("D"); // UnsupportedOperationException
// immutable.set(0, "Z"); // Также выбрасывает исключение!
//Решение 4: явное создание ArrayList с инициализацией
List<String> explicit = new ArrayList<>();
explicit.add("X");
explicit.add("Y");
explicit.add("Z");
}Объяснение: Arrays.asList() предназначен для быстрого создания оболочки вокруг массива для использования в API, требующих Collection. Возвращаемый объект хранит ссылку на исходный массив и не поддерживает изменение размера, так как массив имеет фиксированную длину. Методы add, remove, clear не переопределены и наследуются от AbstractList, где по умолчанию выбрасывают UnsupportedOperationException.
При этом метод set() переопределен и работает корректно, изменяя соответствующий элемент в массиве. Важно помнить, что изменения в списке видны в исходном массиве, и наоборот. Начиная с Java 8, для примитивных массивов удобнее использовать стримы с boxed(). Java 9 ввел List.of(), который создает полностью неизменяемые списки (даже set() не работает), что лучше для констант.
#Java #советы
👍6
Что выведет код?
#Tasks
import java.util.Arrays;
import java.util.List;
public class Task010526 {
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
String[] array = {"X", "Y", "Z"};
List<String> list2 = Arrays.asList(array);
list.set(1, "B2");
array[2] = "Z2";
System.out.print(list.get(1) + " ");
System.out.print(list2.get(2) + " ");
try {
list.add("D");
} catch (Exception e) {
System.out.print("Exception1 ");
}
try {
list2.remove(0);
} catch (Exception e) {
System.out.print("Exception2");
}
}
}
#Tasks
👍2
Варианты ответа:
Anonymous Quiz
18%
B2 Z2
18%
B2 Z2 Exception1
55%
B2 Z2 Exception1 Exception2
9%
B Z2 Exception1 Exception2
👍1🔥1
Что такое Date и Calendar? Какие есть альтернативы? 🤓
Ответ:
java.util.Date — представляет момент времени (миллисекунды с 1970-01-01). Многие методы устарели.
java.util.Calendar — абстрактный класс для работы с датами и временем (получение компонентов: год, месяц, день и т.д.).
Оба имеют проблемы: мутабельность, неинтуитивные индексы месяцев (0-11), неудобство.
Начиная с Java 8, появился новый пакет java.time (LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Duration, Period) — immutable, потокобезопасный, интуитивный.
#собеседование
Ответ:
java.util.Calendar — абстрактный класс для работы с датами и временем (получение компонентов: год, месяц, день и т.д.).
Оба имеют проблемы: мутабельность, неинтуитивные индексы месяцев (0-11), неудобство.
Начиная с Java 8, появился новый пакет java.time (LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Duration, Period) — immutable, потокобезопасный, интуитивный.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Всем привет! ✌️
Так как неожиданно для меня самого у меня стало много свободного времени, наберу желающих изучить Java.
Золотых гор не обещаю, но на Junior+/ middle вытяну однозначно.
Моя экспертиза по видео и каналу, наверняка понятна.
Пишите в лс @Oleborn
Так как неожиданно для меня самого у меня стало много свободного времени, наберу желающих изучить Java.
Золотых гор не обещаю, но на Junior+/ middle вытяну однозначно.
Моя экспертиза по видео и каналу, наверняка понятна.
Пишите в лс @Oleborn
🔥7👍1
История технологии сегодня — 02 мая
ℹ️ Кто родился в этот день
Сю Такуми (яп. 巧 舟 Такуми Сю:) (род. май 1971, Сайтама) — японский сценарист и геймдизайнер. Наиболее известен своей работой над серией игр Ace Attorney. Также он был сценаристом игры Ghost Trick: Phantom Detective, вышедшей в 2010 году.
🌐 Знаковые события
Не нашел((
#Biography #Birth_Date #Events #02мая
Сю Такуми (яп. 巧 舟 Такуми Сю:) (род. май 1971, Сайтама) — японский сценарист и геймдизайнер. Наиболее известен своей работой над серией игр Ace Attorney. Также он был сценаристом игры Ghost Trick: Phantom Detective, вышедшей в 2010 году.
Не нашел((
#Biography #Birth_Date #Events #02мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
С 25.04 по 01.05
Предыдущий пост(с 18.04 по 24.04)
Запись встреч/видео:
12. RabbitMQ: Полный разбор от Confirm до DLQ — всё, что нужно для надёжной очереди задач
Обучающие статьи:
Раздел 9. Исключения, логирование, отладка
Глава 1. Иерархия исключений (Exceptions)
Исключения в лямбдах, Stream API, конструкторах и статических блоках
Objects.requireNonNull() – стандартная фабрика NullPointerException
[Совет по Java #030]
Тема: try-with-resources закрывает ресурсы в обратном порядке объявления.
[Совет по Java #031]
Тема: ArrayList.subList() не копирует данные, а создает view на исходный список.
[Совет по Java #032]
Тема: Arrays.asList() возвращает список фиксированного размера.
Полезные статьи и видео:
Когда Java-разработка — это не только Spring
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
Предыдущий пост(с 18.04 по 24.04)
Запись встреч/видео:
12. RabbitMQ: Полный разбор от Confirm до DLQ — всё, что нужно для надёжной очереди задач
Обучающие статьи:
Раздел 9. Исключения, логирование, отладка
Глава 1. Иерархия исключений (Exceptions)
Исключения в лямбдах, Stream API, конструкторах и статических блоках
Objects.requireNonNull() – стандартная фабрика NullPointerException
[Совет по Java #030]
Тема: try-with-resources закрывает ресурсы в обратном порядке объявления.
[Совет по Java #031]
Тема: ArrayList.subList() не копирует данные, а создает view на исходный список.
[Совет по Java #032]
Тема: Arrays.asList() возвращает список фиксированного размера.
Полезные статьи и видео:
Когда Java-разработка — это не только Spring
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
🔥4
Обновление devforge.ru
Обновил визуал страниц, добавил боковую панель, удобные иконки и ссылки.
По мне - так стало заебумба💃
Оцените?
Обновил визуал страниц, добавил боковую панель, удобные иконки и ссылки.
По мне - так стало заебумба
Оцените?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1🤯1🍾1
Java for Beginner
Всем привет! ✌️ Так как неожиданно для меня самого у меня стало много свободного времени, наберу желающих изучить Java. Золотых гор не обещаю, но на Junior+/ middle вытяну однозначно. Моя экспертиза по видео и каналу, наверняка понятна. Пишите в лс…
Ребят, пишите не стесняйтесь))
👍1
История технологии сегодня — 03 мая
ℹ️ Кто родился в этот день
Джордж Паджет Томсон (англ. George Paget Thomson; 3 мая 1892 — 10 сентября 1975) — английский учёный, физик-ядерщик, нобелевский лауреат (1937) — «за экспериментальное открытие дифракции электронов на кристаллах» (совместно с Джозефом Дэвиссоном).
Альфре́д Кастле́р (фр. Alfred Kastler; 3 мая 1902, Гебвиллер, Германская империя — 7 января 1984, Бандоль, Франция) — французский физик, лауреат Нобелевской премии по физике в 1966 году «за открытие и разработку оптических методов исследования резонансов Герца в атомах».
Сти́вен Ва́йнберг (англ. Steven Weinberg; 3 мая 1933, Нью-Йорк — 23 июля 2021, Остин) — американский физик-теоретик, один из создателей единой теории электрослабого взаимодействия и Стандартной модели. Лауреат Нобелевской премии по физике в 1979 году (совместно с Шелдоном Ли Глэшоу и Абдусом Саламом) «за вклад в объединённую теорию слабых и электромагнитных взаимодействий между элементарными частицами, в том числе предсказание слабых нейтральных токов».
🌐 Знаковые события
2004 — новый интернет-червь «Sasser» поразил сотни тысяч персональных компьютеров по всему миру.
#Biography #Birth_Date #Events #03мая
Джордж Паджет Томсон (англ. George Paget Thomson; 3 мая 1892 — 10 сентября 1975) — английский учёный, физик-ядерщик, нобелевский лауреат (1937) — «за экспериментальное открытие дифракции электронов на кристаллах» (совместно с Джозефом Дэвиссоном).
Альфре́д Кастле́р (фр. Alfred Kastler; 3 мая 1902, Гебвиллер, Германская империя — 7 января 1984, Бандоль, Франция) — французский физик, лауреат Нобелевской премии по физике в 1966 году «за открытие и разработку оптических методов исследования резонансов Герца в атомах».
Сти́вен Ва́йнберг (англ. Steven Weinberg; 3 мая 1933, Нью-Йорк — 23 июля 2021, Остин) — американский физик-теоретик, один из создателей единой теории электрослабого взаимодействия и Стандартной модели. Лауреат Нобелевской премии по физике в 1979 году (совместно с Шелдоном Ли Глэшоу и Абдусом Саламом) «за вклад в объединённую теорию слабых и электромагнитных взаимодействий между элементарными частицами, в том числе предсказание слабых нейтральных токов».
2004 — новый интернет-червь «Sasser» поразил сотни тысяч персональных компьютеров по всему миру.
#Biography #Birth_Date #Events #03мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Наш проект поехал в прод! 🏝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
История технологии сегодня — 04 мая
ℹ️ Кто родился в этот день
Фриц Опель, с 1917 года — фон Опель (нем. Fritz von Opel; 4 мая 1899, Рюссельхайм (Main) — 8 апреля 1971, Санкт-Мориц, Самедан) — немецкий промышленник, мотогонщик, один из пионеров в области ракетной техники. Прозвище — Raketen-Fritz. Внук Адама Опеля, производителя швейных машин и велосипедов, основателя компании «Опель».
🌐 Знаковые события
1976 — запустили спутник LAGEOS-1 с капсулой времени.
2000 — первое появление вируса «I love you».
#Biography #Birth_Date #Events #04мая
Фриц Опель, с 1917 года — фон Опель (нем. Fritz von Opel; 4 мая 1899, Рюссельхайм (Main) — 8 апреля 1971, Санкт-Мориц, Самедан) — немецкий промышленник, мотогонщик, один из пионеров в области ракетной техники. Прозвище — Raketen-Fritz. Внук Адама Опеля, производителя швейных машин и велосипедов, основателя компании «Опель».
1976 — запустили спутник LAGEOS-1 с капсулой времени.
2000 — первое появление вируса «I love you».
#Biography #Birth_Date #Events #04мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Напоминаю, что продолжаю набор на обучение Java 🤓
Золотых гор не обещаю, но до уровня middle однозначно дойдете🧑💻
Пишите в лс @oleborn
Золотых гор не обещаю, но до уровня middle однозначно дойдете
Пишите в лс @oleborn
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Раздел 9. Исключения, логирование, отладка
Глава 1. Иерархия исключений (Exceptions)
Практика: Защитное программирование в «Библиотеке»
Подготовка: обновление модели данных
К этому моменту в проекте «Библиотека» должны существовать:
Класс Book с полями id (String или UUID), title, author, year, genres
Класс Library с коллекцией книг и методами поиска
Функциональность импорта/экспорта
Добавьте поле publishedDate типа LocalDate в Book для задачи с парсингом дат.
Часть 1. Автоматическое управление ресурсами
Проблема: ручное закрытие ресурсов
Проблемы: многословно, finally выполняется всегда (даже если ресурс не создан), исключение при close может затереть основное исключение.
Решение: try-with-resources
Ключевые моменты:
Ресурсы в скобках после try должны реализовывать AutoCloseable
Закрываются в обратном порядке создания: buffered, затем reader
Если исключение в try и при закрытии — основное сохраняется, вторичное прицепляется через Suppressed
Можно объявлять ресурс вне try, если он effectively final
Несколько ресурсов
Часть 2. Собственное исключение
Зачем нужно своё исключение
Семантическая ясность: LibraryException говорит о проблеме в предметной области
Единая точка обработки в верхних слоях
Возможность добавить контекст (ID книги, имя файла)
Реализация: unchecked-исключение
Создайте класс LibraryException:
Почему unchecked:
Ошибки библиотеки обычно не восстановимы на месте
Не загромождает сигнатуры методов throws
В Stream API и лямбдах не требует обёртки (в отличие от checked)
Использование в проекте
#Java #для_новичков #beginner #exception #практика
Глава 1. Иерархия исключений (Exceptions)
Практика: Защитное программирование в «Библиотеке»
Подготовка: обновление модели данных
К этому моменту в проекте «Библиотека» должны существовать:
Класс Book с полями id (String или UUID), title, author, year, genres
Класс Library с коллекцией книг и методами поиска
Функциональность импорта/экспорта
Добавьте поле publishedDate типа LocalDate в Book для задачи с парсингом дат.
Часть 1. Автоматическое управление ресурсами
Проблема: ручное закрытие ресурсов
// Плохо: ресурс может остаться открытым при исключении
public List<Book> importFromJsonManual(String filename) {
FileReader reader = null;
try {
reader = new FileReader(filename);
// ... парсинг ...
return parseBooks(reader);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (reader != null) {
try {
reader.close(); // Может бросить исключение, подавляя основное
} catch (IOException e) {
// игнорируем
}
}
}
}
Проблемы: многословно, finally выполняется всегда (даже если ресурс не создан), исключение при close может затереть основное исключение.
Решение: try-with-resources
// Хорошо: автоматическое закрытие, правильная обработка исключений
public List<Book> importFromJson(String filename) {
try (FileReader reader = new FileReader(filename);
BufferedReader buffered = new BufferedReader(reader)) {
StringBuilder json = new StringBuilder();
String line;
while ((line = buffered.readLine()) != null) {
json.append(line);
}
return parseBooks(json.toString());
} catch (IOException e) {
throw new LibraryException("Не удалось прочитать файл: " + filename, e);
}
}
Ключевые моменты:
Ресурсы в скобках после try должны реализовывать AutoCloseable
Закрываются в обратном порядке создания: buffered, затем reader
Если исключение в try и при закрытии — основное сохраняется, вторичное прицепляется через Suppressed
Можно объявлять ресурс вне try, если он effectively final
Несколько ресурсов
public void exportToJson(String inputFilename, String outputFilename) {
try (BufferedReader reader = Files.newBufferedReader(Path.of(inputFilename));
BufferedWriter writer = Files.newBufferedWriter(Path.of(outputFilename))) {
String json = reader.readLine();
List<Book> books = parseBooks(json);
String formatted = formatBooks(books);
writer.write(formatted);
} catch (IOException e) {
throw new LibraryException("Ошибка при копировании данных", e);
}
}Часть 2. Собственное исключение
Зачем нужно своё исключение
Семантическая ясность: LibraryException говорит о проблеме в предметной области
Единая точка обработки в верхних слоях
Возможность добавить контекст (ID книги, имя файла)
Реализация: unchecked-исключение
Создайте класс LibraryException:
public class LibraryException extends RuntimeException {
public LibraryException(String message) {
super(message);
}
public LibraryException(String message, Throwable cause) {
super(message, cause);
}
public LibraryException(String message, String bookId, Throwable cause) {
super(message + " [книга: " + bookId + "]", cause);
}
}Почему unchecked:
Ошибки библиотеки обычно не восстановимы на месте
Не загромождает сигнатуры методов throws
В Stream API и лямбдах не требует обёртки (в отличие от checked)
Использование в проекте
public Book findBookOrThrow(String bookId) {
return findById(bookId)
.orElseThrow(() -> new LibraryException("Книга не найдена", bookId, null));
}#Java #для_новичков #beginner #exception #практика
👍6