先确定几个概念,这里说的数组元素,除基本类型数组外,并非指元素对象本身,而是它们的引用。换句话说,基本数组的元素是数值本身,非基本数组的元素都是一个地址(对应指针)。

1.collection的元素不能是基本类型

首先,各种collectioin容器的元素都只能是继承了Object类的对象,所以不能是8种基本类型。如果要放入基本类型,必需要用它们对应的包装器进行包装。

关于基本类型与包装类的区别:基本类型是储存在堆栈中的,这一点和C++的非new基本类型一样(c++所有非new对象都是在堆栈中的),也和C#的值类型一样;包装类是储存在栈中的,和c++中new出来的对象以及C#中的引用类型一样;

在调用Arrays的静态方法asList(<T>[])时,T是根据collection声明时的泛型参数确定的,所以不仅collection的泛型参数不能是基本类型,传入的数组也不能是基本类型,如下面这样,编译时就会报错:

 import java.util.*;
public class TestArray2List{ public static void main(String[] args){
inte[] valueTypeArray={2,3,4,5,6};
List<Integer> valueTypeList=new ArrayList<Integer>();
valueTypeList.addAll(Arrays.asList(valueTypeArray));
System.out.println("valueTypeList:\n");
for(int value:valueTypeList){
System.out.println(value); } } }

错误信息:

.\TestArray2List.java:7: 错误: 对于addAll(List<int[]>), 找不到合适的方法
valueTypeList.addAll(Arrays.asList(valueTypeArray));
^
方法 Collection.addAll(Collection<? extends Integer>)不适用
(参数不匹配; 推断类型不符合上限
推断: int[]
上限: Integer,Object)
方法 List.addAll(Collection<? extends Integer>)不适用
(参数不匹配; 推断类型不符合上限
推断: int[]
上限: Integer,Object)

2.Arrays.asList()是对数组元素(复制指针)的复制

再次强调,非基本类型数组元素只是一个指针。因为collection的类型只能是非基本类型,所以collectioin存的都是指针。当用Arrays.asList(),把一个Array转为一个List<T>时,是把所有的指针复制一遍,比如下面的,更改原数组的值(指针指向一个新对向)时,List<T>的值不变,所以再次都是输出1:

import java.util.*;
public class TestArray2List{ public static void main(String[] args){
Integer[] valueTypeArray={1,2,3,4,5,6};
List<Integer> valueTypeList=new ArrayList<Integer>();
valueTypeList.addAll(Arrays.asList(valueTypeArray));
System.out.println("valueTypeList[0]:");
System.out.println(valueTypeList.get(0)); valueTypeArray[0]=new Integer(99);
System.out.println(valueTypeList.get(0)); } }

输出:

1
1

3.Arrays.asList()具体的对象值不会复制

上面已经提到了,asList()是对指针的复制,List<T>和Array是两个指针序列,对应的元素指向相同的对象,比如下面这样,Array的每个元素是一个指向int数组的二级指针,List<T>的每个元素也是二级指针,它们对应的元素指向同一个int[](一个int数据序列)。因为指向同一个对象,所以对象的内容发生变化时,List<T>和原Array都会变化。

import java.util.*;
public class TestArray2List{ public static void main(String[] args){
int[][] valueTypeArray={{1,2},{3,4},{5,6}};
List<int[]> valueTypeList=new ArrayList<int[]>();
valueTypeList.addAll(Arrays.asList(valueTypeArray));
System.out.println("valueTypeList[0]:");
System.out.println(valueTypeList.get(0)[0]); valueTypeArray[0][0]=99;
System.out.println(valueTypeList.get(0)[0]); } }

输出:

1
99

