首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java数组与内存储器控制

2013-01-26 
Java数组与内存控制一、Java数组初始化Java数组是静态的,即当数组被初始化之后,该数组的长度是不可变的。Jav

Java数组与内存控制

一、Java数组初始化

           Java数组是静态的,即当数组被初始化之后,该数组的长度是不可变的。Java数组使用之前必须先对数组对象进行初始化,所谓初始化,就是为数组的所有元素分配内存空间,并为每个数组元素指定初始值。(文章来源于李刚老师的《突破java程序员的16课》)

1:基本类型数组的两种初始化方式

  • 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。
  • 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。

            不要同时使用静态初始化和动态初始化,也就是说,不要在进行数组初始化时,既指定数组的长度,也为每个数组元素分配初始值。

    Java的数组是静态的,一旦数组初始化完成,数组元素的内存空间分配即结束,程序只能改变数组元素的值,而无法改变数组的长度。Java的数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是指向堆内存中的数组对象。因此,可以改变一个数组变量所引用的数组,这样可以造成数组长度可变的假象。

    下面由一段程序来说明:

    从图中可以看出,原来books变量所引用的数组长度依然为4,但不再有任何引用变量引用该数组,因此它将会变成垃圾,等待回收机制回收。程序中3个变量同时引用同一个数组对象,因此当执行books[1] = "唐僧";时names数组的第二个数组的值也会改变。

    二:数组一定要初始化吗? 

    Java数组与内存储器控制Java数组与内存储器控制
    ...int[] nums = new int[]{12,32,34};//定义另一个数组变量int[] prices;//让prices数组指向nums所引用的数组prices = nums;...
    Java数组与内存储器控制Java数组与内存储器控制

    执行了上面的代码后,prices变量已经指向有效的内存及一个长度为4的数组对象,程序可以使用prices变量了

    三:基本类型数组的初始化

    对于基本类型数组而言,数组元素的值直接存储在对应的数组元素中,因此基本类型数组的初始化比较简单:程序直接先为数组分配内存空间,再将数组元素的值存入对应内存里。

    所有局部变量都是存放在栈内存里保存的,不管其是基本类型的变量,还是引用类型的变量,都是存储在各自的方法栈区中;但引用类型变量所引用的对象(数组、普通Java对象)则总是存储在堆内存中。

    对于很多Java程序员而言,他们最容易混淆的是:引用类型变量何时只是栈内存中的变量本身,何时又变为引用实际的Java对象。其实规则很简单:引用变量本质上只是一个指针,只要程序通过引用变量访问属性,或者通过调用引用变量来调用方法,该引用变量将会由它所引用的对象代替。 

    四:引用类型数组的初始化

    引用类型数组的数组元素依然是引用类型的,因此数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了该引用变量所引用的对象(包括数组和Java数组)。

    五:使用数组

    当数组引用变量指向一个有效的数组对象之后,程序就可以通过该数组引用变量来访问数组对象。Java语言不允许直接访问堆内存中的数据,因此无法直接访问堆内存中的数组对象,程序将通过数组引用变量来访问数组。

    六:操作数组的工具类Java提供了Arrays类里包含了一些static修饰方法可以直接操作数组

    |-public static int binarySearch(byte[] a,byte key):

    使用二分法查询key元素值在a数组中出现的索引;如果a数组不包含key元素值,则返回负数。调用该方法时要求数组中元素已经按升序排列,这样才能得到正确结果。

    |-public static int binarySearch(byte[] a,int fromIndex, int toIndex,byte key)

    搜索a数组中fromIndex到toIndex索引的元素。调用该方法时要求数组中元素已经按升序排列,这样才能得到正确结果。

    |-public static byte[] copyOf(byte[] original,int newLength)

    将会把original数组复制成一个新数组,其中length是新数组的长度。如果length小于original数组的长度,则新数组就是原数组的前面length个元素;如果length大于original数组的长度,则新数组的前面元素就是原数组的所有元素,后面补充0(数值型)、false(布尔型)、或者null(引用型)。

    |-public static boolean[] copyOfRange(boolean[] original,int from,int to)

    这个方法只复制original数组的from索引到to索引的元素。

    |-public static boolean equals(byte[] a, byte[] a2)

    如果a数组a2数组的长度相等,而且a数组和a2数组的数组元素也一一相同,该方法将返回true、

    |-void fill(type[]a ,type val)
    该方法将会把a数组所有元素值都赋值为val。

    |-void fill(type[] a, index fromIndex, int toIndex, type val)

    区别只是该方法仅仅将a数组的fromIndex到toIndex索引的数组元素赋值为val

    |-void sort(type[] a):

    该方法对a数组的数组元素进行排序

    |-void sort(type[] a,int fromIndex,int toIndex)

    区别是该方法仅仅对fromIndex到toIndex。

    |-String toString(type[] a)

    该方法将一个数组转换成一个字符串



热点排行