数组、集合互转

将数组变成List,为了使用集合的方法。

将集合变成数组是为了限定对元素的操作。不需要进行增删了。


先看将数组变成集合的方法,是Arrays的方法

static 

<T> List<T>

 

asList(T... a) 
          返回一个受指定数组支持的固定大小的列表。

示例,将String数组转成List集合

String [] strArr = {"a","b","c"};
		//<String> List<String> Arrays.asList(String... a)
		List strList = Arrays.asList(strArr);
		System.out.println(strList);


运行结果:[a, b, c]


看Eclipse的提示:


借助Eclipse的提示可以知道

List strList = Arrays.asList(strArr);

这里List里放的是String类型的元素,只是我们没有写出来。

补全代码则是List<String> strList = Arrays.asList(strArr);


再看一个示例:将int[]转成List集合

int [] intArr = {1,2,3};
		List intList = Arrays.asList(intArr);
		System.out.println(intList);


运行结果:[[I@192c766]

可见并不是将1,2,3数字输出,数组里存放的是一个地址值。(最外面的是数组[]的括号,里面[I@192c766,[表示是一个数组,I类型时int型,@192c766是内存地址。)


在泛型中经常会遇到这样的情况,要注意,int数组里的元素并不能作为对象处理,而整个int数组才是一个对象。

之所以String数组内容可以直接输出,因为每个字符串都是一个对象。


字符串的声明:String str = "abc"  ;str是类类型变量,类类型变量一定指向对象。



由Eclipse的提示也可以知道


----------------------------------------------------------------------------

再看看将集合转数组


用的是collection里的toArray方法

 Object[]

toArray() 
          返回包含此 collection 中所有元素的数组。

变完数组返回Object类型

<T> T[]

 

toArray(T[] a) 
          返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

而返回一个带指定类型的数组更方便一些。就不用强转了。要往里面传一个指定类型的数组进来,

<span style="white-space:pre">		</span>//集合转数组
		ArrayList<String> al = new ArrayList<String>();
		
		al.add("一");
		al.add("二");
		al.add("三");
		//<String> String[] java.util.ArrayList.toArray(String[] a)
		String [] str = al.toArray(new String[2]);
		
		System.out.println(Arrays.toString(str));


运行结果:[一, 二, 三]

看String [] str = al.toArray(new String[2]);这个语句里new String[2]新建类一个长度为2的数组,但是对结果并不影响。

如果将数组长度改为5new String[5],

运行结果:[abc1, abc2, abc3, null, null]


什么原因呢?

因为当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。

当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。


所以创建一个刚刚好的数组最优。

String [] str = al.toArray(new String[al.size()]);


练习:往ArrayList集合里存5个随机整数,用冒泡进行排序输出。

思路:用Math.random()获得随机数,将al集合转成数组,用冒泡进行排序

public class ArrayCollectionTrans {

 public static void main(String[] args) {

    ArrayList<Integer> al = new ArrayList<Integer>();

   

//得到5个随机数,并存到al集合中

    while(al.size()<5)

     al.add((int)(Math.random()*10+1));

  Integer[] arr2 = al.toArray(new Integer[al.size()]); //①

  System.out.println("before sort:"+Arrays.toString(arr2));

 

 

  for(int i=0; i<arr2.length-1; i++)

  {

   for(int j=0; j<arr2.length-i-1; j++)

   {

    if(arr2[j]>arr2[j+1])

    {

     int temp = arr2[j];

     arr2[j] = arr2[j+1];

     arr2[j+1] = temp;

    }

   }

  }

 

  System.out.println("after sort:"+Arrays.toString(arr2));

 }

}



由上面的练习引出的几个问题


1、①处可不可以写成:

  int[] arr = (int []) al.toArray();

不可以,  int[]类型不等同于Integer[]类型


2、如果写成  Integer[] arr = al.toArray(); 

eclipse可能会提示你改成  Integer[] arr = (Integer[]) al.toArray();

这样,编译正常,但是运行时会出错:Object不可以转成Integer,这个是大范围转成小范围


3、  大范围转成小范围,如果是基本数据类型,可以转换;如果是基本数据类型的包装类和其他类,不可以大转小

  int a =0 ;

  byte b ;

  b=(byte) a; //正确

 

  Integer c ;

  Byte d ;

  d = c; //编译失败


4、什么时候给变量初始化

首先,成员变量有默认初始化值,局部变量没有默认初始化值

那么局部变量需不需要手动给他初始化,什么时候初始化?

在用到这个变量进行计算,之前就需要进行初始化。

比如可以写成:

  int a ;

  byte b ;

  a  = 0 ;

  b=(byte) a; //正确


5、对于多个错误,Eclipse可能不是显示出所有错误

 

转载于:https://my.oschina.net/zuodev/blog/663283

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值