1571 字
8 min
0

数组

本文介绍 Java 中数组的基本概念、创建方式、访问元素的方法,以及常用操作与注意事项,帮助初学者掌握数组的使用。

数组概述和特点

  1. 数组就是一种能够存放相同数据类型的有序集合(通俗来讲数组就是一个容器)。
  2. 创建数组的方式:动态创建、静态创建。
  3. 使用静态的方式来创建数组,数组的长度由元素个数来确定。
  4. 除了使用new关键字来静态创建数组,还可以直接使用大括号来静态创建数组。
  5. 对数组执行赋值操作时,则赋值元素的类型必须和声明数组的类型保持一致。
  6. 创建一个数组时,必须指定数组长度,创建成功,数组的大小就不可以改变了。
  7. 数组中的元素,我们可以通过索引(下标)来访问,索引的合法取值范围在[0, 数组长度-1]之间。根据索引操作数组元素的时候,如果索引值越界就会抛出数组索引越界异常(ArrayIndexOutOfBoundsException)。
  8. 通过length属性,获得数组长度。
  9. 动态创建出来的数组,那么数组中的元素就有默认值。

public class ArrayDemo {
    public static void main(String[] args) {
        // 1. 创建3个空间的int类型数组(默认值为0)
        int[] arr1 = new int[3];
        System.out.println("arr1:");
        for (int i : arr1) {
            System.out.print(i + " ");
        }
        System.out.println();
 
        // 2. 创建指定内容的int类型数组
        int[] arr2 = new int[]{1, 2, 3, 4, 5};
        System.out.println("arr2:");
        for (int i : arr2) {
            System.out.print(i + " ");
        }
        System.out.println();
 
        // 3. 创建指定内容的int类型数组(简写方式)
        int[] arr3 = {6, 7, 8, 9, 10};
        System.out.println("arr3:");
        for (int i : arr3) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
 

JVM中的堆和栈

  1. JVM是基于堆栈的虚拟机。
  2. 对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。

栈内存stack

  1. 存储:局部变量。
    • 基本数据类型的局部变量,在栈内存中存储的是“数据值”。
    • 引用数据类型的局部变量,在栈内存中存储的是“地址值”。
  2. 栈内存特点:
    • 栈内存具备“先进后出”或“后进先出”的特点。
    • 栈内存是一块连续的内存空间,由系统自动分配,效率高。
    • 虚拟机会为每个线程创建一个栈内存,用于存放该线程执行方法的信息。

堆内存heap

  1. 存储:数组或对象。
    • 在堆内存中创建数组或对象成功后,还可以在栈内存中定义一个局部变量,让该局部变量来存储创建在堆内存中数组或对象的首地址,这样该变量就引用了堆内存中的数组或对象。
    • 数组和对象在没有变量指向(引用)它的时候,则数组或对象本身占用的堆内存空间就变成垃圾,然后就被Java虚拟机的自动垃圾回收器(GC)释放了该存储空间,这样该数组或对象就不能被使用了,否则就会抛出空指针异常(NullPointerException)。
  2. 堆内存特点:
    • 虚拟机中只有一个堆内存,被所有的线程共享。
    • 堆内存是一个不连续的内存空间,分配灵活,效率低。

数据的传递过程

  1. 因为java中没有指针,因此方法中所有参数都是值传递, 传递的是值的副本。
  2. “基本数据类型”的赋值操作,则赋值的都是“数据值”。
  3. “引用数据类型”的赋值操作,则赋值的都是“地址值”。

数组知识点补充

for-each循环遍历

for-each(增强for循环)是JDK1.5增加的一种功能很强的循环结构,可以用来依次处理数组中的每个元素(其他类型的元素集合亦可),而不必为指定下标值而分心。

main方法的形参

参数String[] args的作用就是可以在main方法运行前将参数传入main方法中。

方法的可变参数

  1. 适用于参数个数不确定,但类型确定的情况,在java中把可变参数当做数组处理。
  2. 在形参列表中,可变参数最多只能有一个(0或1),并且只能出现在形参列表的最后面。
  3. 在方法体中,我们可以把可变参数当成数组来使用,可变参数本质上就是一个数组。
  4. 调用拥有可变参数的方法时,实参和形参的个数可以不同,但是实参和形参类型必须一致。

Arrays工具类

  1. Arrays是用于操作数组的工具类,里面定义了操作数组的常见静态方法。
  2. public static String toString(Type[] arr),返回指定数组内容的字符串表示形式。
  3. public static boolean equals(Type[] a1, Type[] a2), 判断两个数组中的内容是否相同。
  4. public static boolean deepEquals(Type[] a1, Type[] a2) ,层次地比较两个数组是否相等,适用于多维数组。
  5. public static void sort(Type[] arr) ,对数组中的内容进行升序排序。
  6. public static int binarySearch(Type[] arr, Type key),查找key在数组中的索引位置。如果找到,则返回索引位置;如果没找到,则返回一个负数。注意:在调用之前,必须先对数组进行排序。
  7. public static void fill(Type[] a, Type val),给数组填充指定内容。
  8. public static Type[] copyOf(Type[] original, Type newLength),从数组的第一个元素开始拷贝,拷贝指定长度的数组,拷贝完成返回一个新的数组。
  9. public static Type[] copyOfRange(Type[] original, int from, int to) ,从指定范围拷贝数组,拷贝完成返回一个新的数组。
  10. *public static* <T> *List*<T> asList(T... a) :将数组转换为 List。注意:对于基本数据类型的数组(如 int[]),不能直接使用此方法,需要使用包装类型数组(如 Integer[])。

二维数组

数组中的每个元素都是一维数组,这样的数组就是二维数组(即“数组的数组”)。

相关文章

评论区