List add error java

Scenario Convert an array to a List using asList method of java.util.Arrays class. Try to add an element to the list returned(by calling add method) or remove

Scenario
Convert an array to a List using asList method of java.util.Arrays class.
Try to add an element to the list returned(by calling add method) or remove an element from the list(using remove method) and you will get an exception something like

Exception in thread “main” java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
at TestList.main(TestList.java:15)

Code to reproduce the above error is as below

// create an array
Long[] array = {1l,2l};
//convert it to list
List list = Arrays.asList(array);
// add to list. This throws error
list.add(3L);

Reason

asList method of java.util.Arrays class returns an object of a java ArrayList which is nested inside the class java.util.Arrays.

ArrayList extends java.util.AbstractList and it does not implement add or remove method.
Thus, when these methods are called on this list object, it calls add or remove method of java.util.AbstractList class which in turn throws java.lang.UnsupportedOperationException.

From java docs of add method of java.util.AbstractList class

throws UnsupportedOperationException if the add operation is not supported by this list

Secondly, the list returned by asList method of java.util.Arrays class is a fixed-size list which means that elements cannot be added to or removed from the list. Java docs of asList method states

Returns a fixed-size list backed by the specified array

If you look at the type of object returned by Arrays.asList method, it is Arrays$ArrayList<E>.

Solution
Our ultimate goal is to create an ArrayList which has the contents of the array and which also supports add and remove operations over it.

There are a couple of ways to do it as follows:
Method 1 : Iterating over the array

This method is an inefficient method which involves creating a new ArrayList, iterating over the array and in every iteration adding the element of the array to the list.
Code is given below.

Long[] array = { 1l, 2l };
// create a new empty list
List newList = new ArrayList();
//iterate over array
for (int i = 0; i < array.length; i++) {
  Long element = array[i];
  //add array element to list
  newList.add(element);
}
System.out.println(newList);

Output
Above code produces the following output

[1, 2, 3]

Method 2 : Creating an ArrayList directly with the contents of array

java.util.ArrayList has a constructor which takes another collection as argument.
Create a List using Arrays.asList method as you were using earlier and pass the resultant List to create a new ArrayList object.
This approach should be preferable over the first approach.

Long[] array={1l,2l};
//convert it to list
List list = Arrays.asList(array);
//create a new list with the contents of the above list
List newList = new ArrayList(list);
// add to list
newList.add(3L);
System.out.println(newList);

Output
Above code produces the following output

[1, 2, 3]

Let’s tweak in

  1. Any data structure which extends java.util.Collection interface can be supplied while creating a new ArrayList.
    Thus, objects of type java.util.Set such as HashSet, LinkedHashSet, objects of type java.util.List such as LinkedList, Vector can be used.
  2. An ArrayList uses an array behind the scenes.
  3. The type of ArrayList should be the same as that of the List supplied to it in the constructor.
  4. Though this post uses an ArrayList of type java.lang.Long but it is applicable to list of all types such as java.lang.String, java.lang.Integer etc.

Hit the clap if the article was helpful.

11 ноября, 2022 12:00 пп
249 views
| Комментариев нет

Development, Java

В этом мануале мы поговорим о том, как в Java работают методы add() и addAll(). 

Метод List add()

Этот метод используется для добавления элементов в список. Существует два способа сделать это:

  1. add(E e): добавляет элемент в конец списка. Поскольку List поддерживает Generics, тип добавляемых элементов определяется при создании списка.
  2. add(int index, E element): вставляет элемент в список по заданному индексу. Элементы из заданного индекса сдвигаются по списку вправо. Если заданный индекс выходит за пределы допустимого диапазона, метод выдает IndexOutOfBoundsException.

Давайте рассмотрим несколько примеров применения List add():

package com.journaldev.examples;

import java.util.ArrayList;
import java.util.List;

public class ListAddExamples {

public static void main(String[] args) {

List<String> vowels = new ArrayList<>();

vowels.add("A"); // [A]
vowels.add("E"); // [A, E]
vowels.add("U"); // [A, E, U]

System.out.println(vowels); // [A, E, U]

vowels.add(2, "I"); // [A, E, I, U]
vowels.add(3, "O"); // [A, E, I, O, U]

System.out.println(vowels); // [A, E, I, O, U]
}
}

Во-первых, этот код добавит A, E и U в список и выведет [A, E, U].

Затем этот код добавит I по индексу 2, что в результате выдаст [A, E, I, U]. Затем он добавит O по индексу 3, чтобы получилось [A, E, I, O, U]. В конце он выведет этот список на экран.

Метод List addAll()

