Java学习(自用,不定期更新)(二)
内存
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
JVM内存划分
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法区 | JVM在使用操作系统功能的时候使用,例如native修饰的内容,和我们开发无关。 |
方法区 | 存储可以运行的class文件。 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 |
栈内存 | 方法运行时使用的内存,比如main方法运行,进入栈内存中执行。 |
补充:
-
栈内存:栈内存主要是用来运行函数的,在函数中定义的所有变量,都会在这个内存开辟空间。
在栈内存中定义的变量,不初始化,是不能直接使用的。
注意:所有的函数(方法)都必须在栈内存中运行。
而jvm只会运行处于栈内存顶部的函数。
函数被加载到栈内存的动作,称为函数的压栈(入栈)。
函数执行完之后就会从栈中消失(函数的弹栈,或者叫做出栈) -
堆内存:在程序中使用new 关键字创建出来的所有东西,都会保存在堆内存中。
堆内存中开辟的空间,不赋值,都会有默认的初始化数据。
整数:默认是0
小数 默认0.0.
boolean 默认是false
char 默认是 ‘\u0000’
引用数据类型默认值是 null -
方法区:JVM在加载class文件的时候,所有的class文件就要加载在这个内存中。
数组
一次性可以开辟出一组空间,然后这些空间中可以保存多个数据。而我们把这一组空间统称为数组。
数组表示的一串连续的存储空间。每个空间中都可以保存一个数据。当我们需要操作的时候,不要去面对单个空间,而直接面对这个整体的连续的存储区域。
注意:数组既可以存储基本数据类型,也可以存储引用数据类型。
定义
//数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
int [] arr = new int[5];
格式详解:
- 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。
- [] : 表示数组。
- 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。
- new:关键字,创建数组使用的关键字。
- 数组存储的数据类型: 创建的数组容器可以存储什么数据类型。
- [长度]:数组的长度,表示数组容器中可以存储多少个元素。
- 注意:数组有定长特性,长度一旦指定,不可更改。
访问
索引
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
//数组名[索引]
arr[0];
数组的长度:每个数组都具有固定的长度,Java中 数组名.length 可以获取到数组的长度。
由于数组都是由0开始计算长度,所以数组的最大索引值为 数组名.length-1。
通过索引访问数组中的元素:
//数组名[索引]=数值,为数组中的元素赋值
arr[1] = 10;
//变量=数组名[索引],获取出数组中的元素
max = arr[2];
在内存中的存储
一个数组内存图
- 输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素
两个数组内存图
两个变量指向一个数组
数组常见操作
数组遍历
将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
//循环遍历数组
for(int i=0;i<数组名.length;i++){//数组索引从0开始,最大值为长度-1
System.out.println(arr[i]);
}
求数组最值
对数组求最值的时候,一般我们会假设一个值为最大值或者最小值,然后遍历数组中的所有空间,和假设的这个值进行大小比较,只要从数组中取出的值比假设的值大 或者 小, 就进行替换。
最终把数组遍历完成,就能找到最大值 或者 最小值。
注意:一般要求假设的这个值一定是数组中存在的值。
public static void minarr(){
int[] arr= new int[]{15,5,88,99,55};
int min = arr[0];//判断数需要是数组内元素
//遍历数组,取出每个元素
for(int i = 0; i<arr.length;i++){
//遍历到的元素和变量min比较
//如果数组元素小于min
if(min>arr[i]){
min = arr[i];
}
}
System.out.println(min);
}
//在主方法中调用
public static void main(String[] args) {
minarr();
}
数组反转
数组中的元素颠倒顺序,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1
思路:数组最远端的元素互换位置。
- 实现反转,就需要将数组最远端元素位置交换
- 定义两个变量,保存数组的最小索引和最大索引
- 两个索引上的元素交换位置
- 最小索引++,最大索引–,再次交换位置
- 最小索引超过了最大索引,数组反转操作结束
public static void ReversalArr(){
int[] arr = { 1, 2, 3, 4, 5 };
/*
循环中定义变量min=0最小索引
max=arr.length-1最大索引
min++,max--
*/
for (int min = 0, max = arr.length - 1; min <= max; min++, max--) {
//利用第三方变量完成数组中的元素交换
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
// 反转后,遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
ReversalArr();
}
反向显示数组
由最大索引开始变量,依次向前
public static void ReversalArr(){
int[] nums = {1,2,3,4};
//数组个数为长度减一
for(int i = nums.length-1;i>=0;i--){
System.out.println(nums[i]);
}
}
//在主方法中调用
public static void main(String[] args) {
ReversalArr();
}
作为方法参数和返回值
作为方法参数
数组作为方法参数,传递的是数组内存的地址(十六进制)
方法参数类型区别
方法的参数为基本类型时,传递的是数据值。
方法的参数为引用类型时,传递的是地址值。
作为返回值
数组作为返回值,返回的是数组的内存地址(十六进制)
上一篇: Vue 修改网页标题和图标
下一篇: flex兼容性写法