一、数组为什么特殊
数组与其他种类的容器之间的区别有三方面:效率、类型和保存基本类型的能力。
二、数组是第一级对象
无论使用哪种类型的数组,数组标示符其实只是一个引用,指向在堆中创建的一个真实对象,这个(数组)对象用以保存指向其他对象的引用。
length
只表示数组能够容纳多少个元素。
三、返回一个数组
直接“返回一个数组”。使用完毕后,垃圾回收机制器负责清理数组,而只要还需要它,此数组就会一直存在下去。
四、多维数组
Arrays.deepToString()
数组中构成矩阵的每个向量都可以具有任意的长度(粗糙数组)。
自动包装机制
五、数组与泛型
Peel<Banana>[] peels = new Peel<Banana>[10];//Illegal
public T[] f(T[] arg){ return arg; }
尽管不能创建实际的持有泛型的数组对象,但是可以创建非泛型的数组,然后将其转型。
List<String> ls;
List[] la = new List[10];
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
。
class CompTypeComparator implements Comparator<CompType>{
public int compare(CompType o1,CompType o2){
return (o1<o2?-1:(o1==02?0:1));
}
}
5、在已排序的数组中查找
binarySearch()
查找失败返回- (插入点) - 1
插入点是第一个大于查找对象的元素在数组中的位置。
八、总结
“优选容器而不是数组”。