day07 初识数组

数组

1. 数组的概念

数组:一块连续的内存空间,存储类型相同的数据,长度是固定

2. 数组的定义方式

先声明、再分配空间:
数据类型[] 数组名;
数组名 = new 数据类型[长度];

声明并分配空间:
数据类型[] 数组名 = new 数据类型[长度];

声明并赋值(繁):
数据类型[] 数组名 = new 数据类型[]{value1,value2,value3,…};

声明并赋值(简):
数据类型[] 数组名 = {value1,value2,value3,…};

package com.atguigu.test1;

/**
 * 1.先声明 再开辟空间
 * 2.连声明 带开辟空间
 * 3.声明并且赋值(繁琐)
 * 4.声明并且赋值(简单)
 * */
public class Test1 {
    public static void main(String[] args) {
        // 方式1 先声明 再开辟空间
        int [] arr1;
        arr1 = new int[3];

        // 方式2 连声明带开辟空间
        int arr2[] = new int[5];


        // 方式3 声明并且赋值(繁琐)
        int [] arr3 = new int[]{1, 3, 5, 6, 99, 88};

        // 方式4 声明并且赋值(简单)
        int [] arr4 = {56, 89, 12, 34, 45};


    }
}

3. 数组的访问

数组的访问:数组的访问包括 赋值 以及 取值

数组的元素:数组中的每个数据,称之为元素

数组的下标:下标(角标,索引)属于自动生成,不需要人为设置,从0开始,往后依次加1

举例:长度为5的数组,下标范围是 0 ~ 4

访问数组的中的元素是通过下标来访问

访问方式:

赋值 数组名[下标] = 值;

取值 System.out.println(数组名[下标]);

注意:不能访问超过下标范围的内容 否则将报数组下标越界异常 ArrayIndexOutOfBoundsException

异常会中断正在执行的程序 未执行的代码将不再执行

package com.atguigu.test2;
/**
 * 数组的访问:数组的访问包括 赋值 以及 取值
 * 数组的元素:数组的每个数据,称之为元素
 * 数组的下标:下标(角标,索引)属于自动生成,不需要人为设置,从0开始,往后依次加1
 *      举例:长度为5的数组,下标范围是 0 ~ 4
 *
 * 访问数组的元素是通过下标来访问
 * 访问方式:
 *      赋值 数组名[下标] = 值;
 *      取值 System.out.println(数组名[下标]);
 *
 *  注意:不能访问超出下标范围的内容,否则将报数组下标越界异常 ArrayIndexOutOfBoundsException
 *  异常会中断正在执行的程序 未执行的代码将不再执行
 *
 * */
public class Test1 {
    public static void main(String[] args) {
        int [] arr1 = new int[5];

        // 赋值/存值
        arr1[0] = 56;
        arr1[1] = 78;
        arr1[2] = 234;
        arr1[3] = 345;
        arr1[4] = 12387;

//        arr1[5] = 123;  // 报错 ArrayIndexOutOfBoundsException

        // 取值
        System.out.println("arr1数组第1个元素值为:" + arr1[0]);  // arr1数组第1个元素值为:56
        System.out.println("arr1数组第2个元素值为:" + arr1[1]);  // arr1数组第2个元素值为:78
        System.out.println("arr1数组第3个元素值为:" + arr1[2]);  // arr1数组第3个元素值为:234
        System.out.println("arr1数组第4个元素值为:" + arr1[3]);  // arr1数组第4个元素值为:345
        System.out.println("arr1数组第5个元素值为:" + arr1[4]);  // arr1数组第5个元素值为:12387
    }
}

4.数组的遍历

数组的遍历:逐一对数组中的元素进行访问 这个过程称之为遍历

package com.atguigu.test3;

import java.util.Scanner;

/**
 * 数组的遍历:逐一对数组中的元素进行访问 这个过程称之为遍历
 * */
public class Test1 {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        int [] arr1 = new int[5];
        
        for (int i = 0; i < 5;i++){
            System.out.print("请输入第" + (i + 1) + "个元素的值:");
            arr1[i] = input.nextInt();
        }
        System.out.println("---------------赋值完毕---------------");

