java数组学习

数组

1 一维数组

1.1 概念

数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

变量:在内存开辟一块空间。

数组:也是变量,在内存中开辟一串连续的空间。数组长度一旦确定,就不能修改

数组的常见概念:

  • 数组名
  • 下标(或索引)
  • 元素
  • 数组的长度

1.2 基本用法

数组的声明

 public static void arrTest1()
    {
        //方式1 声明数组变量并创建数组 此时没有分配内存空间
        int[] arry1 = null;
        System.out.println(arry1);//null
        //方式2 声明数组变量并创建数组 此时分配内存空间
        int[] arry2 = new int[5];//创建一个长度为5的int类型数组
        //方式3 声明数组变量并创建数组 此时分配内存空间
        int[] arry3 = new int[]{1, 2, 3, 4, 5};//创建一个长度为5的int类型数组,并赋值
        //方式4 声明数组变量并创建数组 此时分配内存空间
        int[] arry4 = {1, 2, 3, 4, 5};//创建一个长度为5的int类型数组,并赋值

        String[] strings = new String[3];
        strings[0] = "hello";
        strings = new String[4];
        //char数组的默认值是/u0000 int型为0
    }

1.3 内存结构

int[] arr1 = null;

此时内存状态:

int[] arr1 = new int[4]

此时内存状态:

int arr1 = new int[4];
arr1[0] = 10;
arr1[2] = 20;

String[] arr2 = new String[3];
arr2[1] = "刘杰"
arr2 =new String[5];

此时内存状态:

另一种情况内存状态:

1.4 数组实战

1.4.1 数组的读取
public static void arrTest2()
    {
        //读取数组
        int[] arry1 = new int[]{1, 2, 3, 4, 5};
        for (int i = 0; i < arry1.length; i++)
        {
            System.out.println(arry1[i]);
        }
    }
1.4.2 数组的默认值
public static void arrTest3()
    {
        //int型数组的默认值为0
        int[] arr1 = new int[4];
        System.out.println(arr1[0]);//默认值为0
        //char型数组的默认值为/u0000 为0
        char[] arr2 = new char[4];
        System.out.println(arr2[0]);//默认值为0
        //String型数组的默认值为null
        String[] arr3 = new String[4];
        System.out.println(arr3[0]);//默认值为null
        //boolean型数组的默认值为false
        boolean[] arr4 = new boolean[4];
        System.out.println(arr4[0]);//默认值为false
    }
1.4.3 求极值问题
 public static void arrTest4()
    {
        int[] arr = {12,456,98,468,90,67};
        int max = arr[0];
        int min = arr[0];
        for (int i = 0; i < arr.length; i++)
        {
            if (arr[i] > max)
            {
                max = arr[i];
            }
            else if (arr[i] < min)
            {
                min = arr[i];
            }

        }
        System.out.println("最大值为:"+max);
        System.out.println("最小值为:"+min);
    }

1.5 数组练习

从键盘读入学生成绩,找出最高分,并输出学生成绩等级。

提示:先读入学生人数,根据人数创建int 数组,存放学生成绩

  • 成绩>=最高分-10 等级为’A’
  • 成绩>=最高分-20 等级为’B’
  • 成绩>=最高分-30 等级为’C’
  • 其余 等级为’D’

public static void arrTest5()
    {
        System.out.println("请输入学生人数:");
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        System.out.println("请输入"+num+"人成绩:");
        int[] arr = new int[num];
        for (int i = 0; i < arr.length; i++)
        {
            arr[i] = scanner.nextInt();
        }
        int max = 0;
        for (int i = 0; i < arr.length; i++)
        {
            max = arr[i];

            System.out.println(arr[i]);
        }
        System.out.println("最高分是:"+max);

        for (int i = 0; i < arr.length ; i++) {
            if (arr[i] >= max-10)
            {
                System.out.println("student "+i+" score is"+arr[i]+" grade is "+'A');
            }
            else if (arr[i] >= max-20)
            {
                System.out.println("student "+i+" score is"+arr[i]+" grade is "+'B');
            }
            else if (arr[i] >= max-30)
            {
                System.out.println("student "+i+" score is"+arr[i]+" grade is "+'C');
            }
            else
            {
                System.out.println("student "+i+" score is"+arr[i]+" grade is "+'D');
            }

        }

    }

2. 二维数组

2.1 概念

对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组

语法格式
 public static void initTest() {
        //方式1
        int[][] arr = new int[][]{{5, 6, 9}, {8, 10, 14}, {6, 9, 20}};
        //方式2
        int[][] arr1 = new int[3][3];
        //方式3
        int[][] arr2 = new int[3][];
    }

2.2 二维数组的使用

