1.1 数组为什么特殊:
数组和容器直接的区别主要有三个方面:效率,类型,保存基本类型的能力。从效率来说,数组是一种效率最高的存储和随机访问对象引用序列的方式。对于类型,你可以创建一个数组去持有某种明确的具体的类型,使得在编译阶段就能够防止错误的类型访问和插入。最后,数组可以保存基本类型,而容器不能,但是由于Java自动包装机制的存在,已经没有明显区别。
总的来说,现如今,在类型方面,你很难说确保单一持有优势。由于Java自动包装机制的存在,使得容器变相的获得了保存基本类型的能力。最后,数组比容器的优越性在于:效率。至今,数组还是效率最高的。
1.2 数组是第一级对象。
数组标示符其实只是一个引用,指向在堆中创建的一个真实对象。这个数组对象用以保存指向其他对象的引用。数组的为一个个可以访问的字段只有length,此对象表示数组对象可以存储多少个元素,[]语法是访问数组对象唯一的方式。
int[] test = new int[4]; System.out.println(test.length);此时的输出结果为4,因为test的大小为4,此时test中的元素被自动初始化为null。如果保存的是基本类型,则会有其相应的默认初始化值。
1.3 返回一个数组
相对于C和C++中,当数组作为返回类型时,是以一种整体形式返回,那么可以减少了像C和C++中只返回一个指针地址所带来的不必要的麻烦已经内存泄露的可能性。
1.4 多维数组
包含有基本类型的多维数组:
int[][] a = { {1,2,3}, {4,5,6} }每一对花括号括起来的集合都会把你带到下一级数组。在上面的例子中,是二维数组,共有两级花括号。如果想要打印多维数组,可以使用Arrays.deepToString()方法。
System.out.println(Arrays.deepToString(c)); 输出结果: [[1, 2, 3], [7, 8, 9]]
1.5 数组与范型
通常来说,数组和范型不能很好的结合,因为数组需要明确知道它的类型信息。虽然如:
public T[] fan(T[] t){}的函数可以编译运行,但是你无法手动实例化一个数组参数类型,诸如下面的语法:
//编译错误,因为编译器无法确切知道其类型 T[] test = new T[2];
1.6 Arrays实用功能
1、复制数组
函数:System.arraycopy(),此种方法的效率高于手工编写for循环方法。注意,此种方法是一种浅拷贝,即如果数组中保存的是对象的引用,那么只会拷贝引用到新的数组中。
2、数组的比较
函数:Arrays.equals(),多维数组可以采用Arrays.deepEquals()比较。
3、数组排序
函数:Arrays.sort(sa)。对于对象来说,需要实现Comparable接口,实现int compareTo(SomeClass temp){} (SomeClass即为自身类型)
数组排序是采用的快速排序和稳定归并排序。
4、在已排序的数组中查找。
函数:Arrays.binarySearch();使用此函数的前提条件是数组已经有序,如果数组无序,将会出现不可预料的结果。
总之,数组的优越性在于效率,如果你确定使用容器已经大大拖累了你程序的效率,你可以考虑使用数组来解决这一问题。除此之外,数组有点太笨了。。