        for (int i = 0; i < 5; i++){
            System.out.println("第" + (i + 1) + "个元素的值为:" + arr1[i]);
        }
        System.out.println("---------------取值完毕---------------");
    }
}

5. 数组的length属性

遍历数组,推荐使用数组的length属性,length属性表示数组的长度(元素的个数),是一个int类型的整数数值

使用方式:数组名.length

package com.atguigu.test3;
/**
 * 遍历数组:推荐使用数组的length属性,length属性表示数组的长度(元素的个数),是一个int类型的整数数值
 * 使用方式:数组名.length
 * */
public class Test2 {
    public static void main(String[] args) {
        int [] nums = {45, 55, 66, 77};

        System.out.println("当前nums数组的长度为:" + nums.length);

        for (int i = 0; i < nums.length; i++){
            System.out.print(nums[i] + "\t");
        }
        System.out.println();
    }
}

6.数组的默认值

数组元素的默认值:当我们给数组开辟空间,数组中即存在对应长度个数的默认值

整数:0

浮点:0.0

布尔:false

字符:\u0000

其他:null

package com.atguigu.test3;
/**
 * 数组元素的默认值:当我们给数组开辟空间,数组中即存在对应长度个数的默认值
 * 整数:0
 * 浮点数:0.0
 * 布尔:false
 * 字符:\u0000
 * 其他:null
 * */
public class Test3 {
    public static void main(String[] args) {

        byte [] nums1 = new byte[3];

        for (int i = 0; i < nums1.length; i++){
            System.out.print(nums1[i] + "\t");  // 0	0	0
        }
        System.out.println();
        System.out.println("--------------------------------------");

        short [] nums2 = new short[5];
        for (int i = 0; i < nums2.length; i++){
            System.out.print(nums2[i] + "\t");  // 0	0	0	0	0
        }
        System.out.println();
        System.out.println("--------------------------------------");

        int [] nums3 = new int[6];
        for (int i = 0; i < nums3.length;i++){
            System.out.print(nums3[i] + "\t");  // 0	0	0	0	0	0
        }
        System.out.println();
        System.out.println("--------------------------------------");

        long [] nums4 = new long[10];
        for (int i = 0; i < nums4.length; i++){
            System.out.print(nums4[i] + "\t");  // 0	0	0	0	0	0	0	0	0	0
        }
        System.out.println();
        System.out.println("--------------------------------------");

        float [] nums5 = new float[4];
        for (int i = 0; i < nums5.length; i++){
            System.out.print(nums5[i] + "\t");  // 0.0	0.0	0.0	0.0
        }
        System.out.println();
        System.out.println("--------------------------------------");

        double [] nums6 = new double[8];
        for (int i = 0; i < nums6.length; i++){
            System.out.print(nums6[i] + "\t");  // 0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
        }
        System.out.println();
        System.out.println("--------------------------------------");

        boolean [] bls = new boolean[4];
        for (int i = 0; i < bls.length; i++){
            System.out.print(bls[i] + "\t");  // false	false	false	false
        }
        System.out.println();
        System.out.println("--------------------------------------");

        char [] chs = new char[6];
        for (int i = 0; i < chs.length; i++){
            System.out.print(chs[i] + "-\t");  //  -	 -	 -	 -	 -	 -
        }
        System.out.println();
        System.out.println("--------------------------------------");

        String [] strings = new String[7];
        for (int i = 0; i < strings.length; i++){
            System.out.print(strings[i] + "\t");  // null	null	null	null	null	null	null
        }
        System.out.println();
        System.out.println("--------------------------------------");

    }
}

7.数组的扩容

1.创建大于原数组长度的新数组

2.将原数组中的元素依次复制到新数组中

3.将原数组的引用指向新的数组 完成扩容

数组作为引用数据类型 其数组名(引用)中存储的是指向堆中的地址

所以 直接将一个数组赋值给另外一个数组 赋值的是内存中的地址

数组赋值

package com.atguigu.test4;
/**
 * 数组的扩容:
 *      1.创建大于原数组长度的新数组
 *      2.将原数组的元素依次复制到新数组中
 *      3.将原数组的引用指向新的数组 完成扩容
 * */
