在java中,数组是一种效率最高的存储和随机访问对象引用序列的方式,数组就是一个简单的线性序列,这使得元素访问非常迅速,但是带来的代价是数组对象的大小被固定。并且在其生命周期中不可改变,当然可通过使用ArrayList,它可以通过创建一个新的实例,然后把旧实例复制中所有 的引用移到新实例中。,从而实现更多空间的自动分配,,但是这种弹性需要开销的,因此,ArrayList的效率比数组的效率低的多。

在泛型没有出现之前,其他的容器类在处理对象时,都将他们视作没有任何具体的类型,也就是说,它们都将这些对象当做java的根类Object 处理了,数组之所以优于泛型之前的容器,就是因为你可以创建一个数组去持有某种具体的类型,这意味着我们可以通过编译器检测,来防止插入错误类型和抽取不当的类型,

 

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

 

对象数组和基本类型数组在使用上几乎是相同的,唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型的值。

 

int[] a = new int[5];

a.length;

在这里,length是数组的大小,而不是实际保存的元素个数,新生产一个数组对象时,其中所有的引用被null,即可知道数组的某个位置是否存有对象。

 

 

数组和泛型

 

通常,数组和泛型不能很好的结合,不能实例化具有参数化类型的数组。

Peel<Banana>[] peels = new Peel<Banana>();   //错误

擦除会移除参数类型信息,而数组必须知道他们所持有的确切类型,以强制保证类型安全,虽然编译器不让我们实例化泛型数组,但是,它允许我们创建对这种数组的引用。如:

List<String>[] list;

但这又有什么用呢!

 

 

java标准类库Arrays有一个作用十分有限的fill()方法,只能用同一个值填充各个位置。例如:

 

 

public class FillArrays{

	public static void main(String[] args){

		boolean[] a1 = new boolean[6];
		int[] a2 = new int[6];
		String[] a3 = new String[6];
		Arrays.fill(a1,true);
		Arrays.fill(a2,16);
		Arrays.fill(a3,"hello");
		Arrays.fill(a3,3,5,"world");
		System.out.println(a1);
		System.out.println(a2);
		System.out.println(a3);
		
	}
}

输出:

a1=[true,true,true,true,true,true]

a2=[16,16,16,16,16,16]

a3=[hello,hello,hello,world,hello,world]

 

使用Arrays.fill()可以填充整个数组,或者只填充数组的某个区域,但是由于只能用单一的数值来调用Aarrays.fill()方法,因此所产生的结果并非特别有用。

 

一个基本的工具类

public class ConvertTo {
  public static boolean[] primitive(Boolean[] in) {
    boolean[] result = new boolean[in.length];
    for(int i = 0; i < in.length; i++)
      result[i] = in[i]; // Autounboxing
    return result;
  }
  public static char[] primitive(Character[] in) {
    char[] result = new char[in.length];
    for(int i = 0; i < in.length; i++)
      result[i] = in[i];
    return result;
  }
  public static byte[] primitive(Byte[] in) {
    byte[] result = new byte[in.length];
    for(int i = 0; i < in.length; i++)
      result[i] = in[i];
    return result;
  }
  public static short[] primitive(Short[] in) {
    short[] result = new short[in.length];
    for(int i = 0; i < in.length; i++)
      result[i] = in[i];
    return result;
  }
  public static int[] primitive(Integer[] in) {
    int[] result = new int[in.length];
    for(int i = 0; i < in.length; i++)
      result[i] = in[i];
    return result;
  }
  public static long[] primitive(Long[] in) {
    long[] result = new long[in.length];
    for(int i = 0; i < in.length; i++)
      result[i] = in[i];
    return result;
  }
  public static float[] primitive(Float[] in) {
    float[] result = new float[in.length];
    for(int i = 0; i < in.length; i++)
      result[i] = in[i];
    return result;
  }
  public static double[] primitive(Double[] in) {
    double[] result = new double[in.length];
    for(int i = 0; i < in.length; i++)
      result[i] = in[i];
    return result;
  }
}