CBG 2108班day05学习内容总结

Day05 复习

数组

1.数组创建的过程:

1.在内存中开辟了一块连续的内存空间,用来存放多个相同类型的数据
2.给数组完成初始化的过程,给每个元素赋予数组形影类型的默认值,比如int的默认值是0
3.数组完成初始化后会分配一个唯一的地址值
4.把唯一的地址值交给数组的引用类型变量[数组名]来保存
5.如果想要操作数组中的元素,可以根据变量保存的地址值找到数组,然后根据下标来操作数组的具体元素
数组名保存的数组的地址值,不是数组中每一个具体的元素,数组名是一个引用类型的变量

2.数组的创建方式:

静态创建(两种):

在创建时已经给数组中的元素赋值了
A.int[] a = {1,2,3,4,5};
B.int[] a = new int[]{1,2,3,4,5};(不常用)

动态创建(一种):

数组在创建时,只确定了数组的长度,数组的元素为对应数据类型的默认值,可以后期赋值
int[] a = new int[5];

3.数组的特性

1.我们是通过数组的下标来操作数组中那个的元素的,数组下标从0开始,最大下标是数组的长度-1数组的下标是我们能够进行操作数组的唯一手段.不能访问不属于这个数组的下标,否则会出现数组下标越界异常
2.数组的长度我们可以通过"数组名.length"来获取
注意:数组一旦创建,长度不可改变
如果想要增加或者是删除数组中的元素,需要创建新的长度的数组,.无法改变原数组的长度

4.数组的工具类Arrays

1.toString(数组名):用于查看当前数组的所有具体元素
除了char类型的数组底层做过处理,其他任何类型的数组,想要查看数组中的具体元素,都必须使用此方法
如果不使用此方法,直接打印数组名,打印结果是数组的地址值
此方法只用于查看数组中的具体元素,仅此而已

2.copyOf(要复制的数组,新数组的长度):用来进行数组的普通复制/扩容/缩容
== 数组的扩容 :== 新的数组的长度大于原数组的长度,多出的位置为相应类型的默认值
==数组的普通复制:==新的数组的长度等于原数组的长度
==数组的缩容:==新的数组的长度小于原数组的长度,类似于对原数组的截取
无论是以上何种操作,都不是操作原数组,而是创建了一个新的数组

3.sort(数组名):利用优化后的快速排序算法对数组进行排序
此排序算法是直接对原数组进行修改

5.数组的遍历

1.如果只想查看数组中有哪些元素,直接使用System.out.println(Arrays.toString(方法名));就可以查看,仅限于查看
2.如果想要拿到数组中的一个个的具体元素,或者是对数组中的元素做进一步的操作,就需要对数组进行遍历
3.遍历:把数组重点是所有元素,从头到尾逐个"过一遍"
4.通过循环遍历数组,实则是对数组中元素的下标进行循环,所以循环中的循环变量带标的是数组的下标

public class ReviewDemo {
    public static void main(String[] args) {
        int[] a = new int[10];
        for (int i = 0; i < a.length; i++) {
            //i代表的是数组的下标,从0到9
            a[i]=i+11;//a[i]代表数组中的每一个具体元素
        }
        System.out.println(Arrays.toString(a));
        //[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
    }
}

6.冒泡排序法

1.冒泡排序发是众多排序算法中的一种,主要是为了拓展思维接近底层
2.后续还有其他排序算法:二分查找,快速排序,全排序,归并排序…
3.冒泡排序的思路:
1)需要进行多轮比较,如果有n个数,则需要进行(n-1)轮比较
2)在每一轮中需要进行多次相邻比较,如满足条件就换位置
注意:前一轮中确定的最大值不需要参与本轮的比较
3)我们使用的是嵌套for循环来实现:
外层循环:循环变量代表的是比较的轮数[数组的长度-1]
内层循环:循环变量代表的是数组元素的下标[轮数越后,比较的次数越少,j随着i的增大二减少]
4)优化思路:
如果顺序并不是特别乱,在达到最大比较轮数前已经完成排序.这个时候就需要确定什么时候提前结束剩下的轮数
可以通过设置一个信号灯来确定什么时候提前结束循环
设置一个信号量flag,初始值为false,我们不知道什么时候结束,但是我们知道什么时候没有结束,一旦发生数据位置的改变,则说明比较还在继续,此时将flag的值设置为true,在该轮结束后,判断flag是初始值是否发生改变,如果没有改变说明,排序已经完成,那么久可以提前结束循环,提高工作效率.

package net.csdn.day05;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] a = {25,89,31,145,12,43,96};
        method(a);//创建一个排序的方法
    }
    private static void method(int[] a) {
        //外层循环:控制轮数
        /**假如有n个数,最多需要比较(n-1)轮
         * i代表的是第几轮
         * 从1开始到a.length-1结束*/
        for (int i = 1; i < a.length;i++) {
            boolean flag = false;//冒泡排序的优化,这只一个信号量
            //内层循环:这一轮中比较的次数
            /**注意:j代表的是数组元素的下标,通过下标控制元素,相邻比较
             * 数组下标从0开始,最大下标不是固定的,随着i变化而变化
             * 注意:上一轮比较得出的最大值,不需要在本轮中继续比较
             * i轮确定i个最大值,所以在每一轮中参与比较的数-i
             * */
            for (int j = 0; j < a.length-i; j++) {
                if(a[j]>a[j+1]){
                    int t;//可乐,雪碧换杯子问题
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                    flag = true;//如果触发此处,说明比较还在继续
                }
            }
            if(flag == false){//flag的值没发送改变,则说明排序已经完成,可以提前结束循环
                break;
            }
            System.out.println("第"+i+"轮排序后的数组:"+Arrays.toString(a));
        }
        System.out.println("排序完成后的数组:"+Arrays.toString(a));
    }
}

输出效果如下图:
在这里插入图片描述

4.实际开发过程中使用Arrays数组工具的排序方法:sort(数组名);
如下:

Arrays.sort(a);
		System.out.println(Arrays.toString(a));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值