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

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

最新文章

  1. 第九回 Microsoft.Practices.Unity.Interception实现基于数据集的缓存(针对六,七,八讲的具体概念和配置的解说)
  2. Swift学习二
  3. 利用LruCache为GridView加载大量本地图片完整示例
  4. JAVA监听器原理
  5. Python: 如何继承str/string?
  6. lambda 表达式
  7. 用 C# 在 Windows 7 中写注册表想到的
  8. datagridview添加复选框全选和取消
  9. Jquery插件模版
  10. sql 关于dblink和多条update、insert事务回滚写法
  11. 原生js 基于canvas写一个简单的前端 截图工具
  12. (转)hibernate 之hiberante.hbm2ddl.auto 参数的配置
  13. WebAPI和WebService的区别
  14. Mac 10.12使用free命令(fish)
  15. 解决方案,org.hibernate.LazyInitializationException: could not initialize proxy - no Session
  16. PHP导出excel时数字变为科学计数的解决方法
  17. day 68crm(5) 分页器的进一步优化,以及在stark上使用分页器,,以及,整理代码,以及stark组件search查询
  18. springmvc处理日期格式
  19. 『转』三星推出Android智能手表Galaxy Gear
  20. 160606、springmvc中使用Spring Mobile

热门文章

  1. DDD模式
  2. (一)springmvc+spring+mybatis+maven框架搭建
  3. hive的安装与配置 mysql安装 启动
  4. C语言条件编译(#if,#ifdef,#ifndef,#endif,#else,#elif)
  5. 你必须知道的----C语言笔试面试中经典易错的一些知识点(持续更新)
  6. php中的静态方法实例理解
  7. 在makefile通过宏定义来控制源程序的编译
  8. JS 为任意元素添加任意事件的兼容代码
  9. 斐讯 N1 刷 Armbian 5.64
  10. 网络编程之socket(TCP,UDP)