JavaSE从入门到放弃.数组


JavaSE从入门到放弃.数组

数组

数组就是一个容器,用来存一批同种类型的数据的。

比如:想要存储 20,10,80,60,90 这些数据。 我们可以把代码写成这样

int[]array={20,10,80,60,90};

数组的定义和访问

数组有两种初始化的方式,一种是静态初始化、一种是动态初始化。

数组的静态初始化

所谓静态初始化指的是:在定义数组时直接给数组中的数据赋值。

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

按照格式定义int类型、double类型数组

public class Demo {
    public static void main(String[] args) {
        int[] ages = new int[]{12, 24, 36}
        double[] scores = new double[]{89.9, 99.5, 59.5, 88.0};
    }
}

静态初始化简化格式

Java语言的设计者为了简化定义数组的写法,还为静态初始化提供了一种简化写法

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

定义数组时, 数据类型[] 数组名 也可写成 数据类型 数组名[]

使用简化格式定义int类型、double类型数组

public class Demo {
    public static void main(String[] args) {
        int[] ages = {12, 24, 36}
        double[] scores = {89.9, 99.5, 59.5, 88.0};
    }
}

数组在计算机中的基本原理

int[] ages = {12,24,36};这句话为例,看一下这句话到底在计算机中做了那些事情。

  • 首先,左边int[] ages 表示定义了一个数组类型的变量,变量名叫ages
  • 其次,右边{12,24,36}
    表示创建一个数组对象,你完全可以把它理解成一个能装数据的东西。这个对象在内存中会有一个地址值[I@4c873330
    ,每次创建一个数组对象都会有不用的地址值。
  • 然后,把右边的地址值[I@4c873330赋值给左边的ages变量
  • 所以,ages变量就可以通过地址值,找到数组这个东西。

数组的元素访问

数组中存储的数据我们叫做元素;而且数组中的每一个元素都有一个编号与之对应,我们把这个编号叫做索引,这个索引是从0依次递增的整数。
数组名可以找到数组对象的地址,再通过索引就可以定位到具体的元素了
要想访问数组中的元素,格式如下

数组名[索引]
public class Demo {
    public static void main(String[] args) {
        int[] arr = {12, 24, 36};

        // 访问
        System.out.println(arr[0]); //12
        System.out.println(arr[1]); //24
        System.out.println(arr[2]); //36
        //下面代码没有3索引,会出现ArrayIndexOutOfBoundsException 索引越界异常
        //System.out.println(arr[3]); 

        // 修改数组中的数据
        arr[0] = 66;
        arr[2] = 100;
        System.out.println(arr[0]); //66
        System.out.println(arr[1]);
        0
        System.out.println(arr[2]); //100
    }
}

除了访问数组中的元素,我们可以获取数组中元素的个数,后面我们统称为数组的长度。

数组的遍历

public class Demo {
    public static void main(String[] args) {
        int[] ages = {12, 24, 36};
        for (int i = 0; i < ages.length; i++) {
            System.out.println(ages[i]);
        }
    }
}

数组的动态初始化

动态初始化不需要我们写出具体的元素,而是指定元素类型和长度就行。格式如下

数据类型[] 数组名 = new 数据类型[长度];
public class Demo {
    public static void main(String[] args) {
        int[] arr = new int[3];
    }
}

注意: 使用动态初始化定义数组时,根据元素类型不同,默认值也有所不同。

public class Demo {
    public static void main(String[] args) {
        double[] scores = new double[6];

        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < scores.length; i++) {
            System.out.println("请您输入第" + (i + 1) + "个数字:");
            double score = sc.nextDouble();
            scores[i] = score;
        }

        // 遍历数组中的每个元素进行求和
        double sum = 0;
        for (int i = 0; i < scores.length; i++) {
            sum += scores[i];
        }
        System.out.println("总数是:" + sum / scores.length);
    }
}

数组在计算机中的执行原理

public class ArrayDemo {
    public static void main(String[] args) {
        int a = 10;
        System.out.println(a);

        int[] arr = new int[]{11, 22, 33};
        System.out.println(arr);

        System.out.println(arr[1]);

        arr[0] = 44;
        arr[1] = 55;
        arr[2] = 66;

        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

Java为了便于虚拟机执行Java程序,将虚拟机的内存划分为 方法区、栈、堆、本地方法栈、寄存器 这5块区域。

  • 方法区:字节码文件先加载到这里
  • 栈:方法运行时所进入的内存区域,由于变量在方法中,所以变量也在这一块区域中
  • 堆:存储new出来的东西,并分配地址。由于数组是new 出来的,所以数组也在这块区域。

多个变量指向同一个数组的问题

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr1 = {11, 22, 33};
        int[] arr2 = arr1;

        System.out.println(arr1);
        System.out.println(arr2);

        arr2[1] = 99;
        System.out.println(arr1[1]);

        arr2 = null;
        System.out.println(arr2);
    }
}
  • 两个变量指向同一个数组时,两个变量记录的是同一个地址值。
  • 当一个变量修改数组中的元素时,另一个变量去访问数组中的元素,元素已经被修改过了。

案例

需求:定义一个int类型数组,求数组中元素的最大值,并打印最大值

public class Test {
    public static void main(String[] args) {
        int max = faceScores[0];
        int[] faceScores = {15, 9000, 10000, 20000, 9500, -5};

        for (int i = 1; i < faceScores.length; i++) {
            if (faceScores[i] > max) {
                max = faceScores[i];
            }
        }
        System.out.println("最大值是:" + max);
    }
}

需求:数组元素反转

public class Test {
    public static void main(String[] args) {
        int[] arr = {10, 20, 30, 40, 50};
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }

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

声明:Rock 版权所有,内容均为原创,欢迎转载。

转载:转载请注明原文链接 - JavaSE从入门到放弃.数组


我是一个程序员,致力于网页开发,我还很年轻,什么也不懂。