》 Arrays.asList(T … a)方法的使用

》UnsupportedOperationException分析

 

 

  • Arrays.asList(T … a)方法的使用

  1. package cn.itcast.day24.varparam;
  2.  
  3. import java.util.Arrays;
  4. import java.util.List;
  5.  
  6. /**
  7. *
  8. * public static <T> List<T> asList(T... a):把数组转为集合
  9. *
  10. * 注意:
  11. * 转成的集合本质还是数组,长度是固定的,所以转换完成得到的集合,不能增删(会改变数组长度),只能修改。
  12. *
  13. */
  14. public class AsListDemo {
  15. public static void main(String[] args) {
  16. //定义一个数组
  17. // String[] arrStr={"林青霞","武松","猪八戒"};
  18. // List<String> list=Arrays.asList(arrStr);
  19.  
  20. List<String> list=Arrays.asList("java","world","hello");
  21. //UnsupportedOperationException
  22. list.add("javaee");//错误
  23. // list.remove(1);//错误
  24. list.set(1, "javaee");//修改成功
  25.  
  26. // for(String s:list){
  27. // System.out.println(s);
  28. // }
  29. }
  30.  
  31. }

  • UnsupportedOperationException分析

可以看到Arrays的私有内部类Arrays$ArrayList中,没有实现来自父类AbstractList的add(),remove()等长度相关的方法,

所以抛出 UnsupportedOperationException,意思是:不支持请求的操作(当然不支持)

  1. private static class ArrayList<E> extends AbstractList<E>
  2. implements RandomAccess, java.io.Serializable
  3. {
  4. private static final long serialVersionUID = -2764017481108945198L;
  5. private final E[] a;
  6.  
  7. ArrayList(E[] array) {
  8. if (array==null)
  9. throw new NullPointerException();
  10. a = array;
  11. }
  12.  
  13. public int size() {
  14. return a.length;
  15. }
  16.  
  17. public Object[] toArray() {
  18. return a.clone();
  19. }
  20.  
  21. public <T> T[] toArray(T[] a) {
  22. int size = size();
  23. if (a.length < size)
  24. return Arrays.copyOf(this.a, size,
  25. (Class<? extends T[]>) a.getClass());
  26. System.arraycopy(this.a, 0, a, 0, size);
  27. if (a.length > size)
  28. a[size] = null;
  29. return a;
  30. }
  31.  
  32. public E get(int index) {
  33. return a[index];
  34. }
  35.  
  36. //重写了父类AbstractList的set方法,所以set时没有抛出异常.而add和remove方法来自基类,所以都抛出了异常。
  1. public E set(int index, E element) {
  2. E oldValue = a[index];
  3. a[index] = element;
  4. return oldValue;
  5. }
  6.  
  7. public int indexOf(Object o) {
  8. if (o==null) {
  9. for (int i=0; i<a.length; i++)
  10. if (a[i]==null)
  11. return i;
  12. } else {
  13. for (int i=0; i<a.length; i++)
  14. if (o.equals(a[i]))
  15. return i;
  16. }
  17. return -1;
  18. }
  19.  
  20. public boolean contains(Object o) {
  21. return indexOf(o) != -1;
  22. }
  23. }

 

  1. AbstractList源码:
  1. package java.util;
  2. public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
  3. public E set(int index, E element) {
  4. throw new UnsupportedOperationException();
  5. }
  6.  
  7. public boolean add(E e) {
  8. add(size(), e);
  9. return true;
  10. }
  11.  
  12. public void add(int index, E element) {
  13. throw new UnsupportedOperationException();
  14. }
  15.  
  16. public E remove(int index) {
  17. throw new UnsupportedOperationException();
  18. }
  19.  
  20. public void clear() {
  21. removeRange(0, size());
  22. }
  23.  
  24. public E set(int index, E element) {
  25. throw new UnsupportedOperationException();
  26. }
  27.  
  28. abstract public E get(int index);
  29. }

