- 参考书:《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; }
版权声明:本文为wxc971231原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。