萌新学Java之java入门三

栈内存

特点:

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中创建方式

  1. int[] array = new int[5];
  2. int[] array = new int[] {1,2,3,4,5};
  3. 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);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值