public class Test1 {
    public static void main(String[] args) {

        int [] oldArr = {22, 33, 44, 55, 66};

        // 1.创建大于原数组长度的新数组
        int [] newArr = new int[oldArr.length * 2];

        // 2.将原数组中的元素依次复制到新数组中
        for (int i = 0;i < oldArr.length; i++){
            newArr[i] = oldArr[i];
        }

        System.out.println("-------------------遍历新数组------------------");

        for (int i = 0;i < newArr.length;i++){
            System.out.print(newArr[i] + "\t");  // 22	33	44	55	66	0	0	0	0	0
        }
        System.out.println();

        // 3.将原数组的引用指向新的数组 完成扩容
        // 数组作为引用数据类型 其数组名(引用)中存储的是指向堆中的地址
        // 所以 直接将一个数组赋值给另外一个数组 赋值的是内存中的地址

        oldArr = newArr;
        System.out.println(oldArr);  // [I@1540e19d
        System.out.println(newArr);  // [I@1540e19d
    }
}

package com.atguigu.test4;

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

        int [] nums1 = {1, 2, 3, 4, 5};
        int [] nums2 = new int[10];

        System.out.println(nums1);  // [I@1540e19d
        System.out.println(nums2);  // [I@677327b6

        nums2 = nums1;

        System.out.println("------------地址赋值完毕---------------");

        System.out.println(nums1);  // [I@1540e19d
        System.out.println(nums2);  // [I@1540e19d

        System.out.println("------------遍历nums2数组---------------");

        for (int i = 0;i < nums2.length;i++){
            System.out.print(nums2[i] + "\t");  // 1	2	3	4	5
        }
        System.out.println();

        System.out.println("------------nums2数组对元素进行改变-------------");

        nums2[0] = 999;
        System.out.println(nums1[0]);  // 改变nums2[0],nums[1]也同步发生变化 999
    }
}

8. 课堂练习

统计int类型数组中所有元素的总和、平均值。

package com.atguigu.test5;

/**
 * 统计int类型数组中所有元素的总和、平均值
 * */
public class Test1 {
    public static void main(String[] args) {
        int [] nums = {56, 66, 34, 54, 98, 23};

        int sum = 0;

        for (int i = 0; i < nums.length; i++){
            sum += nums[i];
        }
        System.out.println("nums数组元素总和为:" + sum);  // nums数组元素总和为:331
        System.out.println("nums数组元素平均值为:" + sum / nums.length);  // nums数组元素平均值为:55
    }
}

求一个数组中的最大值,或者最小值。

分析:我们可以假设数组中的某个元素作为最大值/最小值 然后依次与其他的元素比较

如果遇到更到/更小的 就交换’头衔’ 最终来确定 最大/最小值

package com.atguigu.test5;
/**
 * 求一个数组中的最大值,或者最小值
 *
 * 分析:我们可以假设数组中的某个元素作为最大值/最小值 然后依次与其他的元素比较
 * 如果遇到更大/更小的 就进行交换 最终来确定 最大/最小值
 * */

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

        int [] nums = {23, 56, 34, 87, 45};

        int max = nums[0];  // 假设第一个元素为最大值

        int min = nums[0];  // 假设第一个元素为最小值

        for (int i = 1; i < nums.length;i++){
            if (nums[i] > max){
                max = nums[i];
            }

            if (nums[i] < min){
                min = nums[i];
            }
        }

        System.out.println("nums数组中最大的元素为:" + max);  // nums数组中最大的元素为:87

        System.out.println("nums数组中最小的元素为:" + min);  // nums数组中最小的元素为:23
    }
}

需求:

1.编写方法用于统计一组人的成绩 并且返回

2.编写方法用于打印一组人的成绩 使用数组作为参数

package com.atguigu.test6;

import java.util.Scanner;

/**
 * 数组类型的参数 数组类型的返回值
 *
 * 需求:
 *      1.编写方法用于统计一组人的成绩 并且返回
 *      2.编写方法用于打印一组人的成绩 使用数组作为参数
 * */