Этот метод используется для добавления элементов из коллекции в список. Существует два перегруженных метода addAll():

  1. addAll(Collection<? extends E> c): этот метод добавляет все элементы из заданной коллекции в конец списка. Порядок вставки зависит от порядка, в котором их возвращает итератор коллекции.
  2. addAll(int index, Collection<? extends E> c): этот метод можно использовать для вставки элементов из коллекции по заданному индексу. Все элементы в списке смещаются вправо, чтобы освободить место для элементов из коллекции.

Читайте также: Переопределение и перегрузка в java

Вот несколько примеров применения метода List addAll():

package com.journaldev.examples;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListAddAllExamples {

public static void main(String[] args) {

List<Integer> primeNumbers = new ArrayList<>();

primeNumbers.addAll(Arrays.asList(2, 7, 11));

System.out.println(primeNumbers); // [2, 7, 11]

primeNumbers.addAll(1, Arrays.asList(3, 5));

System.out.println(primeNumbers); // [2, 3, 5, 7, 11]
}
}

Сначала этот код создает новый список со значениями [2, 7, 11]. Затем этот список выводится на экран.

Далее создается второй список со значением [3, 5]. После этого этот второй список добавляется к первому с помощью addAll() по индексу 1. В результате на экран выводится список [2, 3, 5, 7, 11].

Исключение UnsupportedOperationException и метод add()

В документации по методам List add() и addAll() указано, что реализация списка может не поддерживать опциональные операции. В этом случае методы list add() вызывают исключение UnsupportedOperationException. Чаще всего вы можете встретить это исключение в двух распространенных сценариях:

  1. Arrays.asList(): этот метод возвращает список фиксированного размера, поскольку он поддерживается указанным массивом. Любая операция, которая меняет размер списка, вызывает исключение UnsupportedOperationException.
  2. Collections.unmodifiedList(List l): этот метод возвращает неизменяемый вид данного списка. Соответственно, операции add() вызывают исключение UnsupportedOperationException.

Давайте взглянем на пример UnsupportedOperationException с операцией добавления элемента в список фиксированного размера:

jshell> List<Integer> ints = Arrays.asList(1,2,3);
ints ==> [1, 2, 3]

