黑马程序员-数组

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

 

数组的特点

(1)      只能存储同一类型数据

(2)      一旦初始化长度固定

(3)      数组的每个元素会有对应初始值

 

数组是一种单独的数据类型。数据类型分为2大派,分为基本数据类型和引用数据类型。 第二大派是引用数据类型。那么大家现在已经接触到了引用数据类型三种当中的一种。就是数组类型[] 中括号就代表数组。

总结:数组是属于引用数据类型

数组的初始化方式:

静态初始化:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];

示例:int[] arr = new int[5];

动态初始化:元素类型[] 数组名 = new 元素类型[]{元素,元素,……};

示例:int[] arr = new int[]{3,5,1,7};

int[] arr = {3,5,1,7};

 

执行以下代码,内存中发生了什么事

int[] arr = new int[3]

int[] arr2 = arr;

arr2[0] = 10;

内存分析图:

栈内存的特点

(1)      存储的都是局部变量,栈内存也成为方法栈,因为方法运行的时候会在栈内存中开辟属于自己的空间

堆内存的特点

(1)      存储的都是对象数据,凡事以new关键字创建的对象,都会存储在堆内存中,

(2)      在堆内存中分的对象的属性,都有默认的初始值

(3)      数组的默认初始化值根据数组的类型而定;

(4)      int类型默认为0double类型默认为0.0float类型默认为0.0f

 

例:

Int 0

Char: ’’(空字符)

Double0.0

Float0.0f

Stringnull

局部变量:

定义在方法中的变量;

定义在方法的参数上的变量;

定义在for循环里边的变量;定义在while()里的变量

局部变量和成员变量的区别和使用原则

1)成员变量和局部变量可不可以发生重名

原因:可以,成员变量存在堆内存,而局部变量存在于栈内存,两者有所区别,方法的访问会采取默认的就近原则

 

2)成员变量有初始值

局部变量在使用之前必须要有初始化,否则编译会报错

理解:如果没有初始化局部变量,但是在后续的代码中,没有编写该局部变量的使用语句,那么编译可以通过,但是代码中如果涉及使用到该局部变量,那么如果没有初始化,编译报错

for(...)循环和while()循环的一个需要注意的地方

for ()循环中为了循环而定义用的变量,即是指for(int x=0;x<10;x++)中的x而不包括循环体的里面定义变量,在执行完循环体后马上就被内存中释放了,在循环体外不能再用,这部分变量叫局部变量,存储于栈内存中,while()循环中定义的变量也是如此

int[] X = newint[3];这个语句在内存中的分析

java中,定义一个变量,每个变量会有一个变量名,上面的X就是一个刚定义的一个变量名

在栈内存中开辟一个空间存放变量名X

通过new这个关键字,在堆内存当中开辟一个空间,这个空间具有一个内存地址

通过“=”赋给X,从而让X指向这个内存空间。

所以举个简单的例子,就比如x是一个人,定义X的时候即给他一个站的位置,new 是一个动作,可以说是在空地上建造了一座房子,也就创造了一个空间,“=”是另一个人,他把这个房子的地址告诉了X,那么下次X就能找到这个新建的房子的位置,并不是说把这个新建的房子搬到X所站的位置。当然如果又定义了一个Y,那么也可以把这个新建的房子的地址告诉Y,那么Y也可以使用这房子,但是是和X共同使用同一个空间,无任何差别的。

int[] X = newint[3];

int[] Y = X;

X[1]=3;

System.out.println(X[1]);//输出为3

Y[1]=4

System.out.println(X[1]);//输出为4

 

int a=5;

int b=a;//a的值复制一份给b

b=6;

System.out.println(b);//输出是6

System.out.println(a);//输出是5

 

在堆内存中的内容,如果没有任何栈内存的引用,那么则会被认为是垃圾,java会启动垃圾回收机制,不定时回收

int[] X = newint[3];

int[] Y = X;

X[1]=3;

System.out.println(X[1]);//输出为3

Y[1]=4;

System.out.println(X[1]);//输出为4

X=null;//此时空间被垃圾回收机制不定时释放

而栈内存中,用完的变量,立刻就会被释放出内存

PS:以下是在论坛上看到的总结

栈内存:数据使用完毕后,会自动释放;凡是局部变量都在栈内存里

堆内存:new出来的东西都不在栈内存里边,而是在堆内存中;

new出来的实体:数组,对象;

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值