public class Test1 {

    public static double[] inputScore(){
        Scanner input = new Scanner(System.in);
        System.out.print("请输入有几个人:");
        int count = input.nextInt();

        double [] scores = new double[count];
        for (int i = 0;i < scores.length;i++){
            System.out.print("请输入第" + (i + 1) + "个人的成绩:");
            scores[i] = input.nextDouble();
        }
        return scores;
    }

    public static void printScore(double[] scores){
        for (int i = 0;i < scores.length;i++){
            System.out.println("第" + (i + 1) + "个人的成绩为:" + scores[i]);
        }
    }

    public static void main(String[] args) {
        double [] scores = inputScore();
        System.out.println();
        printScore(scores);
    }


}

9. 值传递和引用传递的区别?

面试题:Java中值传递和引用传递的区别?

Java官方明确指出:Java中只有值传递,引用传递传递的也是值,只不过这个值是一个地址

基本数据类型 属于值传递 传递的是值本身 在方法中对值的操作 不影响实参的取值

引用数据类型 属于引用传递 传递的是地址 在方法中根据地址所做的操作 影响指向这个地址的所有变量

String类型属于特殊的引用数据类型 作为参数 在方法中对参数的改变 不会影响原来的实参

package com.atguigu.test7;

/**
 * 面试题:Java中值传递和引用传递的区别?
 * Java官方明确提出:Java中只有值传递,引用传递的也是值,只不过这个值是一个地址
 * 基本数据类型 属于值传递 传递的是值本身 在方法中对值的操作 不影响实参的取值
 * 引用数据类型 属于引用传递 传递的是地址 在方法中根据地址所做的操作 影响指向这个地址的所有变量
 * String类型属于特殊的引用数据类型 作为参数 在方法中对参数的改变 不会影响原来的实参
 * */
public class Test1 {

    public static void m1(int num){
        num += 10;
        System.out.println("m1方法中,num的值为:" + num);  // m1方法中,num的值为:20
    }

    public static void main(String[] args) {
        int a = 10;
        m1(a);
        System.out.println("main方法中,a的值为:" + a);  // main方法中,a的值为:10

        int [] arr = {1, 2, 3};
        m2(arr);

        for (int i = 0;i < arr.length;i++){
            System.out.print(arr[i] + "\t");  // 2	3	4
        }
    }

    public static void m2(int[] nums){
        for (int i = 0; i < nums.length; i++){
            nums[i]++;
        }
    }
}

10.可变长参数

可变长参数:可接收零个或者多个同类型的实参 个数不限 使用方式与数组相同

语法格式:数据类型 … 参数名称

要求:

1.整个形参列表中只能存在一个可变长参数

2.只能存在于形参列表的末尾

package com.atguigu.test8;

/**
 * 可变长参数:可接受零个或者多个同类型的实参 个数不限 使用方式与数组相同
 * 语法格式:数据类型 ... 参数名称
 *
 * 要求:
 *      1.整个形参列表中只能存在一个可变长参数
 *      2.只能存在于形参列表的末尾
 * */
public class Test1 {

    public static void m1(int[] a, int... nums){
        for (int i = 0;i < nums.length;i++){
            System.out.print(nums[i] + "\t");  // 1	2	3	4	5	6	7	m1方法执行完毕
        }
        System.out.println("m1方法执行完毕");
    }

    public static void main(String[] args){
        int[] arr1 = {1, 2, 3, 4};
        m1(arr1,1, 2, 3, 4, 5, 6, 7);
    }
}

11.复制数组

循环将原数组中所有元素逐一赋值给新数组。

System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度);

java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组。

复制数组方式1:编写循环实现元素的复制

package com.atguigu.test9;

/**
 * 复制数组方式1:编写循环实现元素的复制
 * */
public class Test1 {
    public static void main(String[] args) {
        int[] oldArr = {1, 2, 3, 4, 5, 6, 7};

        int[] newArr = new int[oldArr.length];

        for (int i = 0;i < oldArr.length;i++){
            newArr[i] = oldArr[i];
        }

        System.out.println("-----------元素复制完毕---------------");

        for (int i = 0;i < newArr.length;i++){
            System.out.print(newArr[i] + "\t");
        }
    }
}

