题目,给出一个数组,将这个数组按最大、最小、次大、次小、这样依次打印出来。
public static void printVector(Integer[] lists){//若写成int[] lists则转化成Integer[]的调用编译不通过
if(lists.length==0){
return;
}
int max=lists[0];
int min=lists[0];
for(int i=0;i<lists.length;i++){
if(lists[i]>max)max=lists[i];
if(lists[i]<min)min = lists[i];
}
if(max==min){
System.out.println(max);
}else{
System.out.println(max);
System.out.println(min);
}
List ll = new ArrayList();
for(int i=0;i<lists.length;i++){
if(lists[i]==max||lists[i]==min){
continue;
}
ll.add(lists[i]);
}
printVector((Integer[])ll.toArray(new Integer[0]));//注意new Integer[0]用法
}
ArrayList类扩展AbstractList并执行List接口。ArrayList支持可随需要而增长的动态数组。
ArrayList有如下的构造函数:
ArrayList( )
ArrayList(Collection c)
ArrayList(int capacity)
如果调用new ArrayList()构造时,其默认的capacity(初始容量)为10。
参见ArrayList源码,其中是这样定义的:
public ArrayList() {
this(10);
}
默认初始化内部数组大小为10。为什么是10?不知道。可能SUN觉得这样比较爽吧。
程序编译后执行ArrayList.toArray(),把ArrayList转化为数组时,该数组大小仍为capacity(为10)。
当装入的数据和capacity值不等时(小于capacity),比如只装入了5个数据,数组中后面的(capacity - size)个对象将置为null,此时当数组强制类型转换时,容易出现一些问题,如java.lang.ClassCastException异常等。
解决办法是:在用ArrayList转化为数组装数据后,使用trimToSize()重新设置数组的真实大小。
如果这个数组a足够大,就会把数据全放进去,返回的数组也是指向这个数组,(数组多余的空间存储的是null对象);要是不够大,就申请一个跟参数同样类型的数组,把值放进去,然后返回。