java collection与数组(Array)互转的更多相关文章

  1. java 集合与数组的互转方法,与源码分析

    前言 java数组与集合需要互相转换的场景非常多,但是运用不好还是容易抛出UnSupportedOperationException.下面讲解一下互转的方法,以及结合源码分异常产生的原因 集合转数组 ...

  2. Java基础:数组Array转成List的几种方法

    在编写Java程序中,经常要用的一个转换就是数组和List对象之间的互转. 最简单的方法就是遍历 数组,然后将数组元素依次添加进list中. 此方法略,虽然方法很简单,但总感觉这样的方法有点笨 第二种 ...

  3. 固定分隔符字符串与数组互转及ArrayList与数组(Array)互转

    1.字符串转数组 这个相信多数人都会常用,string.split方法,分隔符可以为多个.详细信息参见MSDN string[] actionCfgs = _para.Split(new char[] ...

  4. JAVA中数组Array与List互转

    List<String> list = new ArrayList<String>();String[] array = new String[10]; 1.数组转成Listl ...

  5. Java-杂项:Java数组Array和集合List、Set、Map

    ylbtech-Java-杂项:Java数组Array和集合List.Set.Map 1.返回顶部 1. 之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊 ...

  6. Java反射04 : 通过Array动态创建和访问Java数组

    java.lang.reflect.Array类提供了通过静态方法来动态创建和访问Java数组的操作. 本文转载自:https://blog.csdn.net/hanchao5272/article/ ...

  7. 【Java】数组Array

    Java基础复习之:数组 简介 数组(Array):多个相同数据类型按照一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理 一维数组 一维数组的声明与初始化 int[] id ...

  8. Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别

    ArrayList和Vector的区别ArrayList与Vector主要从二方面来说.  一.同步性:   Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...

  9. Java基础——数组Array

    一.数组基本概念 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组有三 ...

随机推荐

  1. MVC5中 在更新 Microsoft.Aspnet.Identity 后编译器错误

    环境:vs2013预览版chs,我试着创建vb.net web应用,从对话框中选择MVC和WebAPI.编译ok了.通过NuGet管理器更新了Microsoft.Aspnet.Identity.Cor ...

  2. 关于eWebEditorAPI

    1.获取HTML document.getElementById(Iframe的名称).contentWindow.getHTML();在线API http://www.ewebeditor.net/ ...

  3. c++内存模型------计算机系统核心概念及软硬件实现

    c++编程语言有3中不同类项的变量:全局变量.局部变量和动态分配变量.变量的值存储在计算机的内存中,但是变量存储的方式取决于变量的类项.3种类型的变量分别对应存储器中3个特定的区域: 全局变量存放在存 ...

  4. 我的java问题排查工具单

    前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常 ...

  5. Java面向对象之关键字final 入门实例

    一.基础概念 1.关键字final可以修饰类.函数.变量. 2.关键字final修饰的类不可以被继承. 3.关键字final修饰的方法不可以被覆盖. 4.关键字final修饰的变量是一个常量,只能被赋 ...

  6. vmware vSphere虚拟网络(一)

    为了更好的了解vSphere网络虚拟化解决方案,这里引入了一些概念,以便我们更好的了解虚拟网络. 一.网卡: 物理网卡称为vmnic,在ESXi中,第一块物理网卡叫做vmnic0,第二块叫做vmnic ...

  7. Android Gradle 隐形依赖的奇怪案例

    相信 Android 开发者都有在 Android Studio 中升级 compileSdkVersion 的经历,这个时候如果你使用了 support 包,并同时升级,那么可能会出现一个错误提示. ...

  8. 树状数组【洛谷P3586】 [POI2015]LOG

    P3586 [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1 ...

  9. .NET Core 版本不支持的问题

    分析一个.NET Core开源项目(Ocelot),打开后发现提示当前版本.NET Core 不支持. 错误信息如下: The current .NET SDK does not support ta ...

  10. 学习TypeScript,笔记一:TypeScript的简介与数据类型

    该文章用于督促自己学习TypeScript,作为学笔记进行保存,如果有错误的地方欢迎指正 2019-03-27  16:50:03 一.什么是TypeScript? TypeScript是javasc ...