制数组方式2:System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度);

长度必须小于等于剩余元素的个数 否则报下标越界异常

package com.atguigu.test9;
/**
 * 复制数组方式2:System.arraycopy(原数组, 原数组起始, 新数组, 新数组起始, 长度);
 *
 * 长度必循小于等于剩余元素的个数 否则报下标越界异常
 * */
public class Test2 {
    public static void main(String[] args) {
        int[] oldArr = {1, 2, 3, 4, 5};

        int[] newArr = new int[10];

        System.arraycopy(oldArr, 2, newArr, 6, 1);  // 原数组, 原数组下标起始位, 新数组, 新数组下标起始位, 复制多少位

        for (int i = 0; i < newArr.length;i++){
            System.out.print(newArr[i] + "\t");  // 0	0	0	0	0	0	3	0	0	0
        }

        System.out.println();
    }
}

复制数组方式3:java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组。

package com.atguigu.test9;

import java.util.Arrays;

/**
 * 复制数组方式3:java.util.Arrays.copyOf(原数组, 新数组的长度);  // 返回复制后的新数组
 * */
public class Test3 {
    public static void main(String[] args) {
        int[] oldArr = {11, 22, 33, 44, 55};

        int[] newArr = Arrays.copyOf(oldArr, 10);

        for (int i = 0;i < newArr.length;i++){
            System.out.print(newArr[i] + "\t");
        }
        System.out.println();  // 11	22	33	44	55	0	0	0	0	0
    }
}

12.练习

package com.atguigu.test10;

import java.util.Scanner;

/**
 * 数组练习
 * */
public class Test1 {
    public static void main(String[] args) {
        // 1.下列数组的声明有哪些是对的?错的应该怎么修改?
        // A. int[] a;
        // B. int a[] = new int[3];
            // c. int[] a;
            // a = {1, 2, 3, 4, 5};
        // D. int[] a = new int[3]{1, 2, 3};

        getAvg();

        isExist();

        getMaxMin();

        reverseOrder();
    }


    // 2.写一个函数,计算一个整数数组的平均值
    public static void getAvg(){
        int sum = 0;
        int[] nums = {11, 22, 33, 44, 55};
        for (int i = 0; i < nums.length; i++){
            sum += nums[i];
        }
        System.out.println("平均值为:" + sum / nums.length);  // 平均值为:33

    }

    // 3.自定义一个整数数组a, 读入一个整数n, 如果n在数组中存在, 则输出n的下标;如果不存在,输出-1。
    public static void isExist(){
        int[] a = {11, 22, 33, 44, 55};
        Scanner input = new Scanner(System.in);
        System.out.print("请输入整数:");
        int num = input.nextInt();
        for (int i = 0;i < a.length;i++){
            if (a[i] == num){
                System.out.println("下标为:" + i);
                break;
            }
        }
        System.out.println(-1);
    }

    // 4.给定一个数组,输出数组中的最大值和最小值
    public static void getMaxMin(){
        int[] nums = {34, 65, 12, 98, 45};
        int max = nums[0];
        int min = nums[0];

        for (int i = 0; i < nums.length;i++){
            // 求最大值
            if (nums[i] > max){
                max = nums[i];
            }
            // 求最小值
            if (nums[i] < min){
                min = nums[i];
            }
        }
        System.out.println("数组中的最大值为:" + max);  // 数组中的最大值为:98
        System.out.println("数组中的最小值为:" + min);  // 数组中的最小值为:12
    }

    // 5.给定一个数组,把这个数组中所有元素顺序进行颠倒
    public static void reverseOrder(){
        int[] nums = {34, 65, 12, 98, 45};
        for (int i = 0; i < nums.length / 2;i++){
            int temp = nums[i];
            nums[i] = nums[nums.length - i - 1];
            nums[nums.length - i - 1] = temp;
        }

        for (int i = 0; i < nums.length;i++){
            System.out.print(nums[i] + "\t");  // 45	98	12	65	34
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值