一.jvm内存模型
方法区:
线程共享的内存区域,存储已被虚拟机加载的
类信息
、常量、静态变量即时编译器编译后
的代码数据等(这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载)。
Java
虚拟机栈:
简称栈区(
stack
),
每个方法被执行的时候都会同时创建一个栈帧
用于存储该方
法的局部
变量
、操作栈、动态链接、方法出口等信息。
一句话:
java
方法执行时,在栈区执行
Java
堆:
简称堆区
(heap),
被所有线程共享的一块内存区域,在虚拟机启动时创建。
所有的对象实例
以及
数组
都要在堆上分配
。
每次使用
new
关键字,就表示在堆内存中开辟一块新的存储空间
二.数组的初始化
1.静态初始化
数组元素类型
[]
数组名
=
new
数组元素类型
[]{
元素
1
,
元素
2
,
元素
3
,.......};
int
[]
nums
=
new
int
[]{
1
,
3
,
5
,
7
,
9
};
简单写法
:
int
[]
nums
=
{
1
,
3
,
5
,
7
,
9
};
//
简单写法
,
定义和初始化必须同时写出来
2.动态初始化
数组元素类型
[]
数组名
=
new
数组元素类型
[
length
];
//
例如
int
[]
nums
=
new
int
[
5
];
三.数组操作
1.基本操作
int[] nums = new int[]{1,3,5,7};
获取数组长度,语法:
int size =
数组名
.length;
int size = nums.length; ->
输出结果
4
获取元素值,语法:元素类型 变量名
=
数组名
[
index
]
;
数组的索引从
0
开始,最大索引值是数组长度
-1
,那么索引范围是
[ 0
,数组名
.length - 1 ]
。
获取第一个元素:
intele1 = nums[0];
输出
1
获取第二个元素:
intele2 = nums[1];
输出
3
获取第四个元素:
intele4 = nums[3];
输出
7
设置元素值,语法:数组名
[
index
] =
值;
设置第二个元素值为
30 nums[1] = 30;
获取第二个元素:
int ele2 = nums[1];
输出
30
常见的异常
1. NullPointerException
:空指针异常(空引用异常)
操作了一个尚未初始化或者没有分配内存空间的数组
2.
ArrayIndexOutOfBoundsException
:数组的索引越界异常
操作的数组的索引不在
[0
,数组名
.length-1]
范围内
迭代数组,也叫遍历数组(获取出数组中每一个元素)
获取第一个元素:
intele1 = nums[0];
输出
1
获取第二个元素:
intele2 = nums[1];
输出
30
获取第三个元素:
intele3 = nums[2];
输出
5
获取第四个元素:
intele4 = nums[3];
输出
7
发现,循环遍历的次数是数组元素的个数,每一次获取元素只有索引在变化,范围是
[0 ,
数组
名
.length - 1]
。
四.二维数组
数组元素类型
[][]
数组名
=
new
数组元素类型
[][] {
数组
1
,数组
2
,数组
3
,
...};
定义和动态初始化二维数组的语法:
数组元素类型
[][]
数组名
= new
数组元素类型
[x][y]
;
x
表示二维数组中有几个一维数组
y
表示每一个一维数组中有几个元素。
int[][] arr = new int[3][5]
;
System.out.println(arr.length); //
输出