浅谈JAVA数组与内存控制

  
  首先来了解一下数组的基本使用:JAVA数组在使用之前,必须先对数组对象进行初始化。当数组的所有元素都被分配了合适的内存空间并指定了初始值之后,数组初始化完成。
  值得注意的是:当数组被初始化之后,程序将不能改变数组对象在内存中的位置和大小。

  数组的初始化有以下的两种:
  • 静态初始化:初始化时由程序员显式指定每一个数组初始元素的初始值,并有系统自动决定数组的大小。
  • 动态初始化:初始化时优先指定数组的大小,但是并没有制定具体的初始值,有系统自动赋初值(这里有一点值得补充的是:系统为引用类型赋的初值是null,对布尔类型赋的初值是false)。
  注意:在初始化时,两种初始化类型只能选择其一 !
  
  JAVA的数组变量是一种引用类型的变量,引用类型是指向一个对象的引用变量,并非原始值,所以数组变量并非数组内存的本身,而数组变量仅仅指的是指向该段内存地址的引用,这就很容易造成数组长度可以发生变化的假象。(此处所说的数组变量指的是数组名)

  例如:
     String[] books = new String[] {"轻量级JAVA EE企业应用实战" , "JSP" , "C++"};
    String[] names = new String[4];
     //第一种为静态初始化,books.length=3 ; 第二种为动态初始化,names.length=4 , 系统默认初值为null
     books = names;
     //此时,books变量所应用的内存已经变成了四个为null值的连续内存,即books变量和names变量所引用的都已经是同一个内存对象了,此时books.length=3,而原来books变量所引用的数组长度依然是4,但不再有任何的引用变量来引用该数组,因此那一段内存将会变成垃圾,等着垃圾回收机制来回收。
    if(books[1] == null)
        System.out.println("yes");
    else
        System.out.println("no");
     //输出的结果是yes


  总而言之,JAVA的数组变量是引用类型的变量,它并不是数组对象的本身,只要让数组变量指向有效的数组对象,程序便可使用该数组变量,由此可见,JAVA数组变量未必需要初始化,关键时候我们只需要理清数组变量和数组对象这两个概念即可合理运用JAVA数组。
  此处做一个深入的扩展:
  • 数组变量是一个引用变量,通常存放在栈内存中
  • 数组对象是保存在堆内存中的连续内存空间
  • 对数组执行初始化,其实不是对数组变量进行初始化,而是对数组变量进行初始化,即为该数组对象分配一块连续的内存空间,并且然数组变量引用该段内存。
  • 所以的局部变量都是存储在栈内存当中,不管是基本类型的变量还是引用类型的变量,都是存储在各自的方法栈中的,但是引用类型所引用的对象(包括数组对象)则总是存储在堆内存中,另外,JAVA语言不允许直接访问堆内存中的数组对象,所以程序可以通过数组引用变量来访问堆内存。


   
  现在,我们再来讨论一下JAVA多维数组
  所谓的多维数组u,指的无非就是类似于int[][]、int[][][]等等,其中int[][]类型的数组,其数组元素就是int[]类型的变量,int[][][]的数组,其数组元素就是int[][]类型的变量...由此我们可以概括:N维数组的数组元素就是N-1维类型的数组变量。
  JAVA允许将多维数组当成是一维数组处理,初始化多维数组时可以先只初始化最左边的维数
  
  例如:
     
//定义一个二维数组
      int[][] a;
      //初始化a为一个长度为4的数组,注意,此处a.length=4;
      a = new int[4][];

    以上是本人在学习过程中总结出来的一点心得,如果有错误或者不足的地方,欢迎大家指正!吐舌头

猜你喜欢

转载自blog.csdn.net/BTBO_/article/details/79511167
今日推荐