数组是指一组数据的集合,数组中的每个数据被称作元素。

在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致

 

1数组的定义和初始化

数据类型[] 数组名 = new 数据类型[元素个数或数组长度];

(数据类型就是两种:基本数据类型和引用数据类型)

 

int[] x = new int[100];

这条语句就相当于在内存中定义了100个int类型的变量,第一个变量的名称为x[0],第二个变量的名称为x[1],以此类推,第100个变量的名称为x[99],这些变量的初始值都是0。

数组长度用一个属性length表示:x.length。

 

1.1 Java虚拟机运行时数据区包括五部分

Java是在虚拟机上运行,而虚拟机是在内存运行,

Jvm在内存上开辟一块空间,分五部分:(345重要)

1)寄存器:处理cpu相关的

2)本地方法栈:与操作系统有关的

3)方法和数据共享区:class文件进入的地方

4)栈:程序中所有方法进入的地方,变量也进栈,基本数据类型进栈

5)堆:程序中所有容器和对象进入的地方,引用数据类型进堆

 

 

class Demo04
{
    public static void main(String[] args)
    {
        //定义数组1
        int[] arr=new int[3];
 
        //赋值
        arr[0]=2;
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
 
        System.out.println(arr);  //结果是一个地址
        System.out.println(arr.length);  //数组长度
    }
}

可以再定义一个数组等于这个数组,但是类型必须相同:

Int[] arr1=arr;  //就是把地址赋值给新的数组变量

变量引用数组的情况图示说明:

步骤说明:

1).class文件进入方法和数据共享区,找到main方法

2)main方法进入栈,遇到new,就创建一个数组容器,进入堆

3)数组长度是3,就在堆中开辟了三块空间,分别有一个“门牌号”,就是下标:0,1,2,并分别存入默认值0

4)给数组分配一个地址

5)把这个地址赋值给变量arr

6)通过arr找到数组的地址,然后找到下标为0的元素,改变其值为2

7)通过arr找到数组元素,并打印出里面的值:2,0,0

 

在定义数组时只指定数组的长度,由系统自动为元素赋初值的方式称作动态初始化

在初始化数组时还有一种方式叫做静态初始化,就是在定义数组的同时就为数组的每个元素赋值。数组的静态初始化有两种方式:

1)类型[] 数组名 = new 类型[]{元素,元素,……};

2)类型[] 数组名 = {元素,元素,元素,……};

为了简便,建议采用第二种方式 

class Demo04
{
    public static void main(String[] args)
    {
//定义数组2
        String[] arr2=new String[]{"中国","你好","DG","shit"};
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);
        System.out.println(arr2[3]);
    }
}

数组遍历

在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。

使用for循环来遍历数组:

class Demo05
{
    public static void main(String[] args)
    {
        //遍历数组
        int[] arr={1,2,3,4,5,6,7,8,9,10};
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }
}

数组最值

例:获取数组中元素的最大值

public class ArrayDemo{
    public static void main(String[] args){
        int[] arr = { 4, 1, 6, 3, 9, 8 };
        int max = arr[0];  //假设第一个元素为最大值
 
        //遍历数组
        for (int x = 1; x < arr.length; x++) {
            if (arr[x] > max) {  //比较 arr[x]的值是否大于max
                max = arr[x];  //条件成立,将arr[x]的值赋给max
            }
        }
        System.out.println("max=" + max);
    }
}

 

 

数组越界异常

每个数组的索引都有一个范围,即0~length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报错。

class NullPoint
{
    public static void main(String[] args)
    {
        int[] arr = new int[4];
        System.out.println(arr[4]);
    }
}

空指针异常

在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常。

class NullPoint
{
    public static void main(String[] args)
    {
        String[] arr2={"aaa","bbb","ccc"};
        arr2=null;      //把地址置为空,就找不到数组了
        System.out.println(arr2[0]);  //这时再访问数组元素就是空指针异常
    }
}