Подтвердить что ты не робот

UnsupportedOperationException в коллекции

Изучая API Collection, мы обнаруживаем, что некоторые методы (add, remove,...) могут вызывать java.lang.UnsupportedOperationException, если текущая реализация коллекции не поддерживает эти функции.

Существует ли в JDK конкретный Collection, который не поддерживает эти методы?

Большое спасибо за ваши ответы.

4b9b3361

Ответ 1

Очевидными примерами являются реализации, возвращаемые, скажем, Collections.unmodifiableCollection() и другие подобные методы. Методы, которые изменяют значение Collection, вызывают это исключение.

Ответ 2

Помимо коллекций, возвращаемых методами Collections.unmodifiable*, есть еще несколько интересных случаев, когда UnsupportedOperationException фактически выбрасывается:

  • представления коллекции Map, доступ через entrySet(), keySet() и values() могут удалять элементы, но не добавлять,
  • в представлении списка, возвращенном Arrays.asList, могут быть добавлены и не удалены элементы,
  • Кроме того, объекты, полученные из методов Collections.empty* и Collections.singleton*, также отмечены как "неизменяемые", поэтому - хотя это явно не указано в документах API - я полагаю, они также вызывают исключение при попытках измените их.

Ответ 3

Обычно, когда вы создаете список вроде List<String> sample=Collections.emptyList();. Список sample будет создан как Collections.unmodifiableCollection().

  • Таким образом, образец списка не поддерживает операции динамического списка. Вы можете назначить другой список только этому списку с помощью оператора присваивания. Eg >

    List<String> ls=new ArrayList<String>();
    ls.add("one");
    ls.add("Three");
    ls.add("two");
    ls.add("four"); 
    sample = ls;
    
  • Для операций с динамическим списком вы должны иметь синтаксис типа    List<String> sample= new ArrayList<String>();. В этом списке вы можете выполнить sample.add(), sample.addAll() и т.д.

Ответ 4

Да. Например, когда вы вызываете Collections.unmodifiableList(list), возвращенный список не поддерживает add(..)

Эти коллекции, однако, являются в основном частными классами, которые не подвергаются API, поэтому вы не можете их создавать.