- 参考书:《Java语言程序设计与数据结构(基础篇)》—— 梁勇
文章目录
一、一维数组
1. 数组的存储
- 数组在JAVA中是对象,数组变量是一个引用数据类型,JVM将对象存储在一个称为堆(heap)的内存区域中,堆用于动态内存分配
- 关于一维数组的存储,参考:JAVA入门笔记4 —— 对比java和C/C++中数组的存储
2. 声明和创建一维数组
-
声明数组(创建数组变量)
- 声明数组仅仅创建一个对数组的存储位置,并不分配任何内存空间
- 如果变量不包含对数组的引用,那么这个变量的值为null,这时不能给数组分配任何元素(类似C指针)
-
创建数组(创建数组对象)
- 通过
new
在堆区创建一个数组对象 - 两种用法
- 通过定义同时赋值的方式,把创建的数组对象直接赋引用到一个数组变量
- 不赋引用到数组变量,这样就成为匿名数组,常用于方法传入的实参。使用匿名数组的策略仅仅就是创建、初始化、应用,因为它没有任何名字因此你没法重用它
- 通过
-
示例代码
- 声明数组(创建数组变量) int a[]; // 数组变量类似C语言的指针 int[] a; - 创建数组 new int[2]; // 创建一个确定长度的数组,元素初始化为默认值 - 创建一个数组并把其引用赋值给数组变量 a = new int[2]; // a是一个数组 - 创建数组并把它的引用赋给一个数组变量 int a[] = new int[2]; int[] a = new int[2]; - 创建数组并初始化 new int[2]{1,2}; // 创建一个确定长度数组并进行初始化赋值 - 创建数组变量、数组并初始化 int[] a = {1,2,3,4,5}; int a[] = {1,2,3,4,5}; - 匿名数组的使用示意 printArray(new int[]{1,2,3,4,5}); // 这里的数组没有显式地引用变量,称为 “匿名数组“”
3. 给数组元素赋值
- 必须先给数组变量赋一个已创建数组的引用,才能给数组元素赋值
- 赋值方式:
数组名[index] = value;
- 下标index从0开始
- 访问数组元素:
数组名[index]
4. 数组大小和默认值
-
给数组分配空间时,一定要指定此数组能存储的元素个数,从而确定数组大小
-
创建数组后,不能修改数组大小,不过可以把数组变量引用到其他尺寸的数组
-
可以用
数组名.length
得到数组大小 -
数组创建后,默认值为:
数据类型 默认值 int/short/long
等数值型数组0 char
‘\u0000’ boolean
false
5. foreach循环
- 这是java支持的一种简便for循环,用来遍历整个数组。类似C++11的auto变量方式
for(数据类型 元素变量: 数组名)
- 示例
for(double e:myList) { System.out.println(e); }
6. 复制数组
- 如果尝试用
=
,会改变数组变量引用的对象,并不能复制数组 如list2=list1;
这样会使list2
引用list1
引用的数组,而list2
引用的数组将无法被访问到,将被垃圾回收机制回收 - 复制数组的方法
- 用循环语句逐个复制元素
- 用System类中的静态方法
arraycopy
System.arraycopy(源数组名,源位置,目标数组,目标位置,复制长度);
- 使用
clone
方法复制数组
7. 数组和方法
(1)把数组传给方法
-
java传参方式:都是值传递
- 对于基本数据类型,传参数时传的是实参的值
- 对于数组类型,传实参时传的数组的引用(本质也是传值,不过传的是地址值,类似C语言传指针),所以在方法中通过形参修改数组对象,在方法外数组变化被保留;若仅仅修改形参本身(如指向其他数组对象),则方法外实参不受影响
-
参考:JAVA入门笔记3 —— 方法,中
三.2传参说明
-
示例
public static void main(String[] args) { int[] arr = { 1, 3, 5, 7, 9 }; } public static void printArray(int[] arr) { for (int i = 0; i < arr.length; i++) System.out.println(arr[i]); }
(2)方法返回数组
- 返回的也是值传递(返回数组的内存地址),类似传参
- 示例
public static void main(String[] args) { int[] arr = getArray(); for (int i = 0; i < arr.length; i++) System.out.println(arr[i]); } public static int[] getArray() { int[] arr = { 1, 3, 5, 7, 9 }; return arr; }
8. 可变长参数列表
-
具有同样类型的数目可变的参数可以传递给方法,并在方法内作为数组对待
-
定义方法:
修饰符 返回值类型 方法名(类型名...参数名) { //code }
-
示例:
public static void printMax(double...numbers) { // 可以写numbers.length / number[i] 之类的,方法内当成数组处理就行了 } printMax(2,3,4,5,6,11,2.3); // 传递一个变长参数列表 printMax(new double[]{1,2,3}); // 传递一个数组
9. Arrays类
java.util.Arrays
类包含一些用于数组的常见操作java.util.Arrays.sort(数组名); //对整个数组从小到大排序 java.util.Arrays.parallelSort(数组名,n1,n2); //对数组[n1,n2)从小到大排序 java.util.Arrays.binarySearch(数组名,查找的元素);//要求数组必须提前按升序排好。如果能找到,返回元素下标;如果找不到,设被查找元素在下标index和index+1之间,返回(-index+1) java.util.Arrays.equals(数组名1,数组名2); //判断两个数组是否严格相等,返回true/false java.util.Arrays.fill(数组名,元素); //把整个数组用元素填充 java.util.Arrays.fill(数组名,n1,n2,元素); //把数组[n1,n2)用元素填充 java.util.Arrays.toString(数组名); //返回数组的字符串,如[5, 5, 5, 4, 3, 2, 1]
二、二维数组
1. 数组的存储
- 数组在JAVA中是对象,数组变量是一个引用数据类型,JVM将对象存储在一个称为堆(heap)的内存区域中,堆用于动态内存分配。
- 二维数组本质上是一个每个元素都是一个一维数组的数组,更高维数组依次类推,只有最后一维存储真正的数据,其他维都存着下一维的引用地址。
// 例如有`matrix[5][3]` matrix.length = 5; matrix[0].length = 3;
- 关于二维数组的存储,参考:JAVA入门笔记4 —— 对比java和C/C++中数组的存储
2. 声明和创建二维数组
- 示例代码
- 声明二维数组(创建二维数组变量) int[][] matrix; int matrix[][]; // 不推荐此写法 - 创建二维数组 + 数组变量赋引用 matrix = new int[5][5]; - 创建二维数组变量 + 创建二维数组 + 数组变量赋引用 int[][] matrix = new int[5][5]; - 创建二维数组变量 + 创建二维数组 + 数组变量赋引用 + 数组初始化 int[][] matrix = { {1,2,3}, {2,3,4}, {3,4,5}}; - 用new语法创建二维数组 用new语法创建二维数组必须指定数组行数,如 int[][] = new[5][]; - 不规则数组 不规则数组也是二维数组,本质也是一个每个元素都是一个一维数组的数组,只是每一个一维数组元素长度不同 int [][]matrix = { {1,2,3,4,5}, {1,2,3,4}, {1,2,3,}, {1,2}, {1} };
3. 二维数组与方法
- 示例代码
// 二维数组作为参数 public static int sum(int[][] m) { int total = 0; //add some code here,calculate the sum of matrix m return total; } // 二维数组作为返回值 public static int[][] getArray() { Sacnner input = new Sacnner(System.in); int[][] m = new int[3][4]; //input something and fill the matrix m return m; }