数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的。
1.内存中的数组,数组引用变量只是一个引用,这个引用可以指向任何有效的内存,只有当该引用指向有效的内存后,才能通过数组变量来访问数组元素。与所有的引用变量相同的是,引用变量是访问真实对象的根本方式。也就是说,如果希望在程序中访问数组对象的本身,则只能通过这个数组的引用变量来访问它。其实实际的数组对象被储存储在堆内存(heap)里面,如果引用该数组对象的数组引用变量是一个局部变量,那么它被存储在栈(stack)内存中。一个方法执行时,每个方法都会建立自己的内存栈,这个方法的变量都会存放在这个内存栈中,这个方法结束内存也就销毁。在程序中创建一个对象时,这个对象将被保存在运行时数据区中,以便反复利用,这个运行时数据区就是堆内存。堆内存的对象不随方法结束而销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适时候回收它。
2.基本类型数据的初始化,先将数组变量存在栈中,当执行赋值操作时,再将数组中的每一个元素存放在堆中。引用类型数组的初始化,先将数组变量放入栈中,再将数组的引用放入堆内存中,再将引用的变量放入栈中,再将引用变量的对象放入堆内存中,最后我们将堆内存中的真实对象放入数组的引用中,所以我们得到的对象变量的引用和数组对象的引用相同。
3.没有多维数组,java语言里提供了支持多维数组的语法,但如果从数组的底层机制上来看,二维数组其实就是一维数组,多维数组也可以看成一维数组。
4.java 8增强的工具类:Arrays这个类里面包含了如下几个static修饰的方法(static修饰的方法可以直接通过类名调用)。
int binarySearch(type[] a,type key):使用二分法查询key元素值在a数组中出现的索引;如果a数组中不包含key元素的值,则返回负值。调用该方法要求数组元素已经按升序排列,这样才能得到正确的结果。
int binarySearch(type[] a, int fromIndex,int toIndex,type key):这个方法与前一个方法类似,但它只搜索数组中fronIndex到toIndex索引的元素。调用该方法时要求数组中的元素已经按照升序排列,这样才能得到正确的结果。
type[] copyOf(type[] orginal,int length):这个方法将会把original数组复制成一个新数组,其中length是新数组中的长度。
type[] copyOfRange(type[] original,int form,int to):这个方法和前面的方法相似。
boolean equals(type[] a,type[] a2):如果数组a和数组a1的长度相等,而且a数组和a1数组的数组元素也一一相同,该方法将返回true。
void fill(type[] a,type val):将数组a中的所有元素都赋值为val。
void fill(type[] a,int formIndex,int toIndex):这个方法与前面的方法作用相同。
void sort(type[] a):该方法对a数组的数组进行排序。
void sort(type[] a,int formIndex,int toIndex):该方法与前面的方法类似。
String toString(type[] a):该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连在一起,多个数组元素使用英文逗号 和空格隔开。
另外在System类里面也包含了一个static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)方法,该方法可以将src数组里的元素赋值给dest数组的元素,其中serPos指定从数组的几个元素赋值,length参数指定将src数组的多少个元素赋值给dest数组元素。