将数组变成List,为了使用集合的方法。
将集合变成数组是为了限定对元素的操作。不需要进行增删了。
先看将数组变成集合的方法,是Arrays的方法
static
| 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() | 变完数组返回Object类型 | |
| toArray(T[] a) | 而返回一个带指定类型的数组更方便一些。就不用强转了。要往里面传一个指定类型的数组进来, |
<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可能不是显示出所有错误