think in java容器深入研究(未获取支持的操作)
2013-07-21 22:24
591 查看
分析一个简单的代码
在main方法中test("Modifiable Copy", new ArrayList<String>(list));这行代码执行没有任何问题。
test("Arrays.asList()", list);代码在执行后,抛出了一堆的异常"java.lang.UnsupportedOperationException”。
分析结果:
List<String> list = Arrays.asList("A B C D E F G H I J K L".split(" "));
这行代码通过Arrays.asList生成Stirng[]数组,数组固定的长度,不允许对数组进行增加、删除、等操作。
这行代码test("Modifiable Copy", new ArrayList<String>(list));,将生成的数组,采用ArrayList容器进行封装,经查询源码ArrayList类继承AbstractList并实现List接口,并可以进行增加、删除、等操作。
查看AbstractList源码会发现,如果单单继承AbstractList但未重写add方法,则会抛出UnsupportedOperationException异常。
package containers; //: containers/Unsupported.java // Unsupported operations in Java containers. import java.util.*; public class Unsupported { static void test(String msg, List<String> list) { System.out.println("--- " + msg + " ---"); Collection<String> c = list; Collection<String> subList = list.subList(1,8); // Copy of the sublist: Collection<String> c2 = new ArrayList<String>(subList); try { c.retainAll(c2); } catch(Exception e) { System.out.println("retainAll(): " + e); } try { c.removeAll(c2); } catch(Exception e) { System.out.println("removeAll(): " + e); } try { c.clear(); } catch(Exception e) { System.out.println("clear(): " + e); } try { c.add("X"); } catch(Exception e) { System.out.println("add(): " + e); } try { c.addAll(c2); } catch(Exception e) { System.out.println("addAll(): " + e); } try { c.remove("C"); } catch(Exception e) { System.out.println("remove(): " + e); } } public static void main(String[] args) { List<String> list = Arrays.asList("A B C D E F G H I J K L".split(" ")); test("Modifiable Copy", new ArrayList<String>(list)); test("Arrays.asList()", list); } } /* Output: --- Modifiable Copy --- --- Arrays.asList() --- retainAll(): java.lang.UnsupportedOperationException removeAll(): java.lang.UnsupportedOperationException clear(): java.lang.UnsupportedOperationException add(): java.lang.UnsupportedOperationException addAll(): java.lang.UnsupportedOperationException remove(): java.lang.UnsupportedOperationException *///:~
在main方法中test("Modifiable Copy", new ArrayList<String>(list));这行代码执行没有任何问题。
test("Arrays.asList()", list);代码在执行后,抛出了一堆的异常"java.lang.UnsupportedOperationException”。
分析结果:
List<String> list = Arrays.asList("A B C D E F G H I J K L".split(" "));
这行代码通过Arrays.asList生成Stirng[]数组,数组固定的长度,不允许对数组进行增加、删除、等操作。
这行代码test("Modifiable Copy", new ArrayList<String>(list));,将生成的数组,采用ArrayList容器进行封装,经查询源码ArrayList类继承AbstractList并实现List接口,并可以进行增加、删除、等操作。
public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable
查看AbstractList源码会发现,如果单单继承AbstractList但未重写add方法,则会抛出UnsupportedOperationException异常。
public abstract class AbstractList extends AbstractCollection implements List { /** * Sole constructor. (For invocation by subclass constructors, typically * implicit.) */ protected AbstractList() { } public void add(int index, Object element) { throw new UnsupportedOperationException(); }
相关文章推荐
- 《Think in Java》(十七)容器深入研究
- think-in-java(17)容器深入研究
- think in java 笔记 Chart17 容器的深入研究
- 《Thinking in Java》十七章_容器深入研究_练习12(Page484)
- 《Thinkinginjava》第17章-容器深入研究
- 《Thinking in Java》十七章_容器深入研究_练习12(Page484)
- thingking in Java 容器深入研究
- 再读thinking in java -- 第十七章 容器深入研究(一)
- 再读thinking in java -- 第十七章 容器深入研究(二)
- 《Thinking in Java》十七章_容器深入研究_练习13(Page484)
- ThinkJava-容器深入研究
- 《Thinking in Java》十七章_容器深入研究_练习13(Page484)
- Thinking in Java——第十七章-容器的深入研究之HashMap篇
- Java IO操作——System类对IO的支持(System.out、System.err、System.in)
- Think in java--工具类--获取类中方法
- Thinking in Java 第17章 容器深入研究(17.1-17.7)
- <<Think in Java 4 >>中关于使用XOM操作xml文件
- 《Java 编程思想》--第十七章:容器深入研究
- 深入java--容器深入研究