自学JAVA-数组、二维数组、数组练习

本文详细介绍了Java中的数组,包括数组的概念、语法、默认值、使用步骤、元素赋值与读取、数组越界异常、遍历、最大值获取、扩容以及拷贝。通过示例展示了动态和静态初始化、遍历、查找最大值等操作,同时讨论了值传递与引用传递的区别,并提供了二维数组的定义、长度获取和遍历方法。最后,给出了几个数组相关的编程练习题。
摘要由CSDN通过智能技术生成

数组

1.为什么需要数组
    定义26char类型变量,分别放置26个字母,并把这些变量值打印出来
    
2.数组的概念
    数组是多个相同类型数据的组合,实现对这些数据的统一管理
    数组中的元素可以是任意数据类型,包括基本类型和引用类型,但是不能混用
    可以一次性定义很多变量,并把这些变量从0开始编号(下标/索引),方便存取,
    举例:房间
    
3.数组的语法
    动态初始化
        元素类型[] 数组名 = new 元素类型[数组长度];
        int[] arr = new int[5];
        
    静态初始化
        元素类型[] 数组名 = new 元素类型[]{元素,元素...};
        int[] arr = new int[]{1,2,3,4,5};
        int[] arr = {1,2,3,4,5};
        相当于
        int[] arr = new int[5]
        arr[0]=1;arr[1]=2;arr[2]=3;arr[3]=4;arr[4]=5;

4.数组创建后,没有赋值,那么就是默认值。
    long/int/short/byte 0
    float/double 0.0
    char/ \u0000
    boolean false
    String null
    
5.数组使用步骤
    声明数组
    开辟空间
    给数组各个元素赋值
    使用数组
    
6.数组成员(元素)的赋值和读取

7.数组下标从0开始,下标越界会抛异常
    数组下标越界异常
        int[] arr = new int[3];
        System.out.println(arr[3]);
    空指针异常
        int[] arr;
        
8.数组遍历
    获取数组长度
    获取数组中最大的值
    数组扩容
    
9.数组拷贝
    数组也是一种数据类型,引用类型
    
10.值传递与引用传递
    a.栈内存
        存储局部变量,离开作用域,自动释放
    b.堆内存
        数组和对象,通过new建立的实例都存放在堆内存中
        当没有任何引用指向实例的时候,gc会不定是回收
        实例中的变量都有默认初始化值,建议手动初始化
        引用类型初始化为null
    c.方法区、本地方法区
    
    