JDK5 新特性之 可变参数的方法(2)---asList的更多相关文章

  1. JDK5新特性之 可变参数的方法

    可变参数的方法:不知道这个方法该定义多少个参数 注意: > 参数实际上是数组 > 必须写在参数列表最后一个 package cn.itcast.day24.varparam; import ...

  2. JDK5新特性:可变参数方法

    JDK1.5增加可变参方法,其定义格式为: 访问修饰符 返回值类型 方法标识符(参数类型 参数标识符1,参数类型 参数标识符2,参数类型...参数标识符){} 如可能要定义一个求和功能的方法,但求和的 ...

  3. jdk1.5新特性之------->可变参数

    /* jdk1.5新特性之------->可变参数 需求: 定义一个函数做加法功能(函数做几个数据 的加法功能是不确定). 可变参数的格式: 数据类型... 变量名 可变参数要 注意的细节: 1 ...

  4. C++11新特性之五——可变参数模板

    有些时候,我们定义一个函数,可能这个函数需要支持可变长参数,也就是说调用者可以传入任意个数的参数.比如C函数printf(). 我们可以这么调用. printf(); 那么这个函数是怎么实现的呢?其实 ...

  5. 集合框架-工具类-JDK5.0特性-函数可变参数

    1 package cn.itcast.p4.news.demo; 2 3 public class ParamterDemo { 4 5 public static void main(String ...

  6. JDK5的新特性之可变参数&Arrays.asList()方法

    [代码] package com.hxl; import java.util.Arrays; import java.util.List; public class Test { public sta ...

  7. java新特性之可变参数

    public class NewDemo01 {     public static void main(String[] args) {         System.out.print(" ...

  8. day27<反射&JDK5新特性>

    反射(类的加载概述和加载时机) 反射(类加载器的概述和分类) 反射(反射概述) 反射(Class.forName()读取配置文件举例) 反射(通过反射获取带参构造方法并使用) 反射(通过反射获取成员变 ...

  9. Java API —— JDK5新特性

    JDK5新特性         自动拆装箱.泛型.增强for.静态导入.可变参数.枚举   1.增强for概述         1)简化数组和Collection集合的遍历         2)格式: ...

随机推荐

  1. javascript 创建对象方式

    本文主要是对<JavaScript高级程序设计>第六章(面向对象的程序设计)的总结,书上的这章至少看了4遍是有的.该章主要讲对象的创建与继承.其中创建对象和继承方式至少6种,再加上一些方法 ...

  2. 分布式理论(一) —— CAP 定理

    目录: 什么是 CAP 定理 为什么只能 3 选 2 能不能解决 3 选 2 的问题 引用 1. 什么是 CAP 定理 2000 年的时候,Eric Brewer 教授提出了 CAP 猜想,2年后,被 ...

  3. Webhook是什么、怎么理解

    Webhook是什么 我们想看看维基老大的解说: A webhook in web development is a method of augmenting or altering the beha ...

  4. Entity framework 6.0 简明教程 ef6

    http://www.entityframeworktutorial.net/code-first/entity-framework-code-first.aspx Ef好的教程 Entity Fra ...

  5. 乐字节-Java8新特性-接口默认方法之Stream流(下)

    接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...

  6. SpringBoot+SpringData 整合入门

    SpringData概述 SpringData :Spring的一个子项目.用于简化数据库访问,支持NoSQL和关系数据存储.其主要目标是使用数据库的访问变得方便快捷. SpringData 项目所支 ...

  7. 面向对象设计模式_享元模式(Flyweight Pattern)解读

    场景:程序需要不断创建大量相似的细粒度对象,会造成严重的内存负载.我们可以选择享元模式解决该问题. 享元抽象:Flyweight 描述享元的抽象结构.它包含内蕴和外蕴部分(别被术语迷惑,这是一种比较深 ...

  8. 【 js 性能优化】【源码学习】underscore throttle 与 debounce 节流

    在看 underscore.js 源码的时候,接触到了这样两个方法,很有意思: 我先把实现的代码撂在下面,看不懂的可以先跳过,但是跳过可不是永远跳过哦- 一个是 throttle: _.throttl ...

  9. Django Rest framework 之 视图

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  10. JS 获取css transform中的值

    可以参考这位博主的文章https://www.cnblogs.com/zhenwoo/p/4993780.html 不想看直接想看怎么解决的看这: var translates= document.d ...