记得以前写过一段这样的代码:
String[]arr={"a","b","c"};
Listl=Arrays.asList(arr);
l.add("d");
自以为没有错误,结果运行下来就让系统crash掉了,后来仔细的看了下源代码,发现asList不是我想象的那么简单,1.4.2中的asList代码如下:
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private Object[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
public int size() {
return a.length;
}
public Object[] toArray() {
return (Object[])a.clone();
}
public E get(int index) {
return (E)a[index];
}
public E set(int index, E element) {
Object oldValue = a[index];
a[index] = element;
return (E)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的返回结果,如果想做插入的话。
分享到:
相关推荐
Java中Arrays.asList()方法详解及实例 Arrays.asList()方法是Java中一个常用的方法,它将数组转换为列表。该方法的签名为`public static <T> List<T> asList(T... a)`,它可以接受变长参数,通常情况下是一个数组...
Java中的`Arrays.asList()`方法是Java集合框架的一部分,它允许我们将数组或变长参数转换为一个固定大小的`List`对象。这个方法在处理数组与集合之间的转换时非常有用,尤其是当你需要使用集合API操作数组时。下面...
List 可以使用 toArray() 方法转换为 Array,Array 可以使用 Arrays.asList() 方法转换为 List,由于 Arrays.asList() 方法返回的是固定的 List,可以使用 new ArrayList(Arrays.asList(array)) 方法来创建一个可扩...
### Java 8的新特性详解 #### 一、概述 Java 8作为自Java 5以来最重要的版本更新之一,带来了诸多革新之处。它不仅在语言层面引入了许多改进,还在编译器、库、工具以及JVM等方面实现了显著的增强。本文旨在全面地...
Java标准库中的Arrays类提供了一个asList()方法,可以将数组直接转换为ArrayList类型的List。例如: ```java Integer[] array = {1, 2, 3, 4, 5}; List<Integer> list = Arrays.asList(array); ``` 需要注意的是,...
List<List<Integer>> nestedNumbers = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4, 5)); JavaRDD<List<Integer>> nestedNumbersRDD = sc.parallelize(nestedNumbers); JavaRDD<Integer> flatNumbersRDD...
### Java 8 新特性详解 #### Lambda 表达式 Lambda 表达式的引入极大地简化了Java中的函数式编程,使得代码更为简洁易懂。它允许我们以匿名函数的形式定义和传递行为,这对于实现诸如回调函数等场景尤其有用。 **...
Arrays.asList 方法返回的 List 并不是我们常用的 java.util.ArrayList,而是 Arrays 的静态内部类 java.util.Arrays.ArrayList,该类继承自抽象类 java.util.AbstractList,但没有实现 add 方法,默认抛出 java....
### Java数组十种操作方法详解 #### 一、数组的基本定义与初始化 1. **动态定义数组**:可以通过指定数组的长度来动态定义一个数组,例如: ```java String[] aArray = new String[5]; ``` 这里定义了一个长度...
- `asList()`:将数组转换为`ArrayList`,这样就可以使用集合框架的方法。 总的来说,`Arrays`类极大地简化了对数组的操作,提供了丰富的功能,包括输出、排序、复制和比较。在日常开发中,我们应充分利用这些工具...
List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9); Collections.sort(numbers, (a, b) -> a - b); // 升序排序 ``` Lambda表达式的关键在于它能够使代码更简洁,同时保持清晰的逻辑。在上述例子中,我们传递...
但是,对于基本类型的数组,`Arrays.asList()`会将整个数组作为一个元素放入List,而不是将数组的每个元素分别添加。例如: ```java int[] a1 = new int[]{1, 2, 3}; String[] a2 = new String[]{"a", "b", "c"}...
可以通过`Arrays.asList()`将数组转换为ArrayList,然后创建新的ArrayList对象:`ArrayList<String> arrayList = new ArrayList(Arrays.asList(stringArray));` 4. **检查数组是否包含某个值** 使用`Arrays....
**说明**:`Arrays.asList` 返回的对象实际上是 `java.util.Arrays$ArrayList` 类型,这个类并没有实现集合的修改方法。`Arrays.asList` 实现了适配器模式,它只提供了集合的接口,但底层数据仍然是数组。 **示例**...
### JAVA8十大新特性详解 #### 一、接口的默认方法 Java 8 引入了一个重要的特性,即允许在接口中定义有具体实现的方法,这些方法被称为**默认方法**。默认方法通过`default`关键字定义,使得接口能够提供一些默认...
Java多维数组和Arrays类方法总结详解 Java多维数组是指数组的元素也是数组,例如二维数组、三维数组等。Java中可以声明多维数组的方式有多种,下面我们将详细介绍。 一、数组的三种声明方式 Java中数组的声明方式...
**JDK 1.8 API文档详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包。JDK 1.8是Java语言的一个重要版本,它引入了许多创新特性,极大地提升了开发效率和程序性能。本文...
List<Integer> tempList = Arrays.asList(Arrays.stream(a).boxed().toArray(Integer[]::new)); Set<Integer> set = new HashSet(tempList); ``` 5. **Map的相关操作** - **获取所有值**:使用`map.values()`...
### JDK 8 新特性详解 #### 1. 前言 随着技术的不断发展与进步,JDK 1.8 的推出带来了许多重要的更新与改进,不仅极大地提升了开发效率,也使得 Java 语言更加现代化。Spring 5 和 Spring Boot 2.0 都推荐使用 JDK...