来自 编程 2019-05-22 17:43 的文章
当前位置: 365bet手机版网址 > 编程 > 正文

Java数组与内存控制,Java细节整理

重点:使用Java数组之前,必须对数组对象进行初始化。

使用Java数组前一定要对数组进行初始化,也就是为数组分配内存空间,并指定初始值(数组变量不需要初始化下图中 books为数组变量,books所指的疯狂java讲义。。那些是数组对象)。

一、Java数组初始化

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

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

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

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

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

下面由一段程序来说明:

图片 1;)

public class ArrayTest {

    public static void main(String[] args) {
        //采用静态初始化方式初始化第1个数组
        String[] books = new String[]{
                "疯狂java讲义",
                "轻量级Java EE企业级应用实战",
                "疯狂Ajax讲义",
                "疯狂XML讲义"
        } ;
        //采用静态初始化的简化方式初始化第2个数组
        String[] names = {
            "孙悟空",
            "猪八戒",
            "白骨精"
        };
        //采用动态初始化方式初始化第3个数组
        String[] strArr = new String[5];
        //测试
        System.out.println("第一个数组长度为:" books.length);
        System.out.println("第二个数组长度为:" names.length);
        System.out.println("第三个数组长度为:" strArr.length);

        //让books数组变量,strArr数组变量指向names所引用的数组
        books = names;
        strArr = names;
        System.out.println("------------------");
        System.out.println("books数组长度为:" books.length);
        System.out.println("strArr数组长度为:" strArr.length);
        //改变books数组变量所引用的数组的第二个元素值
        books[1] = "唐僧";
        System.out.println("names数组的第二个元素为:" books[1]);
    }
}

图片 2;)

打印结果为:

图片 3;)

第一个数组长度为:4
第二个数组长度为:3
第三个数组长度为:5
------------------
books数组长度为:3
strArr数组长度为:3
names数组的第二个元素为:唐僧

图片 4;)

下图表示的是3个引用变量和数组对象在内存中的分配情况:

图片 5

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

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

图片 6;)

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

图片 7;)

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

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

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

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

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

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

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

五:使用数组

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

当数组的所有元素都被分配了合适的内存空间,并指定了初始值时,数组的初始化完成。程序以后将不能重新改变数组对象在内存中的位置和大小。

数组初始化方式:

知识点整理:

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

1.数组的初始化有以下两种方式:

注意:不要同时使用静态初始化和动态初始化。即不要既指定数组长度,也为每个数组元素分配初始值。

1)静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组的长度。

图片 8图片 9

2)动态初始化:初始化时程序员只指定数组的长度,由系统为数组元素分配初始值。

public class ArrayTest {

    public static void main(String[] args) {
        //采用静态初始化方式初始化第1个数组
        String[] books = new String[]{
            "疯狂java讲义","轻量级Java EE 企业应用实战","疯狂Ajax讲义","疯狂XML讲义"    
        };
        //采用静态初始化的简化形式初始化第2个数组
        String[] names = {"孙悟空","猪八戒","白骨精"};
        //采用动态初始化的方法初始化第3个数组
        String[] strArr = new String[5];

        //访问三个数组的长度
        System.out.println(books.length);  //4
        System.out.println(names.length);  //3
        System.out.println(strArr.length); //5
    }
}

不管使用哪种方式初始化Java数组,一旦初始化完成,该数组的长度就不可改变。

View Code

代码示例:

图片 10  图片 11

public class Demo {
    public static void main(String[] args) {

        // 采用静态初始化方式
        String[] books = new String[] { "一千零一夜", "唐诗三百首", "警示寓言", "一个人的圣朝", };
        // 采用静态初始化的简化形式
        String[] names = { "小红", "小明", "小绿", };
        // 采用动态初始化的的方式
        String[] strArr = new String[5];

        // 访问数组以上长度
        System.out.println("第一个数组的长度是"   books.length);
        System.out.println("第二个数组的长度是"   names.length);
        System.out.println("第三个数组的长度是"   strArr.length);
    }
}

图片 12图片 13

图片 14

//让books数组变量、StrArr数组变量指向names所引用的数组
books = names;
strArr = names;

Java语言的数组变量是引用类型的变量,books,names,strArr这3个变量以及各自引用的数组在内存中的分配如图:

View Code

图片 15

 

总结:对于静态初始化方式而言,程序员无需指定数组长度,指定该数组的数组元素,由系统来决定该数组的长度即可。即names是3,books是4。

Java数组是静态的,一旦初始化完成,数组元素的内存空间分配即结束,程序只能改变数组元素的值,而无法改变数组的长度。

而执行动态初始化时,程序员只需指定数组的长度,即为每个数组元素指定所需的内存空间,系统将负责为这些数组元素分配初始值。指定初始值时,系统将按如下规则分配初始值:

注意:数组变量是一种引用类型的变量,并不是数组本身,它只是指向堆内存中的数组对象。

1)数组元素的类型是基本类型中的整数类型(byte,short,int和long),则数组元素的值是0;

  •  基本类型数组初始化:程序直接先为数组分配内存空间,再将数组元素的值存入对应内存里。

2)数组元素的类型是基本类型中的字符类型(char),则数组元素的值是'u0027;

图片 16

3)数组元素的类型是基本类型中的浮点类型(float,double),则数组元素的值是0.0;

  • 引用类型数组初始化:数组元素里存储的是引用,它指向另一块内存里。

4)数组元素的类型是基本类型中的布尔类型(boolean),则数组元素的值是false;

图片 17 图片 18 图片 19 图片 20

5)数组元素的类型是引用类型(类,接口和数组),则数组元素的值为null;

注意:所有局部变量都是放在栈内存里保存的,不管其是基本数据类型的变量还是引用类型的变量,都是存储在各自的方法栈区中;但引用类型变量所引用的对象则总是存储在堆内存中。

图片 21图片 22

{
    //定义一个int[]类型的数组变量
    int[] iArr = null;
    //只要不访问IArr的属性和方法,程序完全可以使用该数组变量
    System.out.println(iArr);
    //动态初始化数组,数组长度为5
    iArr = new int[5];
    //只有当iArr指向有效的数组对象后,下面才可以访问iArr的属性
    System.out.println(iArr.length); 
}

View Code

 

本文由365bet手机版网址发布于编程,转载请注明出处:Java数组与内存控制,Java细节整理

关键词: