文章目录
一、数组的基本用法
1.数组是什么?
数组也是一种数据结构,它本质上就是让我们能“批量”创建想同类型的变量。数组是引用类型,引用指向的是一个对象,也可以说,有地址的变量就称为引用。
注意:在Java中,数组中的变量必须是相同类型的。
2.数组的创建
数组的创建有三种方法:
// 动态初始化
数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };
// 静态初始化
数据类型[] 数组名称 = { 初始化数据 };
代码示例:
int[] array2 = new int[] {1,2,3,4,5};
int[] array3 = new int[5];
int[] array1 = {1,2,3,4,5};//常用
3.数组的使用
(1)访问数组中的元素时利用角标,读取数组长度时使用数组名.length获取,用角标访问元素。
int[] array = {1,2,3,4,5};
System.out.print("访问数组元素:" + array[0]);
Systen.out.print("访问数组长度:" + array.length);
注意:访问数组长度array.length"的"."符号表示调用,也是成员访问操作符.方括号中放的是角标,数组中从0开始。访问数组元素时,不能超过数组的长度,否则会出现数组越界的异常。
(2)数组的遍历,打印数组
打印数组有三种方法:for循环,foreach循环(增强for循环),Arrays.toString()
代码示例:
int[] array = {1,2,3,4,5};
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
for (int x:array
) {
System.out.print(x + " ");
}
System.out.println();
System.out.println(Arrays.toString(array));
运行结果
for与foreach的区别:
对于for来说,可以利用i来对数组进行改变元素值、求元素位置等操作。而foreach只能遍历数组,而不能进行角标操作。
Arrays.toString()是操作数组工具类,直接从库中调用的。
二、数组作为方法的参数
1.基本用法
public static void printArray(int[] a) {
for (int x : a) {
System.out.println(x);
}
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
printArray(arr);
}
这个代码中,int[] a是函数形参,int[] arr是函数的实参,我们在传参时传的是引用。
2.理解引用类型
import java.util.Arrays;
public class transformArray {
/**
* 传参传的是引用
* 修改原数组的值
* 使原数组的值都是原来的二倍
* @param args
*/
public static int[] tArray(int[] array){
for (int i = 0; i < array.length; i++) {
array[i] *= 2;
}
return array;
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
int[] arr = tArray(array);
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(arr));
}
}
在这个代码中,我们重新定义了一个数组,改变原数组值后存入了新数组中,所以原数组元素值不变。
3.认识null
null 在 Java 中表示 “空引用” , 也就是一个无效的引用。null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作。 一旦尝试读写, 就会抛出NullPointerException(空指针异常)
三、数组作为方法的返回值
代码示例:
import java.util.Arrays;
public class reverse {
/**
* 逆序输出数组
* @param args
*/
public static int[] reverse(int[] array){
int tmp = 0;
int i = 0;
int j = array.length-1;
while (i < j){
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
i++;
j--;
}
return array;
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6};
int[] ret = reverse(array);
System.out.println(Arrays.toString(ret));
}
}
由于数组是引用类型,返回时只是将这个数组的首地址返回给函数调用者,此方法没有拷贝数组内容,从而比较高效。
备注:函数类型为int[] 型!
四、数组的其他应用
1.数组转字符串
import java.util.Arrays
int[] arr = {1,2,3,4,5,6};
String newArr = Arrays.toString(arr);
System.out.println(newArr);
运行结果
注意:代码中,Arrays,toString()是库函数,直接调用,其实我们也可以写一个我们自己的数组转字符串函数
public class myselfTostring {
/**
* 实现自己的数组转字符串
* @param args
*/
public static String toString(int[] array){
String str = "[";
for (int i = 0; i < array.length; i++) {
str = str + array[i];
if(i != array.length -1){
str += ",";
}
}
str += "]";
return str;
}
public static void main(String[] args) {
int[] array = {1,2,3};
String ret = toString(array);
System.out.println(ret);
}
}
2.数组拷贝
数组的拷贝又被称作克隆,数组的克隆共有四种方法:for循环,Arrays.copyOf(),System.arrayCopy(),数组名.clone。
其中System.arrayCopy()效率最高
import java.util.Arrays;
public class copyArray {
/**
* 拷贝数组
* for循环
* Arrays.copyOf()
* System.arrayCopy();这种方法参数较多,里面有5可参数,分别是原数组,原数组位置,拷贝后数组,拷贝后数组位置,拷贝长度
* 数组名.clone();需要用int来接收
* @param args
*/
public static void copyOf(int[] array){
int[] ret = new int[array.length];
for (int i = 0; i < array.length; i++) {
ret[i] = array[i];
}
System.out.println(Arrays.toString(ret));
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
System.out.print("Arrays.toString()方法拷贝:");
System.out.println(Arrays.toString(array));
int[] ret =new int[array.length];
System.out.print("for循环方法拷贝:");
copyOf(array);
System.out.print("Arrays.copyOf()方法拷贝:");
int[] newArr = Arrays.copyOf(array,array.length);
System.out.println(Arrays.toString(newArr));
System.out.print("数组名.arraycopy()方法拷贝:");
System.arraycopy(array,0,ret,0,array.length);
System.out.println(Arrays.toString(ret));
System.out.print("array.clone()方法拷贝:");
int[] rrt = array.clone();
System.out.println(Arrays.toString(rrt));
System.out.print("拷贝某一范围:");
System.out.println(Arrays.toString(Arrays.copyOfRange(array,1,4)));
}
}
运行截图
备注:如果数组中存放的是基本数据类型,则引用类型是浅拷贝,如果拷贝完之后,通过引用改变拷贝的值,不影响原数组成为深拷贝。