数组

这篇博客详细介绍了Java中的数组,包括数组的概念、定义格式、动态和静态初始化、数组元素的访问与赋值,以及内存划分。还探讨了数组作为方法参数和返回值的使用,以及常见的数组操作如查找最大值、最小值和反转。此外,提到了数组操作可能遇到的异常,如数组越界和空指针异常,并给出了相关代码示例。
摘要由CSDN通过智能技术生成

数组

概念

数组是一种容器,可以同时存放多个数据值。

注意事项:

  1. 数组是引用数据类型。
  2. 数组当中的多个数据值,类型必须统一。
  3. 数组的长度在程序运行期间不可改变。

定义格式

数组初始化:向内存中穿件一个数组,并且赋予其初始化值。

两种常见初始化方式:

1,动态初始化(给定长度)

2,静态初始化(给定内容)

动态初始化格式:

数据类型 []数组名称 = new 数据类型[数组长度]

左侧的数据类型:数组当中保存的数据,都是什么类型。

左侧的中括号:代表一个数组。

左侧的数组名称:代表数组的一个名字。

右侧的new:代表创建数组的动作。

右侧的数据类型:必须和左侧的数据类型一致。

右侧的数据长度:在数组中保存数组的数量值,是一个iint类型

代码实现

package cn.itcast.day05.demo01;

public class Demo01Array {
    public static void main(String[] args) {
        //数据类型 []数组名称   =  new  数据类型[数组长度] 数组的动态初始化
        //创建一个数组,能存放300个int类型的数据
        int[] array1 = new int[300];

        //创建一个数组,能存放300个double类型的数据
        double[]array2 = new double[300];

        //创建一个数组,能存放300个字符串类型的数据
        String[]array3 = new String[300];
    }
}

静态初始化格式:

数据类型[]数组名称 = new 数据类型 []{元素1,元素2,元素3};

代码实现:

package cn.itcast.day05.demo01;

public class Demo02Array {
    public static void main(String[] args) {
        //直接创建一个数组,里面都是int数字,具体内容为 12,222,33.
        int[]array1 = new int[]{12,222,33};

        //直接创建一个数组,里面都是String字符春,具体内容为 "hello"."word","what".
        String[]array2 = new String[]{"hello","word","what"};
    }
}

注意事项

虽然静态初始化没有直接指定其长度,但是根据大括号的内容可以推算出数组的长度。

静态初始化的省略格式

数据类型[]数组名称 ={元素1,元素2,元素3};

