一、数组为什么特殊

数组与其他种类的容器之间的区别有三方面:效率、类型和保存基本类型的能力。

二、数组是第一级对象

无论使用哪种类型的数组,数组标示符其实只是一个引用,指向在堆中创建的一个真实对象,这个(数组)对象用以保存指向其他对象的引用。

length只表示数组能够容纳多少个元素。

三、返回一个数组

直接“返回一个数组”。使用完毕后,垃圾回收机制器负责清理数组,而只要还需要它,此数组就会一直存在下去。

四、多维数组

  1. Arrays.deepToString()

数组中构成矩阵的每个向量都可以具有任意的长度(粗糙数组)。

自动包装机制

五、数组与泛型

  1. Peel<Banana>[] peels = new Peel<Banana>[10];//Illegal
  2. public T[] f(T[] arg){ return arg; }

尽管不能创建实际的持有泛型的数组对象,但是可以创建非泛型的数组,然后将其转型。

  1. List<String> ls;
  2. List[] la = new List[10];
  3. ls = (List<String>[])la;//unchecked warning

六、创建测试数据

1、Arrays.fill()

填充这个数组或数组的某个区域。

2、数据生成器

Generator

3、从Generator中创建数组

七、Arrays实用功能

equals()比较两个数组(deepEquals()比较多维数组),fill()sort()数组排序,binarySearch()对已排序的数组中查找元素,toString()hashCode()产生数组散列码,asList()

1、复制数组

System.arraycopy()复制数组比for循环快很多。

2、数组的比较

equals()

3、数组元素的比较

4、数组排序

只要对象实现了Comparable接口或具有相关联的Comparator

  1. class CompTypeComparator implements Comparator<CompType>{
  2. public int compare(CompType o1,CompType o2){
  3. return (o1<o2?-1:(o1==02?0:1));
  4. }
  5. }

5、在已排序的数组中查找

binarySearch()查找失败返回- (插入点) - 1

插入点是第一个大于查找对象的元素在数组中的位置。

八、总结

“优选容器而不是数组”。