栈内存
特点:
1.所有函数在执行时,都会进入栈内存(函数的入栈)
当函数执行完毕,会出栈,被系统销毁(函数的出栈)
2.先入栈后出栈
入栈(压栈)
出栈(弹栈)
堆内存的特点
1.堆内存会分配 内存地址
2.堆内存会分配 初值
基本数据类型 初值 0
引用数据类型 初值 null
3.有垃圾回收机制
这块内存没人用 就是垃圾
示例图:
数组
数组(容器)
一维数组
保存一组相同数据类型的元素
声明方式:
数据类型[] 数组名 = 初值;
这里的数据类型表示的是数组中保存的元素的数据类型
//声明一个数组 保存5个int元素
//注意:数组的长度一旦确定,就不能更改
例:
int[] array = new int[5];
//关键词new 表示会从堆内存中开辟一块空间
//数组会在堆内存中 开辟一块连续的内存空间
//给数组中的元素赋值
//使用下标来进行对数组元素的赋值和取值
//下标从0开始
//数组名[下标] = 值;
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
//ArrayIndexOutOfBoundsException
//下标越界异常
//arr[5] = 6;
System.out.println(array[1]);
// 把array保存的地址 指向空
array = null;
//NullPointerException(空指针异常)
//访问一块不属于你的内存区域
array[3] = 3;
System.out.println(array[3]);
数组的3中创建方式
- int[] array = new int[5];
- int[] array = new int[] {1,2,3,4,5};
- int[] array = {1,2,3,4,5};//简化创建(语法糖)
遍历数组
//重点:打印数组中的每一个元素(遍历数组)
//循环遍历数组(for)
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);
}
//获取数组的长度(方法)
System.out.println(array.length);
//打印数组所有元素的方法
System.out.println(array);//这个会打印数组在堆内存中的地址,而不是数组
//Arrays 是数组工具类
System.out.println(Arrays.toString(array));
数组排序(升序 降序)
1.冒泡排序
核心思想:交换两个相邻元素的位置
3 2 5 1
第一趟
2 3 5 1 第一次比较
2 3 5 1 第二次比较
2 3 1 5 第三次比较 第一趟确定了一个(最大的)数
第二趟
2 3 1 5 第一次比较
2 1 3 5 第二次比较 第二趟确定了一个(第二大的)数
第三趟
1 2 3 5 第一次比较 第三趟确定了一个(第三大的)数
完成升序排列操作
算法实例
int[] array = {3, 5, 2, 1};
for (int i = 0; i < array.length - 1; i++) {
//外层循环控制比较的趟数
//外层循环-1 表示:4个数比较3趟
for (int j = 0; j < array.length - 1 - i; j++) {
//内层循环控制一趟比较多少次
//内层循环-1 表示:防止角标越界
//内层循环-i 表示: 每一趟 比 上一趟 少比一次
if(array[j] > array[j+1]) {//交换相邻位置的元素 比较大小
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(array));
2.选择排序
核心: 选择一个数(一般选第一个数) 与其他的数进行比较交换
算法实例
int[] array = {3, 2, 5, 1};
for (int i = 0; i < array.length - 1; i++) {
//外循环-1: 4个数比3趟
for (int j = i + 1; j < array.length; j++) {
//内循环1+i: 没一趟确定那一个数不用再重复比较了
//谁和谁 比较 交换
int temp = array[i];
if(array[i] > array[j]) {
//交换
array[i] = array[j];
array[j] = temp;
}
}
}
System.out.println(Arrays.toString(array));
折半查找
折半查找(在数组中根据元素查找对应的角标)
前提:必须在有序的数组中查找
查找 77 对应的角标
1 11 22 33 44 55 66 77 99
通过声明min mid max 三个角标来查找
算法实例:
int[] array = {1,11,22,33,44,55,66,77,99};
int min = 0;//声明最小角标
int max = array.length - 1;//声明最大角标
int mid = (min + max) / 2;//折半角标
int key = 77;//声明要查找的值
while(array[mid] != key) {//中间角标对应的值和要查找的值相等,停止循环
//明确的循环结束的条件
if(array[mid] > key) {
max = mid - 1;
}else if (array[mid] < key) {
min = mid + 1;
}
mid = (min + max) / 2;
//重新计算中间角标
//判断该数组没有这个值的情况
if(min > max) {
//确定数组中没这个值
mid = -1;
break;
}
}
System.out.println(“要寻找的下标是:”+mid);