java arraycollection_java collection与数组(Array)互转

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

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

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

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

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

1 import java.util.*;2 public classTestArray2List{3

4 public static voidmain(String[] args){5 inte[] valueTypeArray={2,3,4,5,6};6 List valueTypeList=new ArrayList();7 valueTypeList.addAll(Arrays.asList(valueTypeArray));8 System.out.println("valueTypeList:\n");9 for(intvalue:valueTypeList){10 System.out.println(value);11

12 }13

14 }15

16 }

错误信息:

.\TestArray2List.java:7: 错误: 对于addAll(List), 找不到合适的方法

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时,是把所有的指针复制一遍,比如下面的,更改原数组的值(指针指向一个新对向)时,List的值不变,所以再次都是输出1:

import java.util.*;public classTestArray2List{public static voidmain(String[] args){

Integer[] valueTypeArray={1,2,3,4,5,6};

List valueTypeList=new ArrayList();

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和Array是两个指针序列,对应的元素指向相同的对象,比如下面这样,Array的每个元素是一个指向int数组的二级指针,List的每个元素也是二级指针,它们对应的元素指向同一个int[](一个int数据序列)。因为指向同一个对象,所以对象的内容发生变化时,List和原Array都会变化。

import java.util.*;public classTestArray2List{public static voidmain(String[] args){int[][] valueTypeArray={{1,2},{3,4},{5,6}};

List valueTypeList=new ArrayList();

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值