数组和内存控制

简介:

数组和内存控制

一、 数组初始化:

a) 静态初始化: 初始化时由程序员指定数组元素值;系统会自动决定该数组的长度。

b) 动态初始化: 初始化时,程序员指定数组的长度,系统默认为数组元素赋初始化。

//采用静态初始化方式初始化第一个数组
String[] books = new String[]
{
"仓央嘉措诗集",
"人生若只如初见",
"当时只道是寻常"
};
//采用静态初始化的简化形式初始化第二个数组
String[] names = 
{
"斗鬼神",
"杀破狼",
"铁碎牙"
};
//采用动态初始化的语法初始化第三个数组
String[] strArr = new String[5];
//访问3个数组的长度
System.out.println("第一个数组的长度:" + books.length);
System.out.println("第二个数组的长度:" + names.length);
System.out.println("第三个数组的长度:" + strArr.length);

注意观察strArr这个变量,该变量使用动态初始化方式,所以每个元素的值为系统默认赋予初始值。

Java系统默认指定初始值的规则如下:

整形(byte,short,int long): 数组元素默认为0

浮点型(float,double): 数组元素默认值为0.0

字符型(char): 数组元素默认值为:’\u0000’;

布尔型(boolean): 数组元素默认值为false

引用类型(类、接口、数组) : 数组元素默认值为null

 

注意点: 对一个数组进行初始化时,不要同时使用静态初始化和动态初始化,即不要即指定数组的长度,又为每个元素分配初始值。

 

二、 数组长度不变:

a) 数组初始化完成后,数组的长度不可改变; 程序可以改变数组引用变量应用的地址,但不能改变堆内存中已有数组的长度。

b) 数组长度: arr.length

 

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

基本类型的数组,数组元素的值直接存储在对应的数组元素中: 程序为数组元素分配内存空间,再将数组元素的值存入对应的内存中。

//定义一个int[]类型的数组变量
int[] iArr;
//静态初始化数组,数组长度为4
iArr = new int[]{2 , 5 , -12 , 20};

程序首先会在方法栈中定义一个iArr的引用变量,此时该变量尚未指向任何有效的堆内存,所以无法使用该引用变量。

之后,程序执行静态初始化,在堆内存中开辟了四块内存空间,分别存储每一个数组元素的值; 空间开辟完成后,数组的长度不可改变。

iArr引用变量将指向堆内存中开辟的空间,可以也只能通过该引用变量来访问操作堆内存空间中的数据。

 

注意: 所以方法中的变量都是存储在方法栈内存中的; 所有引用变量的值都是存储在堆内存中。

 

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

引用类型的数组是指数组元素仍然为引用类型,指向另一块堆内存空间,这块堆内存空间里存储了该引用变量所引用的对象。

class Person
{
	//年龄
	public int age;
	//身高
	public double height;
	//定义一个info方法
	public void info()
	{
		System.out.println("我的年龄是:" + age + ",我的身高是:" + height);
	}
}
public class ReferenceArrayTest
{
	public static void main(String[] args) 
	{
		//定义一个students数组变量,其类型是Person[]
		Person[] students;
		//执行动态初始化
		students = new Person[2];
		System.out.println("students所引用的数组的长度是:" + students.length);
		//创建一个Person实例,并将这个Person实例赋给zhang变量
		Person zhang = new Person();
		//为zhang所引用的Person对象的属性赋值
		zhang.age = 15;
		zhang.height = 158;
		//创建一个Person实例,并将这个Person实例赋给lee变量
		Person lee = new Person();
		//为lee所引用的Person对象的属性赋值
		lee.age = 16;
		lee.height = 161;
		//将zhang变量的值赋给第一个数组元素
		students[0] = zhang;
		//将lee变量的值赋给第二个数组元素
		students[1] = lee;
		//下面两行代码的结果完全一样,因为lee和students[1]指向的是同一个Person实例。
		lee.info();
		students[1].info();
	}
}
分析: 

程序执行Person[] students;时,jvm会在栈内存中定义一个引用变量(指针),此时的栈内存尚未指向任何有用的空间。

程序执行students = new Person[2];为students动态初始化,即在堆内存中,开辟两个内存空间,此时,系统会默认为每个数组元素分配默认的初始值null

此时的students的每个元素都是引用,且此引用并未指向任何有效的内存。

系统接下来定义了zhanglee两个引用变量,并让他们指向堆内存中的两个Person对象,此时的zhanglee两个引用变量存储在main方法栈中,而两个Person对象则存储在堆内存中。

接下来,系统让students的两个元素值(引用)分别指向zhanglee所指向的两个有用Person对象,这样,就可以通过students[0]students[1]分别访问Person对象了。

相关文章
|
6月前
|
存储 编译器 Go
数组在内存中的存储
数组在内存中的存储
43 0
|
2月前
深度解析指针与数组:探索内存管理的艺术
深度解析指针与数组:探索内存管理的艺术
38 0
|
6月前
|
存储 JavaScript 前端开发
手撕前端面试题【javascript~ 列表动态渲染、无重复数组、数组排序、新数组、创建数组、深浅拷贝、内存泄露等】
html页面的骨架,相当于人的骨头,只有骨头是不是看着有点瘆人,只有HTML也是如此。 css,相当于把骨架修饰起来,相当于人的皮肉。
39 0
|
3月前
|
存储 搜索推荐 编译器
C learning_11 (数组和在内存存储的理解、数组越界、数组作为形参)
C learning_11 (数组和在内存存储的理解、数组越界、数组作为形参)
|
5月前
|
存储 Java 索引
[正式学习java②]——数组的基本使用,java内存图与内存分配
[正式学习java②]——数组的基本使用,java内存图与内存分配
|
8月前
|
存储 JavaScript 前端开发
js中数组是如何在内存中存储的?
js中数组是如何在内存中存储的?
133 0
|
9月前
|
存储
学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-2
(4). 取出内存中的 指数E(三种情况):E全为1 指数E 是通过 真实值+中间值 算出来的,如果E全是1,(32位系统)说明E的真实值是 128,指数是128说明这个值是非常大的。 这时,如果 有效数字M 全为0,表示 ±无穷大(正负取决于符号位s)
|
9月前
|
存储 算法 编译器
学C的第十二天【深入了解数组:一维和二维数组的创建和初始化;一维和二维数组的使用;一维和二维数组在内存中的存储;数组越界;数组作为函数参数;冒泡排序(对数组名的理解)】-2
5.二维数组的使用 操作符 [ ] :下标引用操作符,它其实就是数组访问的操作符,使用两个[ ],访问行和列 二维数组的行和列都是从0开始的