数组
数组概述和特点
- 数组就是一种能够存放相同数据类型的有序集合(通俗来讲数组就是一个容器)。
 - 创建数组的方式:动态创建、静态创建。
 - 使用静态的方式来创建数组,数组的长度由元素个数来确定。
 - 除了使用
 new关键字来静态创建数组,还可以直接使用大括号来静态创建数组。- 对数组执行赋值操作时,则赋值元素的类型必须和声明数组的类型保持一致。
 - 创建一个数组时,必须指定数组长度,创建成功,数组的大小就不可以改变了。
 - 数组中的元素,我们可以通过索引(下标)来访问,索引的合法取值范围在[0, 数组长度-1]之间。根据索引操作数组元素的时候,如果索引值越界就会抛出数组索引越界异常(
 ArrayIndexOutOfBoundsException)。- 通过
 length属性,获得数组长度。- 动态创建出来的数组,那么数组中的元素就有默认值。
 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中的堆和栈
- JVM是基于堆栈的虚拟机。
 - 对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。
 
栈内存stack
- 存储:局部变量。
 
- 基本数据类型的局部变量,在栈内存中存储的是“数据值”。
 - 引用数据类型的局部变量,在栈内存中存储的是“地址值”。
 - 栈内存特点:
 
- 栈内存具备“先进后出”或“后进先出”的特点。
 - 栈内存是一块连续的内存空间,由系统自动分配,效率高。
 - 虚拟机会为每个线程创建一个栈内存,用于存放该线程执行方法的信息。
 
堆内存heap
- 存储:数组或对象。
 
- 在堆内存中创建数组或对象成功后,还可以在栈内存中定义一个局部变量,让该局部变量来存储创建在堆内存中数组或对象的首地址,这样该变量就引用了堆内存中的数组或对象。
 - 数组和对象在没有变量指向(引用)它的时候,则数组或对象本身占用的堆内存空间就变成垃圾,然后就被Java虚拟机的自动垃圾回收器(GC)释放了该存储空间,这样该数组或对象就不能被使用了,否则就会抛出空指针异常(NullPointerException)。
 - 堆内存特点:
 
- 虚拟机中只有一个堆内存,被所有的线程共享。
 - 堆内存是一个不连续的内存空间,分配灵活,效率低。
 
数据的传递过程
- 因为java中没有指针,因此方法中所有参数都是值传递, 传递的是值的副本。
 - “基本数据类型”的赋值操作,则赋值的都是“数据值”。
 - “引用数据类型”的赋值操作,则赋值的都是“地址值”。
 
数组知识点补充
for-each循环遍历
for-each(增强for循环)是JDK1.5增加的一种功能很强的循环结构,可以用来依次处理数组中的每个元素(其他类型的元素集合亦可),而不必为指定下标值而分心。
main方法的形参
参数String[] args的作用就是可以在main方法运行前将参数传入main方法中。
方法的可变参数
- 适用于参数个数不确定,但类型确定的情况,在java中把可变参数当做数组处理。
 - 在形参列表中,可变参数最多只能有一个(0或1),并且只能出现在形参列表的最后面。
 - 在方法体中,我们可以把可变参数当成数组来使用,可变参数本质上就是一个数组。
 - 调用拥有可变参数的方法时,实参和形参的个数可以不同,但是实参和形参类型必须一致。
 
Arrays工具类
- Arrays是用于操作数组的工具类,里面定义了操作数组的常见静态方法。
 public static String toString(Type[] arr),返回指定数组内容的字符串表示形式。public static boolean equals(Type[] a1, Type[] a2), 判断两个数组中的内容是否相同。public static boolean deepEquals(Type[] a1, Type[] a2),层次地比较两个数组是否相等,适用于多维数组。public static void sort(Type[] arr),对数组中的内容进行升序排序。public static int binarySearch(Type[] arr, Type key),查找key在数组中的索引位置。如果找到,则返回索引位置;如果没找到,则返回一个负数。注意:在调用之前,必须先对数组进行排序。public static void fill(Type[] a, Type val),给数组填充指定内容。public static Type[] copyOf(Type[] original, Type newLength),从数组的第一个元素开始拷贝,拷贝指定长度的数组,拷贝完成返回一个新的数组。public static Type[] copyOfRange(Type[] original, int from, int to),从指定范围拷贝数组,拷贝完成返回一个新的数组。*public static* <T> *List*<T> asList(T... a):将数组转换为List。注意:对于基本数据类型的数组(如int[]),不能直接使用此方法,需要使用包装类型数组(如Integer[])。
二维数组
数组中的每个元素都是一维数组,这样的数组就是二维数组(即“数组的数组”)。