jshell> ints.add(4);
|  Exception java.lang.UnsupportedOperationException
|        at AbstractList.add (AbstractList.java:153)
|        at AbstractList.add (AbstractList.java:111)
|        at (#4:1)

Сначала этот код создает список фиксированного размера – [1, 2, 3]. Затем он пытается добавить в список элемент 4. Это приводит к возникновению исключения UnsupportedOperationException.

Теперь посмотрите на другой пример UnsupportedOperationException с операцией добавления в неизменяемое представление данного списка:

jshell> List<String> strs = new ArrayList<>();
strs ==> []

jshell> strs.add("A");
$6 ==> true

jshell> List<String> strs1 = Collections.unmodifiableList(strs);
strs1 ==> [A]

jshell> strs1.add("B");
|  Exception java.lang.UnsupportedOperationException
|        at Collections$UnmodifiableCollection.add (Collections.java:1058)
|        at (#8:1)

Данный код добавляет элемент A в список. Затем он пытается добавить в неизменяемое представление предыдущего списка новый элемент B. Это приводит к возникновению исключения UnsupportedOperationException.

Заключение

В этой статье вы узнали о том, как работают методы Java List add() и addAll().

Читайте также:

  • List API Docs
  • StackOverflow

Tags: Java

Сегодня я писал статистику. Я случайно написал следующий фрагмент кода и запустил JUnit. Оказалось! ! ! Вызов метода list.add сообщит об ошибке (java.lang.UnsupportedOperationException)
Этот фрагмент кода выглядит следующим образом:

@Test
    public void test01() {

        List<String> a7DaysTitleList = Arrays.asList(«7   [0]»,"7-е [1]","7-е [2-10]",«7-е [10-30]»);
        // a7DaysTitleList = new ArrayList ({"7 [0]", «7 [1]», «7 [2-10]», «7 [10-30]»}); не существует!

        for (String str : a7DaysTitleList) {
            System.out.println(str);
        }

        a7DaysTitleList.add(«7   [30, + ∞)»);// Сообщаем об ошибке

        for (String str : a7DaysTitleList) {
            System.out.println(str);
        }

    }

График эффекта бега:

Ошибка: java.lang.UnsupportedOperationException в java.util.AbstractList.add (AbstractList.java:131) в java.util.AbstractList.add (AbstractList.java:91) в com.markin.test.ListTest.test01 (ListTest. java: 21) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в…

В чем дело, вызов add может сообщить об ошибке, вы можете увидеть сообщение об ошибке «исключение неподдерживаемой операции»!
Как видите, я использую Arrays.asList (xxx) для возврата списка. Может быть, в этом списке есть что-то особенное!
БоюсьВолна исходного кода, Иди ты:
Удерживая нажатой клавишу Ctrl, щелкните «Массивы».asList(Xxx) в исходный код класса Array (Array.class)! Примечание. Плагин декомпиляции прост в использовании! ! !
Array
Как видите, вызов статического метода asList (xxx) для Array возвращает ArrayList.
Погрузитесь глубже, удерживая Ctrl, щелкните ArrayList, суть здесь,

Я его не вижу, не вижу, имя файла богатое! (Серьезно, кашель — это знак доллара $), указывающий на то, что ArrayList является внутренним классом Array! (После того, как внутренний класс скомпилирован, это будет отдельный файл, формат именования: внешний класс + «знак доллара» + внутренний класс), ну посмотрите на это, отметьте его большой красной стрелкой,
private final E[] a;
Однако дело не в том, что окончательный измененный ссылочный тип является неизменяемой ссылкой, а в том, что содержимое должно быть изменяемым? ! (Это знание непонятно приветствуется приставанием)
Сравните метод добавления ArrayList и java.util.ArrayList внутри Array и найдите
ArrayList внутри массива не переписывал добавление (xxx) AbstractList, что заставляло нас вызывать добавление (xxx) кода апелляции, которое фактически напрямую вызывало добавление (xxx) класса AbstractList, поэтому оно было брошено напрямую Исключение UnsupportedOperationException.


Хорошо, я знаю, почему, что мне делать, послушно писать новый ArrayList (), добавлять один за другим, ха-ха

Я хотел использовать метод Collections.copy () для реализации копирования, но произошла ошибка. Collections.copy сообщил об ошибке: Источник не помещается в dest. Решение:http://stackoverflow.com/questions/6147650/java-lang-indexoutofboundsexception-source-does-not-fit-in-dest
В соответствии с подсказкой в ​​тексте: напрямую передать исходный список в метод построения нового списка
List dest = new ArrayList(source);

Сноска: Если вы столкнулись с проблемой, решите ее.


Уровень ограничен, если в эссе есть какие-либо ошибки или упущения, пожалуйста, дайте больше рекомендаций от всех экспертов.

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    The UnsupportedOperationException is one of the common exceptions that occur when we are working with some API of list implementation. It is thrown to indicate that the requested operation is not supported.

    This class is a member of the Java Collections Framework.

    All java errors implement the java.lang.Throwable interface or are inherited from another class. The hierarchy of this Exception is-

      java.lang.Object

             java.lang.Throwable

                       java.lang.Exception

                              java.lang.RuntimeException

                                      java.lang.UnsupportedOperationException

    Syntax:

    public class UnsupportedOperationException
    extends RuntimeException

    The main reason behind the occurrence of this error is the asList method of java.util.Arrays class returns an object of an ArrayList which is nested inside the class java.util.Arrays. ArrayList extends java.util.AbstractList and it does not implement add or remove method. Thus when this method is called on the list object, it calls to add or remove method of AbstractList class which throws this exception. Moreover, the list returned by the asList method is a fixed-size list therefore it cannot be modified.

    The below example will result in UnsupportedOperationException as it is trying to add a new element to a fixed-size list object

    Java

    import java.util.Arrays;

    import java.util.List;

    public class Example {

        public static void main(String[] args)

        {

            String str[] = { "Apple", "Banana" };

            List<String> l = Arrays.asList(str);

            System.out.println(l);

            l.add("Mango");

        }

    }

    Output:

    Exception in thread "main" java.lang.UnsupportedOperationException
        at java.base/java.util.AbstractList.add(AbstractList.java:153)
        at java.base/java.util.AbstractList.add(AbstractList.java:111)
        at Example.main(Example.java:14)

    We can solve this problem by using a mutable List that can be modified such as an ArrayList. We create a List using Arrays.asList method as we were using earlier and pass that resultant List to create a new ArrayList object. 

    Java

    import java.util.ArrayList;

    import java.util.List;

    import java.util.*;

    public class Example {

        public static void main(String[] args) {

            String str[] = { "Apple", "Banana" };

            List<String> list = Arrays.asList(str); 

            List<String> l = new ArrayList<>(list);

            l.add("Mango");

            for(String s: l )

              System.out.println(s);

        }

    }

    Понравилась статья? Поделить с друзьями:
  • Liquibase exception databaseexception error no schema has been selected to create in
  • Liquibase checksum error
  • Lipo аккумулятор вздулся как исправить
  • Lion alcolmeter sd 400 ошибка e bl
  • Lsf 8357 ошибка f13