java 数组与内存控制-解惑篇

  • 问题引出:

    • 在java中,声明一个数组的过程中,是如果分配内存的。
      “em… …”
    • 那,Java数组的初始化一共有几种方式,你能说一说吗?
      “em… …”
    • 那你知道基本类型数组 和 引用类型数组之间,在初始化时的内存分配机制有什么区别吗?
      “em… …”
希望看过问题的小伙伴先在评论区留下你的 答案!

  • Java语言是典型的静态语言,因此Java的数组是静态的,
    数组被初始化之后,该数组的长度是不可变的
    Java程序中的数组必须经过初始化才可使用。
    所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组指定初始值。

  • 数组的初始化有以下两种方式。

  1. 静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。
  2. 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。
	//静态初始化
	String [] str = new String[]{ "碌无为","Java" };
	//静态初始化可简写	String [] str = { "碌无为","Java" };

	//动态初始化 
	String [] str2 = new String[2];  
	str2[0] = "碌无为"; str2[1] = "Java";

注意: 不要同时使用静态初始化和动态初始化。也就是说不要在进行数组初始化时,即指定数组的长度,也为每个数组元素分配初始值。×String [ ] str = new String [2]{ "碌无为","Java" };


数组一定要初始化吗?
  • 大家都应该知道: 使用Java数组之前必须先初始化数组
    也就是为数组元素分配内存空间,并指定初始值。

  • 实际上,如果真正掌握了Java数组在内存中分配机制,那么完全可以换一个方式来初始化数组
    或者说,数组无需经过初始化。

  • 误区点

  • Java的数组变量是引用类型的变量,它并不是数组对象本身,
    只是让数组变量指向一个有效的数组对象,程序中即可使用该数组变量。

String [] str = new String[]{ "碌无为","Java" };
String [] str2 = str;

我们常常说使用Java数组之前必须先进行初始化,可是现在 str2 变量却无须初始化,这不是互相矛盾吗?
其实一点都不矛盾。
之所以提出这个问题是,因为大部分时候,我们把数组变量和数组对象搞混了,数组变量只是一个引用变量(有点类似于C语言里的指针),通常存放在栈内存中(也可以被放入堆内存中);而数组对象就是保存在堆内存中的连续内存空间。
对数组执行初始化,其实并不是对数组变量执行初始化,而是要对数组执行初始化。
对于数组变量来说,它并不需要进行所谓的初始化,只是让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量。

对于Java程序中所有的引用变量,它们都不需要经过初始化操作,
需要进行初始化操作的是该引用变量所引用的对象。


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

基本类型变量的值存储在栈内存中,这句话是完全错的。
正确的来说所有局部变量都是放在栈内存里保存的,不管其是基本类型,还是引用类型的变量,都是存储在各自的方法栈区中;但引用类型变量所引用的对象(包括数组,普通java对象)则总是存储在堆内存中
数组元素作为数组对象的一部分,总是保存在堆内存中,不管它们是基本类型元素,还是引用类型的数组。

  • 引用类型变量何时只是栈内存中的变量本身,何时又变为引用实际的Java对象

  • 引用变量本质是一个指针,只要程序通过引用变量访问属性,或者通过引用变量来调用方法,该引用变量将会由它所引用的对象代替。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值