public static void main(String[] args) {
//1、声明二维数组
//1.1 声明数组的同时开辟空间:数据类型[][] 数组名称=new 数据类型[行][列];
int[][] nns=new int[3][4];
//列的值:可以有:所有的行的列的个数相同,相当于矩形
// 可以省略,每一行都是null,需要自己去开辟空间--了解
//1.2 先声明数组再开辟空间
int[][] nns2;
nns=new int[3][4];
//1.3 声明数组的同时赋初值:行列的长度由赋值的个数决定了
int[][] nns3=new int[][] {{1,2},{3,4},{5,6}};
//1.4
int[][] nns4 = new int[3][];
nns4[0] = new int[] {1,2};
System.out.println(Arrays.toString(nns4));
System.out.println(Arrays.toString(nns4[0]));
//2、赋值
//使用循环赋值
for(int i=0;i<nns.length;i++) {
for(int j=0;j<nns[i].length;j++) {
nns[i][j]=i+j+4;
}
}
//3、取值
for(int i=0;i<nns3.length;i++) {
for(int j=0;j<nns3[i].length;j++) {
System.out.print(nns3[i][j]+" ");
}
    System.out.println();
}
}

2.3 内存结构

2.4 练习

基本都跟循环打交道;一维数组数组一重循环;2维数组数组2重循环;

基本离不开坐标问题;一维数组一个下标索引;二维数组一定就是两个坐标(横纵坐标)

 /*
     * 二维数组练习:
     * 数组中常见的异常: NullPointerException异常 空指针异常
     * ArrayIndexOutOfBoundsException 数组下标越界
     */
    public static void arryDemo()
    {
        //1、计算3个班级所有学生的平均分:每个班级有n个人,要求先输出各个班级的自己的平均分
        double[][] arr = new double[3][];
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < arr.length; i++) {
            double sum = 0;
            System.out.println("请输入" + (i + 1) + "班人数:");
            int n = scanner.nextInt();
            arr[i] = new double[n];
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println("请输入" + (i + 1) + "班第" + (j + 1) + "个同学的成绩:");
                arr[i][j] = scanner.nextDouble();
                sum += arr[i][j];
            }
            double average = sum / arr[i].length;
            System.out.println("第" + (i + 1) + "个班级的平均分为" + average);
        }
    }

3. 数组中常见算法

数组复制
 //数组复制
    public static void arrCopy()
    {
        String[] arr = {"小白","小黄","小黑"};
        String[] arr2 = new String[arr.length];
        for (int i = 0; i < arr.length; i++) {
            arr2[i] = arr[i];
            System.out.println(arr2[i]);
        }
    }
数组反转
//数组反转
    public static void arrReversal()
    {
        String[] arr = {"小白","小黄","小黑"};
        for (int i = 0, j = arr.length-1; i < j; i++, j--) {
           String temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);

        }
    }
二分查找

//二分查找
    public static void binarySearch()
    {
        int[] arr = {1,3,5,8,10,13,16,32};
        System.out.println("请输入你要查找的数");
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int head = 0;//初始化的首索引
        int end = arr.length-1;//初始化的末索引
        boolean isok = true;
        while (head <= end)
        {
            int i = (head+end)/2;
            if (num > arr[i])
            {
                head = i+1;
            }
            else if (num < arr[i])
            {
                end = i-1;

            }
            else if (num == arr[i])
            {
                System.out.println("找到了指定元素位置为"+i);
                isok = false;
                break;
            }
        }
        if (isok)
        {
            System.out.println("对不起没有找到");
        }

    }
冒泡排序
//冒泡排序
    public static void bubbleSort()
    {
        int[] arr = {50,80,100,89};
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-i-1; j++) {
                if (arr[i] > arr[j])
                {
                    int temp = 0;
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(+arr[i]+" ");

        }
    }

3.1 Arrys工具类

 //Arrys工具类的使用
    public static void arrysTole() {
      //1.boolean equals(int[] a,int[] b):判断两个数组是否相等
        int[] arr1 = new int[]{1, 2, 3, 4};
        int[] arr2 = new int[]{1, 2, 3, 4};
        boolean isEquals = Arrays.equals(arr1, arr2);
        System.out.println(isEquals);
        
      //2.String toString(int[] a):输出数组信息。
        System.out.println(Arrays.toString(arr1));
        
      //3.void fill(int[] a,int val):将指定值填充到数组之中。
        Arrays.fill(arr1, 10);
        System.out.println(Arrays.toString(arr1));
        
      //4.void sort(int[] a):对数组进行排序。
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));
        
      //5.int binarySearch(int[] a,int key):二分查找 int key为要查找的数
        int[] arr3 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
        int index = Arrays.binarySearch(arr3, 210);
        if (index >= 0) {
            System.out.println(index);
        } else {
            System.out.println("未找到");
        }
    }

4. 总结

方法、局部变量、成员变量在程序运行时在内存中的情况:

public static void f1() {
int i = 1;
i = 11;
int[] arr = new int[4];
arr[1] = 2;
f2();
}
public static void f2() {
int i = 2;
char a = 'a';
}
public static void main(String[] args) {
int i = 3;
f1();
char a = 'b';
}

5. 调试的方法(重要)

  • 设置断点

  • 调试运行

  • f8执行一行
  • f7进入这行代码执行(进入方法)
  • shift+f8:回退

可以通过调试来寻找bug并找到查看代码运行时的整个流程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值