`
woshixushigang
  • 浏览: 578000 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Arrays.asList详解

 
阅读更多

记得以前写过一段这样的代码:

String[] arr={"a","b","c"};
List l 
= Arrays.asList(arr);
l.add(
"d");

 自以为没有错误,结果运行下来就让系统crash掉了,后来仔细的看了下源代码,发现asList不是我想象的那么简单,1.4.2中的asList代码如下:

public static List asList(Object[] a) {
    
return new ArrayList(a);
    }


    
/**
     * 
@serial include
     
*/

    
private static class ArrayList extends AbstractList
               
implements RandomAccess, java.io.Serializable
    
{
        
private static final long serialVersionUID = -2764017481108945198L;
    
private Object[] a;

    ArrayList(Object[] array) 
{
            
if (array==null)
                
throw new NullPointerException();
        a 
= array;
    }


    
public int size() {
        
return a.length;
    }


    
public Object[] toArray() {
        
return (Object[]) a.clone();
    }


    
public Object get(int index) {
        
return a[index];
    }


    
public Object set(int index, Object element) {
        Object oldValue 
= a[index];
        a[index] 
= element;
        
return oldValue;
    }


        
public int indexOf(Object o) {
            
if (o==null{
                
for (int i=0; i<a.length; i++)
                    
if (a[i]==null)
                        
return i;
            }
 else {
                
for (int i=0; i<a.length; i++)
                    
if (o.equals(a[i]))
                        
return i;
            }

            
return -1;
        }


        
public boolean contains(Object o) {
            
return indexOf(o) != -1;
        }

    }

这个ArrayList是Arrays的内部类,可不要看成是java.util.ArrayList,从方法来看只是一个只读的数组,并没有扩展add等添加的方法,那么我刚才调用的add实际上是AbstractList中的add方法,代码一目了然了

 public void add(int index, Object element) {
    
throw new UnsupportedOperationException();
    }

所以只能新建一个list来保存asList的返回结果,如果想做插入的话。

转自:http://www.cnblogs.com/hashmap/articles/2162444.html

分享到:
评论

相关推荐

    Java中Arrays.asList()方法详解及实例

    Java中Arrays.asList()方法详解及实例 Arrays.asList()方法是Java中一个常用的方法,它将数组转换为列表。该方法的签名为`public static &lt;T&gt; List&lt;T&gt; asList(T... a)`,它可以接受变长参数,通常情况下是一个数组...

    java 源码分析Arrays.asList方法详解

    Java中的`Arrays.asList()`方法是Java集合框架的一部分,它允许我们将数组或变长参数转换为一个固定大小的`List`对象。这个方法在处理数组与集合之间的转换时非常有用,尤其是当你需要使用集合API操作数组时。下面...

    10个Java经典的List面试题

    List 可以使用 toArray() 方法转换为 Array,Array 可以使用 Arrays.asList() 方法转换为 List,由于 Arrays.asList() 方法返回的是固定的 List,可以使用 new ArrayList(Arrays.asList(array)) 方法来创建一个可扩...

    Java 8的新特性—终极版

    ### Java 8的新特性详解 #### 一、概述 Java 8作为自Java 5以来最重要的版本更新之一,带来了诸多革新之处。它不仅在语言层面引入了许多改进,还在编译器、库、工具以及JVM等方面实现了显著的增强。本文旨在全面地...

    详解Java如何在Array和List之间进行转换.rar

    Java标准库中的Arrays类提供了一个asList()方法,可以将数组直接转换为ArrayList类型的List。例如: ```java Integer[] array = {1, 2, 3, 4, 5}; List&lt;Integer&gt; list = Arrays.asList(array); ``` 需要注意的是,...

    25个经典Spark算子的JAVA实现

    List&lt;List&lt;Integer&gt;&gt; nestedNumbers = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4, 5)); JavaRDD&lt;List&lt;Integer&gt;&gt; nestedNumbersRDD = sc.parallelize(nestedNumbers); JavaRDD&lt;Integer&gt; flatNumbersRDD...

    java8新特性

    ### Java 8 新特性详解 #### Lambda 表达式 Lambda 表达式的引入极大地简化了Java中的函数式编程,使得代码更为简洁易懂。它允许我们以匿名函数的形式定义和传递行为,这对于实现诸如回调函数等场景尤其有用。 **...

    详解Java 集合类 List 的那些坑

    Arrays.asList 方法返回的 List 并不是我们常用的 java.util.ArrayList,而是 Arrays 的静态内部类 java.util.Arrays.ArrayList,该类继承自抽象类 java.util.AbstractList,但没有实现 add 方法,默认抛出 java....

    Java数组十种操作方法-扣丁学堂.doc

    ### Java数组十种操作方法详解 #### 一、数组的基本定义与初始化 1. **动态定义数组**:可以通过指定数组的长度来动态定义一个数组,例如: ```java String[] aArray = new String[5]; ``` 这里定义了一个长度...

    Java中Arrays类详解.docx

    - `asList()`:将数组转换为`ArrayList`,这样就可以使用集合框架的方法。 总的来说,`Arrays`类极大地简化了对数组的操作,提供了丰富的功能,包括输出、排序、复制和比较。在日常开发中,我们应充分利用这些工具...

    【Java8】Lambda表达式 和 Stream API 详解笔记.zip

    List&lt;Integer&gt; numbers = Arrays.asList(5, 2, 8, 1, 9); Collections.sort(numbers, (a, b) -&gt; a - b); // 升序排序 ``` Lambda表达式的关键在于它能够使代码更简洁,同时保持清晰的逻辑。在上述例子中,我们传递...

    数组与List之间相互转换的方法详解

    但是,对于基本类型的数组,`Arrays.asList()`会将整个数组作为一个元素放入List,而不是将数组的每个元素分别添加。例如: ```java int[] a1 = new int[]{1, 2, 3}; String[] a2 = new String[]{"a", "b", "c"}...

    Java 数组详解及示例代码

    可以通过`Arrays.asList()`将数组转换为ArrayList,然后创建新的ArrayList对象:`ArrayList&lt;String&gt; arrayList = new ArrayList(Arrays.asList(stringArray));` 4. **检查数组是否包含某个值** 使用`Arrays....

    阿里开发规范(集合与并发处理)

    **说明**:`Arrays.asList` 返回的对象实际上是 `java.util.Arrays$ArrayList` 类型,这个类并没有实现集合的修改方法。`Arrays.asList` 实现了适配器模式,它只提供了集合的接口,但底层数据仍然是数组。 **示例**...

    JAVA十大新性详解.doc

    ### JAVA8十大新特性详解 #### 一、接口的默认方法 Java 8 引入了一个重要的特性,即允许在接口中定义有具体实现的方法,这些方法被称为**默认方法**。默认方法通过`default`关键字定义,使得接口能够提供一些默认...

    Java多维数组和Arrays类方法总结详解

    Java多维数组和Arrays类方法总结详解 Java多维数组是指数组的元素也是数组,例如二维数组、三维数组等。Java中可以声明多维数组的方式有多种,下面我们将详细介绍。 一、数组的三种声明方式 Java中数组的声明方式...

    JDK 1.8 API文档

    **JDK 1.8 API文档详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包。JDK 1.8是Java语言的一个重要版本,它引入了许多创新特性,极大地提升了开发效率和程序性能。本文...

    java list,set,map,数组间的相互转换详解

    List&lt;Integer&gt; tempList = Arrays.asList(Arrays.stream(a).boxed().toArray(Integer[]::new)); Set&lt;Integer&gt; set = new HashSet(tempList); ``` 5. **Map的相关操作** - **获取所有值**:使用`map.values()`...

    jdk8新特性.md

    ### JDK 8 新特性详解 #### 1. 前言 随着技术的不断发展与进步,JDK 1.8 的推出带来了许多重要的更新与改进,不仅极大地提升了开发效率,也使得 Java 语言更加现代化。Spring 5 和 Spring Boot 2.0 都推荐使用 JDK...

Global site tag (gtag.js) - Google Analytics