JavaSE Day-04

内存划分、递归、数组

内存划分

程序 : 可执行文件(指令集合),是个静态概念,一般保存在硬盘中
进程 : 正在执行的文件,是一个动态概念,运行起来的程序,就是指载入到内存中的可执行文件,这个时候操作系统会开启一个进程来运行内存中的这个文件对象,如果要关闭某个程序,就可以直接杀死这个进程

JVM内存划分
Xxx.class 是个静态概念,保存在硬盘中,当我们执行java 运行命令的时候,会把该class文件载入内存中
Java Runtime Data Area : java运行时数据区域,我们一般叫JVM内存
内存被划分为5个区域 : 程序计数器,方法区/静态区/静态代码段 , 栈内存(虚拟机栈) , 本地方法栈 , 堆内存

程序计数器 : 是一块较小的内存区域,作用可以看做是当前执行的行号,比如 if , 循环, 跳转,异常处理等 都需要依赖程序计数器来完成

静态区/方法区/静态代码段 : 是用来存放我们载入内存中的class文件,包括我们的方法,还有代码段都会保存在静态区
内部还有一个运行常量池
虚拟机栈 : 又叫栈内存
方法是在栈内存中执行的,包括局部变量也是在栈内存
栈内存 : 是一个以栈数据结构为模型,创建的一段空间
栈 : 是一种数据结构,先进后出,类似于子弹夹
栈空间 : 就是指以栈数据结构为模型开辟的空间
栈帧 : 就是栈内存中每一个栈元素
栈顶元素 : 指最后一个保存进去的元素
栈底元素 : 指最先保存进去的元素

栈操作
压栈 : 把元素添加到栈空间的过程
弹栈 : 在栈空间中把数据删除的过程
本地栈 : 和VM栈结构一致,只不过是用来执行本地方法,比如 hashCode(),我们自己写的方法都在VM栈执行

堆内存 : 用来保存对象
根据静态区的class文件,创建的用于存储成员属性的空间
每个对象空间
1 头部部分 : hashCode值
2 数据部分 : 成员变量
3 类型 : 是由哪个类创建的对象,静态区的地址
1.3 Java执行过程
1 java程序编写
文本编辑器
2 java程序编译
Javac 命令
3 Java程序的执行
Java 命令
3.1 开启java虚拟机,载入对应的class文件,载入到静态区
3.2 jvm自动调用main方法
3.3 main被调用,JVM会在栈内存开辟一个main的空间,用于执行main中的代码
如果main中没有其他方法调用,执行完就弹栈,结束,JVM关闭
如果main方法中有其他方法调用,就会在栈内存再次开辟栈帧,把对应的方法放入栈内存,开始执行
如果被调用方法中还有其他方法调用,同上
一直到某一个方法栈中,没有其他方法调用,该方法如果代码执行完成,则该栈帧弹栈,如果需要返回数据,会占用临时空间把数据传递回去
弹栈后 返回上一个栈帧中方法调用处,继续执行
一直到main方法弹栈,则整个栈帧调用链结束.JVM关闭

栈内存是真正执行程序的地方,其他内存都是存储数据
方法调用 就等于是 压栈操作
方法执行结束 就等于是 弹栈操作

动态加载和静态加载
动态加载 : 只载入当前程序和需要的文件,如果执行过程中需要别的文件,再去硬盘中找
静态加载 : 开始执行,把所有和当前程序相关的文件,全部一次性载入

递归

方法体中,对当前方法的调用
基本思想:循环 需要初始值,终止条件,步长
应用场景:树状结构遍历查询 递归耗内存运行效率低
1 获取根目录下所有直接子文件
2 判断每一个子文件是否是文件夹
3 不是, 直接操作(说明是文件)
4 如果是文件夹,就把该文件夹作为跟目录再去获取所有子目录,再进行判断
5 一直是重复操作,直到把所有的文件夹都遍历完

1层目录,使用1个循环
2层目录,使用2个嵌套循环
3层目录,使用3个嵌套循环

如果不确定目录结构呢? 循环就搞不定了

常见问题
文件夹复制
斐波那契数列
阶乘
累加加和
汉诺塔

n-m的偶数和
public static int sum(int n, int m) {
// 转换为偶数
// 比如 3-7 , 就是 4+6 , 4 = 3+1 , 6 = 7-1;
// 1 先比较大小
// 2 转换为偶数
// n < m : n+1 , m - 1
// n> m : n-1 , m+1
if (n < m) {
if (n % 2 == 1 || n % 2 == -1) {
n++;
}
if (m % 2 == 1 || m % 2 == -1) {
m–;
}
// 只要能到这里 说明n和m已经是偶数了
if (m == n) {
return n;
}
return n + sum(n + 2, m);
// return m + sum(n,m-2);
} else if (n > m) {
if (n % 2 == 1 || n % 2 == -1) {
n–;
}
if (m % 2 == 1 || m % 2 == -1) {
m++;
}
// 只要能到这里 说明n和m已经是偶数了
if (m == n) {
return n;
}
return n + sum(n - 2, m);
// return m+sum(n,m+2);
} else {
// 如果相等
if (n % 2 == 1 || n % 2 == -1) {
// 奇数为0
return 0;
} else {
// 偶数是自身
return n;
}
}
}

数组

1多个相同数据类型的存储容器,有序,可以重复,线性,连续空间
2Arrys类 java.util.Arrays
3引用类型 数组,类,接口
4length 数组中有一个默认的length属性,保存当前数组的长度,数组长度一旦确定,不能更改,删除操作重新创作数组空间
5索引 数组采用第一个元素的地址,作为整个数组的地址,通过偏移量,可以找到其他的元素
数组声明
1.静态声明:知道每个元素的情况下
数据类型 [] 变量 ={值,值,值…}
2.动态声明:不知道值,但需要指定长度
数据类型 [] 变量名 = new 数据类型 [ 长度]
有默认值
数组操作
获取/访问
数组对象 [ 索引 ]
更改
数组对象 [ 索引 ] = 值
数组下标不能小于0,不能大于等于长度
没赋值 默认是null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值