public class Hello {
    public static void main(String[] args) {

        // 定义一个char类型的数组

        // 静态初始化
        char[] chars01 = {'a', 'b', 'c', 'd'};
        char chars02[] = {'a', 'b', 'c', 'd'};
        char chars03[] = new char[]{'a', 'b', 'c', 'd'};
        char[] chars04 = new char[]{'a', 'b', 'c', 'd'};
        System.out.println(chars01[0]);
        chars01[0] = 'A';
        System.out.println(chars01[0]);


        // 动态初始化
        char[] chars05 = new char[3];
        chars05[0] = 'a';
        chars05[1] = 'b';
        chars05[2] = 'c';

        char chars06[] = new char[3];
        chars06[0] = 'a';
        chars06[1] = 'b';
        chars06[2] = 'c';

        char chars07[]; // 声明数组
        chars07 = new char[3]; // 开辟空间,数组里面有三个成员
        chars06[0] = 'a';
        chars06[1] = 'b';
        chars06[2] = 'c';


        // 初始化完毕,没赋值的效果
        char[] chars08 = new char[3];
        System.out.println("chars08=" + chars08[0]);


        // 获取数组长度
        char[] chars09 = new char[3];
        System.out.println(chars09.length); // 3

        // 遍历数组
        chars09[0] = 'a';
        chars09[1] = 'b';
        chars09[2] = 'c';

        for (int i = 0; i < chars09.length; i++) {
            System.out.println(chars09[i]);
        }

        int i = 0;
        while (i < chars09.length) {
            System.out.println(chars09[i]);
            i++;
        }


        // 获取数组最大值
        int[] ints01 = new int[5];
        ints01[0] = 100;
        ints01[1] = 200;
        ints01[2] = 300;
        ints01[3] = 400;
        ints01[4] = 500;

        int max_int = ints01[0]; // 假设最大值为第一个成员

        for (int ii = 0; ii < ints01.length; ii++) {
            if (ints01[ii] > max_int) {
                max_int = ints01[ii];
            }
        }
        System.out.println("最大值为:" + max_int);


        // 扩容空间
        // 假设给ints01扩容,必须要新创建一个容器
        int[] ints02 = new int[6];
        for (int iii = 0; iii < ints01.length; iii++) {
            ints02[iii] = ints01[iii];
        }
        ints01 = null;
        ints02[ints02.length - 1] = 600;
        for (int iii = 0; iii < ints02.length; iii++) {
            System.out.println(ints02[iii]);
        }


        // 数组拷贝

        // 值传递
        int a = 100;
        int b = a;
        a = 200;
        System.out.println(a);
        System.out.println(b);

        //引用传递,数组属于引用传递,如果要拷贝一个新的从来,就用到上面的数组扩容
        int[] ints03 = new int[5];
        ints03[0] = 100;
        ints03[1] = 200;
        ints03[2] = 300;
        ints03[3] = 400;
        ints03[4] = 500;

        int[] ints04 = ints03;
        ints04[4] = 300;

        for (int iii = 0; iii < ints03.length; iii++) {
            System.out.println(ints03[iii]);
        }

        
    }
}

二维数组

1.二维数组的定义
    int[][] arr = new int[2][3];
    arr[0][1] = 78;
    
    int[][] arr = new int[2][];
    arr[0] = new int[2];
    arr[1] = new int[3];
    int[][] arr = {{1,2,3},{4,5,6}};
    
2.二维数组的长度
    arr.length // 二维数组长度3
    arr[0].length // 二维数组中第一个一维数组长度
    
3.二维数组的遍历

4.二维数组的其他定义方式
    一维:int[] x;int x[];
    二维:int[][] y;int y[][];
    int[] y[];
    
    int[] x,y[]; // 定义两个数组,x是一维的,y是二维的
    // 中括号跟着变量类型走,一起定义的变量都有效
    // 中括号跟着变量名中,只有当前变量名有效
    // 总结这两句话:
    int a,b; // a,b都是int类型
    int[] a,b; // a,b都是int[]类型
    int[] a,b[]; // a是int[]类型 b是int[][]类型
    
    

public class Hello {
    public static void main(String[] args) {

        // 动态初始化
        int[][] arr = new int[2][3];
        arr[0][0] = 100;
        // arr[0] 是一个数组int[],arr[0][0] 是int
        arr[0][1] = 78;
        System.out.println(arr[0][0]);
        System.out.println(arr[0][2]);


        // 动态初始化一半
        int[][] arr2 = new int[2][];
        // 完成另一半
        arr2[0] = new int[2];
        arr2[1] = new int[3];


        // 静态初始化
        int[][] arr3 = {
                {1, 2, 3},
                {4, 5, 6}
        };


        // 二维数组的长度
        System.out.println(arr.length);
        System.out.println(arr[0].length);
        System.out.println(arr[1].length);


        // 二维数组遍历
        for (int i = 0; i < arr3.length; i++) {
            for (int j = 0; j < arr3[i].length; j++) {
                System.out.println(arr3[i][j]);
            }
        }


    }
}
    
    

数组练习

import java.util.ArrayList;