注意事项:

  1. 虽然静态初始化没有直接指定其长度,但是根据大括号的内容可以推算出数组的长度。

  2. 动态初始化的标准格式可以拆分为两个步骤。

  3. 静态初始化的标准格式页可以拆分为两个步骤。

  4. 一旦使用静态初始化的省略格式,就不能够再拆分为两个步骤。

    使用建议:

    如果确定数组的具体内容,用静态初始化,否则,用动态初始化。

    代码实现:

    package cn.itcast.day05.demo01;
    
    public class Demo03Array {
        public static void main(String[] args) {
            //静态初始化的省略格式
            int[]array1 = {1,23,44};
            //动态初始化的标准格式可以拆分为两个步骤。
            int[]array2;
            array2 = new int[12];
    
            //静态初始化的标准格式可以拆分为两个步骤。
            int[]array3;
            array3 = new int[]{11,22,33};
        }
    }
    
    

    访问数组元素进行获取

    直接打印地址数组名称会的到数组对应的内存地址哈希值。

    二进制:01

    十进制:0123456789

    十六进制:0123456789abcdef

    访问数组元素的格式:

    数组名称(索引值)

    【索引值】就是一个int数字,代表数组元素的编号。

    索引值从0开始,一致到数组的长度减1为止。

    代码实现:

    package cn.itcast.day05.demo01;
    
    public class Demo04ArrayUse {
        public static void main(String[] args) {
            int []num = {12,23,34};
            System.out.println(num);//[I@1540e19d 内存地址哈希值
            //直接打印数组当中的元素内容
            System.out.println(num[0]);
            System.out.println(num[1]);
            System.out.println(num[2]);
            System.out.println("-------------");
            //将数组当中的元素赋值交给变量,然后在进行打印。
            int num1 = num[2];
            System.out.println(num1);
        }
    }
    
    

    访问数组元素进行赋值

    使用动态初始化的时候,其中的元素会自动拥有一个默认值,规则如下:

    如果是整数类型,默认值为0.

    如果是浮点型,默认值为0.0.

    如果是字符型,默认值为‘’\u0000’.

    如果是布尔型,默认值为false.

    如果是引用类型,默认值为null.

    注意事项

    静态初始化其实也有默认值的过程,只不过系统自动将默认值替换成了大括号当中具体的值。

    代码实现如下:

    package cn.itcast.day05.demo01;
    
    public class Demo05ArrayUse {
        public static void main(String[] args) {
            //使用动态初始化创建数组
            int[]array = new int[3];
            System.out.println(array);//内存地址哈希值
            System.out.println(array[0]);//0
            System.out.println(array[1]);//0
            System.out.println(array[2]);//0
            System.out.println("----------------");
            //给数组元素赋值
            array[2] = 100;
            System.out.println(array[2]);
        }
    }
    
    

    JAVA当中的内存划分

    Java内存需要划分成为五个部分。

    1. 栈(Stack)存放的都是方法中的局部变量,方法的运行一定要在栈当中运行。

      局部变量::方法的参数,或者是方法{}内部的变量。

      作用域:一旦超出作用域,立即从栈内存当中消失,

    2. 堆(Heap):凡是new出来的东西,都在堆当中。

      堆内存中的东西都有一个地址值,16进制。

      堆内存中的数据都默认值,规则:

​ 如果是整数类型,默认值为0.

​ 如果是浮点型,默认值为0.0.

​ 如果是字符型,默认值为‘’\u0000’.

​ 如果是布尔型,默认值为false.

​ 如果是引用类型,默认值为null.

​ 3。方法去(Method Area)存储class先关的信息,包含方法的信息;

​ 4。本地方法栈(Native Method Stack):与操作系统有 关

​ 5 寄存器:(PC Register)与cpu相关。

一个数组的内存图

在这里插入图片描述

两个数组的内存图
在这里插入图片描述
两个引用指向同一个数组

image-20200615092532421

常见问题

  1. 数组越界异常。

    代码演示

    package cn.itcast.day05.demo03;
    
    /**
     * 如果访问数组元素的时候,数组索引不存在,就会发生数组苏索引越界异常
     * ArrayIndexOutOfBoundsException
     * 原因:索引编号写错了。
     * 解决:修改成为可用的索引。
     */
    
    public class Demo01ArrayIndex {
        public static void main(String[] args) {
            int [] array = {12,23,34};
            System.out.println(array[0]);
            System.out.println(array[1]);
            System.out.println(array[2]);
            //System.out.println(array[3]); 数组索引越界
        }
    }
    
    

2.空指针异常。

代码实现

package cn.itcast.day05.demo03;

/**
 * 所有的引用数据类型都可以赋值一个null值,代表什么也没有。
 * 数组只有只用new初始化才能使用其元素,
 * 如果只是赋值了一个null,没有进行常见,那么金辉出现空指针异常
 * .NullPointerException
 * 原因:忘了new
 * 解决:补上new
 */
public class Demo02ArrayNull {
    public static void main(String[] args) {
        int[]array = null;
       // array = new int[3];
        System.out.println(array[0]);
    }
}

获取数组的长度

代码实现

package cn.itcast.day05.demo03;

