读书人

递归调用数组挟制类型转换

发布时间: 2012-10-28 09:54:44 作者: rapoo

递归调用,数组强制类型转换

题目,给出一个数组,将这个数组按最大、最小、次大、次小、这样依次打印出来。

?

?

?

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对象);要是不够大,就申请一个跟参数同样类型的数组,把值放进去,然后返回。

?

?

读书人网 >编程

热点推荐