public class Hello {
    public static void main(String[] args) {

        // 1.下面数组定义正确的有
//        String strs[] = {'a', 'b', 'c'}; // 不正确,String类型的但是给的是char类型的
//        String strs[] = {"a", "b", "c"}; // 正确,String类型的并且也是给的String类型的,静态定义
//        String strs[] = new String { "a", "b", "c" } ; //不正确,后面跟的是new String,正确写法是String strs[] = new String[]{"a", "b", "c"};
//        String strs[] = new String[]{"a""b""c"}; // 不正确,没逗号
//        String[] strs = new String[3]{"a", "b", "c"}; //不正确,正确写法new String[]{"a", "b", "c"};

        // 2.输出的结果是
        String foo = "blue";
        boolean[] bar = new boolean[2];
        if (bar[0]) {
            foo = "green";
        }
        // boolean的默认值为false
        System.out.println(foo); // blue
        System.out.println("=========");


        // 3.输出的结果是
        char[] arr1 = {'a', 'b', 'c', 'd'};
        char[] arr2 = arr1;
        arr2[2] = 'x';
        // 引用传递,如果不影响arr1的话就要用到数组扩容,也就是新建一个数组
        System.out.println(arr1[2]); // x
        System.out.println("=========");


        // 4.随机生成十个整数,存入数组,倒序打印、求均值、求最大值和最大值下标
        System.out.println(Math.random());
        System.out.println(Math.random() * 100);
        System.out.println((int) (Math.random() * 100));
        System.out.println("=========");

        // 存入数组
        int[] arr = new int[10];
        for (int i = 0; i < 10; i++) {
            arr[i] = (int) (Math.random() * 100);
        }

        // 正序打印
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("=========");

        // 倒序打印
        for (int i = arr.length - 1; i >= 0; i--) {
            System.out.println(arr[i]);
        }
        System.out.println("=========");


        // 求均值
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println(sum / arr.length);
        System.out.println("=========");

        // 求最大值
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (max < arr[i]) {
                max = arr[i];
            }
        }
        System.out.println(max);
        System.out.println("=========");


        // 最大值下标
        int max_index = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[max_index] < arr[i]) {
                max_index = i;
            }
        }
        System.out.println(max_index);
        System.out.println("=========");


        // 5.声明int[] x,y[],一下选项允许通过的是
//        int[] x, y[];
//        x = new int[3];
//        y = new int[];
        // 题目
//        x[0] = y; // int[][]->int,报错,首先x是int[],y是int[][],x[0]=y,int[][] 无法放入int[]
//        y[0] = x; // int[]->int[],正常
//        y[0][0] = x; // int[]->int,报错
//        y[0][0] = y; // 报错
//        y[0][0] = x[0]; // int->int,正常


        // 6.十进制转十六进制-将该数不断除以16,直到商为0,每步得到的余数倒过来,就是对应的十六进制
        // 32 / 16
        // 1 ... 15
        // 1 / 16
        // 0 ... 1
        // 115
        // 1F


        // 版本1
//        int a = 31;
//        // 集合
//        ArrayList arrayList = new ArrayList();
//
//        while (a > 0) {
//            int temp = a % 16;
//            if (temp == 15) {
//                arrayList.add("F");
//            } else if (temp == 14) {
//                arrayList.add("E");
//            } else if (temp == 13) {
//                arrayList.add("D");
//            } else if (temp == 12) {
//                arrayList.add("C");
//            } else if (temp == 11) {
//                arrayList.add("B");
//            } else if (temp == 10) {
//                arrayList.add("A");
//            }else {
//                arrayList.add(temp);
//            }
//            a = a / 16;
//        }
//        System.out.println(arrayList);


        // 版本2
//        int a = 31;
//        // 集合
//        ArrayList arrayList = new ArrayList();
//        char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
//
//        while (a > 0) {
//            int index = a % 16;
//            arrayList.add(chars[index]);
//            a = a / 16;
//        }
//        System.out.println(arrayList);


        // 版本3
        int a = 31;
        StringBuffer stringBuffer = new StringBuffer();
        char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        while (a != 0) {
            int index = a % 16;
            char temp = chars[index];
            stringBuffer.append(temp);
            a = a / 16;
        }
        System.out.println(stringBuffer.reverse().toString());

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值