Недавно я потратил время, чтобы проанализировать метод ASLIST на классе инструментов Java Arrays, разобрал соответствующую информацию в Интернете и записал ее, надеясь помочь читателям!
Класс инструментов массивы предоставляет метод Aslist, который использует этот метод для преобразования параметра переменной длины или массива в список.
Исходный код заключается в следующем:
/*** Возвращает список фиксированного размера, поддерживаемый указанным массивом. (Изменения в * возвращаемый список «Записать» на массив.) Этот метод действует * как мост между API на основе массива и на основе коллекции, в * Комбинации с {@link Collection#Toarray}. Возвращенный список * Serializable и реализует {@link randomaccess}. * * <p> Этот метод также обеспечивает удобный способ создания списка фиксированного размера *, инициализированный для содержания нескольких элементов: * <pre> * list <string> stands = arrays.aslist ("larry", "moe", "Curly"); * </ pre> * * @param a массив, с помощью которого список будет поддержан * @return a Список представления указанного массива */ @safevarargrgs public static <t> list <t> astlist (t ... a) {return new ArrayList <> (a); }Проблема обнаружение
На основе описания вышеуказанного метода, давайте сначала напишем несколько примеров:
/***@author wangmengjun**/public class arrayexample {public static void main (string [] args) {/** Используйте параметры длины переменной*/list <string> array1 = arrays.aslist («добро пожаловать», «к», «java», «world»); System.out.println (Array1); / ** Используйте Array*/ list <string> array2 = arrays.aslist (new String [] {«добро пожаловать», «to», «java», «world»}); System.out.println (Array2); }}Запустите вышеуказанную программу и выведите следующий контент.
[Добро пожаловать, на Java, World]
[Добро пожаловать, на Java, World]
По прихоти я вдруг захотел добавить строку «круто ~~~» в созданный список и перейти на один.
/ ** Используйте параметры длины переменной*/ list <string> array1 = arrays.aslist («добро пожаловать», «до», «java», «world»); Array1.add ("Cool ~~~");В результате было обнаружено UnsupportedOperationException:
Исключение в потоке "Main" java.lang.unsupportedOperationException at java.util.abstractlist.add (неизвестный источник) на java.util.abstractlist.add (неизвестный источник) на test.arrayexample.main (arrayexample.java:36)
Невероятно, что список, сгенерированный New ArrayList <> (A), на самом деле столкнулся с проблемой.
Причина поиск
Итак, вопрос в том, что именно произошло? С вопросами, проверьте, как выглядит ArrayList в Arrays.aslist?
Оказывается, что класс ArrayList, используемый методом Aslist, является внутренним классом, а не классом java.util.arraylist.
Исходный код заключается в следующем:
/ ** * @serial включает */ частный статический класс ArrayList <e> расширяет AbstractList <e> реализует randomAccess, java.io.serializable {private Static final Long SerialVersionuid = -2764017481108945198L; Частный финал E [] a; ArrayList (e [] array) {if (array == null) бросить новый NullPointerException (); a = массив; } public int size () {return a.length; } public Object [] toarray () {return a.clone (); } public <t> t [] toarray (t [] a) {int size = size (); if (a.length <размер) return Arrays.copyof (this.a, size, (class <? Extends t []>) a.getClass ()); System.ArrayCopy (this.a, 0, a, 0, size); if (a.length> size) a [size] = null; вернуть А; } public E Get (int index) {return a [index]; } public E set (int index, e element) {e oldValue = a [index]; a [index] = element; вернуть OldValue; } public int indexof (Object O) {if (o == null) {for (int i = 0; i <a.length; i ++) if (a [i] == null) return i; } else {for (int i = 0; i <a.length; i ++) if (o.equals (a [i])) return i; } return -1; } public boolean содержит (Object o) {return indexof (o)! = -1; }}Из реализации этого внутреннего класса ArrayList можно увидеть, что он наследует абстрактный класс java.util.abstractlist <e>, но методы добавления и удаления не переопределены, и конкретная реализация не дается.
Тем не менее, по умолчанию класс java.util.abstractlist будет напрямую бросить UnspopportedOperationException в методах добавления, установки и удаления. Некоторые из исходных кодов абстрактного списка следующие:
Public Abstract Class AbstractList <e> расширяет AbstractCollection <e> реализует список <e> { /*** Единственный конструктор. (Для вызова конструкторами подкласса, как правило, * неявно.) */ Protected AbstractList () {} public E Set (int index, e element) {бросить новый UnsupportedOperationException (); } /** * {@inheritdoc} * * <p> Эта реализация всегда бросает * {@code unsupportedOperationException}. * * @Throws UnsupPortedOperationException {@InheritDoc} * @Throws classCastException {@InheritDoc} * @Throws nullPointerException {@InheritDoc} * @Throw E element) {бросить новый UnsupportedOperationException (); } /** * {@inheritdoc} * * <p> Эта реализация всегда бросает * {@code unsupportedOperationException}. * * @Throws UnsupportEdoPerationException {@InheritDoc} * @Throws indexoutOfBoundSexception {@InheritDoc} */ public e Remove (int index) {Throw New UnsupportedOperationException (); }}Это именно потому, что внутренний класс Arraylist of Java.Util.arrays Class не переопределяет методы добавления и удаления, поэтому, когда мы называем его метод добавления, мы фактически называем метод добавления класса AbstractList, и результат заключается в том, что UnsupportedOperationException напрямую выбрасывается.
Аналогичным образом, при вызове метода удаления или вызова другими методами, связанными с методами добавления и удаления (например, addall), вы также столкнетесь с исключением UnsupportedOperationException.
Пример addall:
/***@author wangmengjun**/public class arrayexample {public static void main (string [] args) {/** Используйте параметры длины переменной*/list <string> array1 = arrays.aslist («добро пожаловать», «к», «java», «world»); array1.addall (arrays.aslist ("aaa", "bbb")); }}Исключение в потоке "Main" java.lang.unsupportedOperationexception at java.util.abstractlist.add (неизвестный источник) на java.util.abstractlist.add (неизвестный источник) на java.util.abstractcollection.addall (неизвестный источник) на тестировании.
Пример набора:
/***@author wangmengjun**/public class arrayexample {public static void main (string [] args) {/** Используйте параметры длины переменной*/list <string> array1 = arrays.aslist («добро пожаловать», «к», «java», «world»); System.out.println (Array1); // заменить Java на Hello Array1.Set (2, «Привет»); System.out.println (Array1); }}Это именно потому, что внутренний класс массивов переписывает метод установки, поэтому вышеуказанная программа может работать нормально и не будет бросать исключение UnsupportedOperationException.
Результаты следующие:
[Добро пожаловать, на Java, World]
[Добро пожаловать, привет, мир]
Используйте сценарии
Судя по приведенным приведенным примерам и простому анализу, класс инструментов массивы предоставляет метод ASLIST, который может преобразовать параметр или массивы переменной длины или массив в список.
Тем не менее, длина сгенерированного списка фиксирована; Он может выполнять операции модификации (например, изменение элементов в определенной позиции); Он не может выполнять операции, которые влияют на длину (например, добавление, удаление и т. Д.). Будет брошено исключение UnsupportedOperationException.
Arrays.aslist более подходит для сценариев, где уже есть данные массива или некоторые элементы, но необходимо быстро создать список, который используется только для операций чтения и не выполняет операции добавления или удаления.
Если вы хотите быстро получить список списков, которые можно добавить, удалить, изменять и проверять на основе известных данных массива, относительно простой метод заключается в следующем:
Повторно используйте java.util.arraylist, чтобы обернуть слой.
/***@author wangmengjun**/public class arrayexample {public static void main (string [] args) {/** Использовать параметры длины переменной*/list <string> array1 = new Arraylist <> (Arrays.aslist («приветствую», «к», «Java», «World»)); System.out.println (Array1); Array1.add ("Cool ~~~"); System.out.println (Array1); }}Результаты следующие:
[Добро пожаловать, на Java, World]
[Добро пожаловать, на, Java, World, Cool ~~~]
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!