public class Demo03ArrayLength {
    public static void main(String[] args) {
        /**
         * 获取数组的长度
         * 数组名称.length,会返回一个int数组,代表数组的长度
         *
         * 数组一旦创建,程序运行期间,长度不能发生改变。
         */
        int[]array = {12,22,34};
        int num = array.length;
        System.out.println(num);//3
        System.out.println("-----------------------");
        int[] arrayc = new int[4];
        System.out.println(arrayc.length);
        arrayc = new int[6];
        System.out.println(arrayc.length);//每new一次就创建了一个新的数组。
    }
}

注意:

image-20200615101250628

数组的遍历

就是对数组中的每一个元素进行挨个处理,默认的处理方式就是打印输出。

代码实现:

package cn.itcast.day05.demo03;

public class Demo04Array {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 7};
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}

练习

1.求出数组当中的最大值

代码实现

package cn.itcast.day05.demo03;

public class Demo05ArrayMax {
    public static void main(String[] args) {
        int[] array = {12, 23, 34, 56, 67, 58};
        int max = array[0];//定义擂台
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        System.out.println(max);
    }

}

求出数组当中的最小值

代码实现:

package cn.itcast.day05.demo03;

public class Demo06ArrayMin {
    public static void main(String[] args) {
        int[] array = {12, 23, 34, 56, 67, 58};
        int min = array[0];//定义擂台
        for (int i = 1; i < array.length; i++) {
            if (array[i] < min) {
                min = array[i];
            }
        }
        System.out.println(min);
    }
}

2.数组元素的反转

代码实现

package cn.itcast.day05.demo03;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.w3c.dom.ls.LSOutput;

public class DemoArrayReverse {
    public static void main(String[] args) {
        int[]array = {12,23,34,45,56,67};
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
        System.out.println("-----------------------");
        /**
         * 进行数组元素的反转
         * 初始化语句:int min = 0,int max = array.length - 1
         * 条件判断 min < max
         * 步进表达式 min++ ,max --
         * 循环体 第三个变量倒手
         */
        for (int min = 0,max = array.length - 1;min < max;min++,max--){
            int temp = array[min];
            array[min] = array[max];
            array[max] = temp;
        }
        //z再次遍历数组当中的元素。
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

}

步骤:

image-20200615110922487

3.数组作为方法参数传递

代码实现:

package cn.itcast.day05.demo04;

/**
 * 数组可以作为方法的参数,当调用方法的时候,向小括号中传入参数,其实传入的是数组的地址值。
 */
public class Demo01ArrayParam {
    public static void main(String[] args) {
        int[] array = {12, 2, 3, 45, 5};
        System.out.println(array);
        printArray(array);//传递进去的就是array当中的地址值。
        System.out.println("------------aaaa---------------");
        printArray(array);
        System.out.println("-------------bbbbb---------------");
    }

    /**
     * 三要素
     * 返回值类型 无
     * 方法名 printArray
     * 参数列表 int[]array
     */
    public static void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}

4.数组作为返回值

代码实现

package cn.itcast.day05.demo04;

/**
 * 注意:
 * 一个方法可以有多个餐宿,但是只能有一个或0个返回值。
 * 如果希望一个方法中有多个结果并返回,只需要把数组作为返回值类型即可。
 * 任何数据类型,都能作为方法 的参数类型,或者返回值类型。
 * 数组作为方法的参数,传输进去的其实是方法 的地址值。
 * 数组作为方法的返回值,返回的其实也是数组的地址值。
 */
public class Demo02ArrayReturn {
    public static void main(String[] args) {
        int[] result = calculate(12, 22, 32);
        System.out.println(result);//地址值
        System.out.println("总数为" + result[0]);
        System.out.println("平均数为" + result[1]);
    }

    /**
     * 三要素:
     * 返回值类型 int[]
     * 方法名 calculate
     * 参数列表 int a,int b,int c
     */
    public static int[] calculate(int a, int b, int c) {
        int num = a + b + c;//总数
        int avg = num / 3;
        int[] array = {num, avg};
        System.out.println(array);//地址值
        return array;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值