think in java容器深入研究(未获取支持的操作)

分析一个简单的代码

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();
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值