第三组 数组

本文详细介绍了Java中数组的概念、创建、访问与遍历,包括动态创建、初始化以及长度获取。此外,还探讨了数组的越界问题。接着,文章通过实例展示了冒泡排序和选择排序两种经典排序算法的实现。最后,提到了二维数组的声明、创建和迭代。对于编程初学者,这是理解Java数组和排序算法的良好教程。
摘要由CSDN通过智能技术生成

数组的基本概念及作用

java数组存储一组数据类型相同的数据,在内存中空间是连续的,长度一旦给定,就不能改变了

数组属于引用数据类型(对象),但是可以存储基本类型,也可以存储引用类型

数组的创建

声明数组

int指的是数组中可以存储的数据类型为int

int[] a;

创建数组

默认值

整数:0

浮点:0.0

char:空格

布尔:false

引用类型:null

       //创建数组方式1,动态创建
        int[] a = new int[10];//创建一个长度为10的连续空间.
        System.out.println(Arrays.toString(a));//将数组对象以字符串的形式输出.
​
       //方式2
        char x = 'a';//97
        int [] b = new int[]{1,2,3,4,x};
        System.out.println(Arrays.toString(b));
​
       //方式3
        int [] c = {1,2,3,4,5};
        System.out.println(Arrays.toString(c));
​
        String[] s = new  String[]{"a","b","c"};
        System.out.println(Arrays.toString(s));

数组的长度:

length属性

int [] b1 = new int []{1,2,3,4,5,6,7};

System.out.println(b1.length);

数组的访问与迭代

● 数组元素的访问:

• 数组名字[索引]

例如:a[0],a[1];

• 注意:

• 数组的索引从0开始。

• 索引的数据类型是整型

• 索引最大值和数组长度始终差1

int [] a = new int[5];
               a[0] = 1;
               a[1] = 2;
        System.out.println(a[0]);
        System.out.println(a[1]);
               a[4] = 5;

访问数组元素时,注意数组越界

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
           
              at day1.Demo2.main(Demo2.java:18)

数组的遍历(迭代)

输出数组

      int [] a = new int[5];
         for(int i=0;i<=4;i++){
             a[i] = i+2;
         }
         System.out.println(Arrays.toString(a));

for循环

 int []a = {2,3,4,1,5};
 for (int i = 0; i < a.length; i++) {
             System.out.println(a[i]);

增强for循环

int []a = {2,3,4,1,5};
for(int t : a){
             System.out.println(t);
         }

数组排序

冒泡排序

每次取出相邻的两个元素进行比较

将较大向后移动,直到将所有的元素比较完.

       int [] a = {4,3,5,2,1};
                 // 3 4 2 1 5
                 // 3 2 1 4 5
                 // 2 1 3 4 5
                 // 1 2 3 4 5
        for (int i = 0; i < a.length-1; i++) {//外层循环,控制循环几次
            for (int j=0;j<a.length-1-i;j++){//内层循序 控制每次比较次数
               if(a[j]>a[j+1]){
                   int temp= a[j];
                   a[j] = a[j+1];
                   a[j+1] = temp;
               }
            }
        }
​
        System.out.println(Arrays.toString(a));

选择排序

从第一个开始与后面的每个元素比较,如果满足条件,就将较大/较小的进行对调

第一种方式

每次比较符合后直接进行交换,交换多次

    int []a = {3,1,2,6,4,5};
        for (int i = 0; i < a.length-1; i++) {//取出数组中将要比较的位置
            for (int j = i+1; j <a.length; j++) {//取出位置之后的每个数依次与取出的值比较
                if(a[i]>a[j]){
                    int temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }

第二种方式

使用minIndex记录最小数的索引,减少交换次数

    int []a = {3,1,2,6,4,5};
        for (int i = 0; i < a.length-1; i++) {//取出数组中将要比较的位置
            int minIndex = i;//minIndex记录最小值的索引
            for (int j = i+1; j <a.length; j++) {//取出位置之后的每个数依次与取出的值比较
                if(a[j]<a[minIndex]){//将更小的数的索引赋值给minIndex
                    minIndex=j;
                }
            }
            //内循环比较结束后,交换索引为minIndex和i的元素(即将最小值交换到i的位置)
            int temp = a[minIndex];
            a[minIndex] = a[i];
            a[i] = temp;
        }

第二种方式虽然多了一些代码语句,但是交换的次数更少一些,运行时间相对变短

插入排序

在需要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插入到前面的有序序列中,使得这n个数都是排好序的。

如此循环直至全部排好序

第一种方式

将需要插入的第n个数与前面依次比较并交换

    int []a = {3,2,1,5,4};
​        for (int i = 1; i<a.length; i++) {
            for (int j = i; j >0 ; j--) {
                if(a[j]<a[j-1]){
                    int t = a[j];
                    a[j] = a[j-1];
                    a[j-1] = t;
                }
            }
        }

第二种方式

使用两个变量,第一个记录需要插入的数,第二个记录当前所比较的位置

若比较位置的值与插入数比较的为所要结果且比较位置在数组中

就将比较位置的值给perIndex+1(也就是将perIndex的值后移,空出这个位置)

不符合循环条件后将需要插入的数放在比较位置的后一个(比较位置多走一步才跳出循环)

  int []a = {3,2,1,5,4};
      for (int i = 1; i <a.length; i++) {
            int correntvalue = a[i];//记录排序需要插入的数
            int perIndex = i-1;//记录当前所比较的位置
            while (perIndex>=0 && correntvalue<a[perIndex]){
                a[perIndex+1] = a[perIndex];
                perIndex--;
            }
            a[perIndex+1] = correntvalue;
        }

二维数组

二维数组定义

二维数组是数组的数组

二维数组的每一个元素是一个一维数组

二维数组的声明

int [][] a;
int a2[][];
//一般选择第一种,不容易混淆a的数据类型

二维数组的创建

int [][]a = new int[][]{{1,2,3},{1,2,3},{1,2,3}};
int [] [] b = {{1,2,3},{1,2,3},{1,2,3}}; 
int [][] c = new int[3][5];//二维数组中有3个长度为5的一维数组




int [][]d = new int[3][];
        /*
        只声明了二维数组的长度为3,但是里面一维数组的值为null
        输出d,结果即[null,null,null];
        在后面的一维数组赋值时,自己指定一维数组的长度*/

二维数组的迭代

int [][]a = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                System.out.println(a[i][j]);
            }
        }

开发工具中Debug调试

断点(idea内是红色的圆圈)在需要调试代码进行设置断点

使用Debug模式进行

F8 step over 逐步调试,不会进入到调用的方法中

shift+F8 step out 跳出调试

F7 step into 进去所调用的方法中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值