Java03 数组及其他

数组
数组是相同类型数据的有序结合,其中每个元素可以通过一个下标来访问他们;
数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。

创建数组对象会在内存中开辟一整块连续的空间,一旦声明,不能修改; 而数组名中引用的是这块连续空间的首地址;

数组的长度一旦确定,就不能修改,数组元素的类型是相同类型,不允许出现混合类型;

数组按维度分有一维,二维…; 按数据类型分,有基本数据类型数组,也有对象数组;

数组的创建
(1)创建方式:
数据类型 [ ] 数组的名称(标识符) = new 数据类型 [ 数组的长度 ];
数据类型 数组的名称 = { 数组的元素,元素和元素之间使用逗号分割 };

(2)数组的动态初始化:
Eg : int [] array new int [5]; //声明了长度为5,名称为arr1的动态数组
该数组知识分配了空间;

数组中元素的引用:
Eg : System.out.println(array[0]);

数组中元素的值:
数组中元素的操作是通过 索引/角标 来完成的,其索引或角标是通过0开始的;
Eg : 为数组中元素的赋值:arr1 [0] = 10;

数组中的元素可以多次赋值;

(3):数组的静态初始化:在数组声明的同时就初始化了数组
数据类型 [ ] 数组的名称(标识符) = new { 数组的元素 };
数据类型 [ ] 数组的名称(标识符) = new 数据类型 [ ] { 数组的元素 };

数组的操作
(1) 数组的遍历:
For ( int I = 1 ; I < array.length ; i++){
System.out.println(array[i]);
}
//foreach 增强for循环,jdk1.5引入
//int 表示遍历的目标数据类型为int;j表示遍历得到的每一个元素的暂存区域;array表示待遍历的对象,容器或集合
for( int j : array )

这两种循环的区别在于,普通for循环可以精确的控制每一个元素;二增强for不能精确的控制每一个元素,他只能遍历所有元素。
(2) 数组的赋值:
for ( int I = 1 ; I < array.length ; i++){
Attay [i] += 1;
}
(3) 获取数组的长度;
Array.length;

(4) 数组的拷贝
//从数组a拷贝到数组b;
for(int I = 0; I < a.length; i++){
b[i] = a[i];
}
(5) 获取数组中的最值
//设数组中第一个元素是最大的;
//将最大的元素保存在变量中
//使用当前的最大元素一次和后边的元素比较, 若比较元素大,则交换;反之则不交换;

int max
max = array[0];
for (int i = 0; i < array.length;i ++){
	if (max < array[i]){
		max = array[i];
	}

}

内存分配
我们的程序编写时放在硬盘中的,要放在内存中才会运行;
目前我们只需记住两个内存:栈内存,堆内存;

栈帧(Stack Frame)的局部变量表中的最小单位为slot。jvm规范中没有特定指定slot的大小,通常在32位操作系统中,slot占32位,此时long/double占两个slot。

局部变量表用于方法间参数传递,以及方法执行过程中存储基础数据类型的值和对象的引用。

Java虚拟机栈和本地方法栈可能发生如下异常情况:
如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量时,Java虚拟机将会抛出一个StackOverflowError异常。
如果Java虚拟机可以动态扩展,并且扩展的动作已经尝试过,但是目前无法申请到足够的内存去完成扩展,或者在建立新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError异常。

Eg : 数组的创建及赋值在栈内存和堆内的情况;
当定义一个新的数组变量时,会在栈内的局部变量表内分配一块区域给该数组并取名为该变量名(当申请引用类型的变量时,会申请和int类型相同大小的空间);

并会在堆内为该变量申请内存以存储该变量的“内容”,并会有一个地址(eg:0x11001)并指向该数组的首地址,且在局部变量表内申请的内存空间会存储该地址值;

当要对该数组作出赋值时,需要先根据变量名在局部变量表内查找在堆内的位置,然后修改相关内容;取值与赋值相类似。

Eg : 数组的创建及赋值在栈内存和堆内的情况;
当定义一个新的数组变量时,会在栈内的局部变量表内分配一块区域给该数组并取名为该变量名(当申请引用类型的变量时,会申请和int类型相同大小的空间);

并会在堆内为该变量申请内存以存储该变量的“内容”,并会有一个地址(eg:0x11001)并指向该数组的首地址,且在局部变量表内申请的内存空间会存储该地址值;

当要对该数组作出赋值时,需要先根据变量名在局部变量表内查找在堆内的位置,然后修改相关内容;取值与赋值相类似。

数组使用中的两个小问题
(1)在进行数组元素的获取时,产生的一个小问题:数组下标越界。
解决这类问题的 关键在于获取数组元素时,采用数组的length属性。
(2)空指针异常
这种问题产生的原因在于数组类型的变量 未指向任何对象
解决方案:让该变量指向,一个明确的对象即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值