Метод удаления итератора

У меня есть код из примера, но он не работает:

List<Byte> myList = Arrays.asList(B);
Iterator<Byte> itr = myList.iterator();

while(itr.hasNext())  
{  
    Byte element = itr.next();  
    if(element == 32)  
    {  
        itr.remove();  
    }  
}

Я не могу понять, почему приведенный выше код генерирует следующее исключение.

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:144)
at java.util.AbstractList$Itr.remove(AbstractList.java:360)

person Ryainad    schedule 30.07.2013    source источник
comment
Потому что это именно то, что говорят документы?   -  person Brian Roach    schedule 30.07.2013


Ответы (3)


Arrays.asList(B); возвращает список фиксированного размера: вы можете устанавливать или получать элементы, но не можете удалять или добавлять. Это объясняется в javadoc:

Возвращает список фиксированного размера, поддерживаемый указанным массивом.

Чтобы создать список с гибким размером, вы можете использовать:

List<Byte> myList = new ArrayList<> (B.length);
Collections.addAll(myList, B);

что более эффективно (создание только одного объекта), чем и так же читабельно, как:

List<Byte> myList = new ArrayList<> (Arrays.asList(B));
person assylias    schedule 30.07.2013
comment
Как создать список, который можно изменить? У меня есть массив Byte[] B = new Byte[]; - person Ryainad; 30.07.2013
comment
Нужно ли заключать ‹Byte› в скобки? List‹Byte› myList = new ArrayList‹BYTE› (Arrays.asList(B)); - person Ryainad; 30.07.2013
comment
Да с Java 6, нет с Java 7 и выше. - person assylias; 30.07.2013

List<Byte> myList = Arrays.asList(B);

возвращает список фиксированного размера, который нельзя изменить.

person prasanth    schedule 30.07.2013
comment
Как создать список, который можно изменить? - person Ryainad; 30.07.2013
comment
У меня есть массив Byte[] B = new Byte[]; - person Ryainad; 30.07.2013
comment
List‹Byte› myList = new ArrayList‹›(Arrays.asList(B)); - person prasanth; 30.07.2013
comment
Спасибо! Не могли бы вы сказать мне, нужно ли ставить «Байт» в скобки? List‹Byte› myList = new ArrayList‹BYTE› (Arrays.asList(B)); - person Ryainad; 30.07.2013
comment
Это зависит от вашего уровня JDK. Если вы используете JDK ниже 1.7, обязательно используйте тип в операторе «DIAMOND». - person prasanth; 30.07.2013
comment
Хорошо, спасибо, это показывает мне ошибку, поэтому мне нужно использовать ‹Byte› - person Ryainad; 30.07.2013

Arrays.asList возвращает Arrays.ArrayList, который является статическим внутренним классом и не переопределяет операцию удаления AbstractList и операция удаления по умолчанию из AbstractList выдает UnsupportedOperationException.

Найдите код openjdk для Arrays.ArrayList.

person Subhrajyoti Majumder    schedule 30.07.2013
comment
У меня есть массив Byte[] B = new Byte[]; Мне нужно преобразовать его в список. Как создать список, который можно изменить? - person Ryainad; 30.07.2013
comment
List‹Byte› myList = new ArrayList‹›(Arrays.asList(B)); - person prasanth; 30.07.2013
comment
Нужно ли заключать ‹Byte› в скобки? List‹Byte› myList = new ArrayList‹BYTE› (Arrays.asList(B)); - person Ryainad; 30.07.2013