目录
一维数组定义格式
int[] array1 = {1,2,3,4};//整型数组 下标从0开始
int[] array2 = new int[10];//定义了一个大小为10的整型数组 10个0
int[] array3 = new int[]{1,2,3,4,5,6,7};//可简写成1的形式
数组是相同类型元素的集合,在内存上是一块连续的空间。
下面我们来输出这些数组看看里面存的是什么。
System.out.println(array1);//[I@1b6d3586
System.out.println(array2);//[I@4554617c
System.out.println(array3);//[I@74a14482
你可以将 [I@74a14482 理解为地址,实际上这不是真实的地址,而是一个哈希值。数组是引用变量,也就是存储“地址”的变量。
这只是一个草图,希望可以帮助你理解一维数组。
还可以这样定义
int[] array4;
array4 = new int[10];
int[] array5;
array5 = new int[]{1,2,3,4,5};
注意:以下的定义格式是不被java允许的。
int array6;
array6 = {1,2,3,4,5,6};不允许这样写
上面我们只是定义了int类型的一维数组,当然也可以定义其他格式。
char[] array = new char[10];//十个空
double[] array2 = new double[10];//十个0.0
boolean[] array3 = new boolean[10];//十个false
String[] array4 = new String[10];//十个null
一维数组的使用
int[] array1 = {1,2,3,4};
System.out.println(array1[0]);
System.out.println(array1[1]);
System.out.println(array1[2]);
System.out.println(array1[3]);
要注意数组下标是从0开始的,通过上面的代码,可以分别输出array1[0] , array1[1] , array1[2] , array1[3] 的值 1、2、3、4。
如果我们输出array1[4]会出现什么结果呢?
System.out.println(array1[4]);
这种错误叫做数组越界异常 。因此我们在使用一维数组是,一定要注意下标的范围。
一维数组的遍历
第一种方法,我们可以通过for循环 注意:数组长度可以通过 数组名.length获得
System.out.println(array1.length);//array1的长度
//打印数组方法
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i]+" ");
}
System.out.println();//换行
第二种方法,我们可以通过foreach foreach循环拿不到array1的下标,他只是将array1[]的值依次存到int x中并输出。这是他和for循环的本质区别。
//foreach循环 数组元素存入哪里:数组名称
for (int x: array1) {
System.out.print(x+" ");
}
System.out.println();
一维数组的赋值
下面我们再定义一个一维数组array2,将array1的值赋给array2
int[] array2 = array1;
如果我们通过array2改变其中一个值,会对array1产生影响吗?如果是基本数据类型,答案一定是不会,但数组是引用型数据类型,答案又是什么呢?
array2[0] = 99;
System.out.println(array1[0]);
输出结果是 99 。你可以在你的电脑上试验一下。由此我们可以知道,array1和array2这两个引用同时指向了一个对象 。那么问题来了,引用可以指向引用吗? 答案是不可以!!array2这个引用指向了array1这个引用所指向的对象 。因为array1和array2指向同一个对象,所以通过array2修改对象的值时,array1使用的是修改之后的值 。
画个草图帮助你来理解。
如果你定义了一个一维数组,里面暂时不存数据的话,你可以给一维数组赋值为null,但是我们不建议这样写。
//int[] array3 = 0; error
int[] array3 = null;
//代表array3这个引用不指向任何对象
System.out.println(array3.length);//空指针异常
你不可以直接赋值为0,这是不允许的,一定要赋值为null 。
一维数组的打印
借助工具类 将数组转化成字符串输出。
String s = Arrays.toString(array1);
System.out.println(s);
System.out.println(Arrays.toString(array1));
数组的拷贝
第一种方法:for循环赋值
int[] copy1 = new int[array1.length];//[]中允许是变量
for (int i = 0; i < array1.length; i++) {
copy1[i] = array1[i];
}
System.out.println(Arrays.toString(copy1));
第二种方法:使用Array.copyof(源数组,要拷贝的长度)
int[] copy2 = Arrays.copyOf(array1,array1.length);
System.out.println(Arrays.toString(copy2));
用这种方法可以给数组扩容
int[] copy3 = Arrays.copyOf(array1,array1.length*2);
System.out.println(Arrays.toString(copy3));//[1, 2, 3, 4, 0, 0, 0, 0]
第三种方法:使用Array.copyOfRange(源数组,拷贝的起始位置,拷贝的结束位置) ,在java中范围一般是左闭右开[1,3) ,如果范围超过数组长度,能拷贝多少拷贝多少。
int[] copy4 = Arrays.copyOfRange(array1,1,3);
System.out.println(Arrays.toString(copy4));
第四种方法:System.arraycopy(源数组 源数组开始拷贝的位置 目的数组 目的数组的哪个位置 拷贝的长度)
int[] copy5 = new int[array1.length];
System.arraycopy(array1,0,copy5,0,array1.length);
System.out.println(Arrays.toString(copy5));
判断以下方法是否为数组的拷贝
int[] array2 = {1,2,3,4,5};
int[] array3 = array2;
System.out.println(Arrays.toString(array3));
回答:不是,数组数据在内存上还是一份。
一维数组二分查找
在java中,你可以自己编写二分查找的方法,当然java也给你提供了这个方法 binarySearch
System.out.println(Arrays.binarySearch(array1, 10));
Array.equals
用于比较2个数组对应位置的数据是否一样
int[] array3 = {1,5,6,7,9,10};
int[] array4 = {1,5,6,7,9,10};
boolean flag = Arrays.equals(array3,array4);
System.out.println(flag);
Array.fill
用于填充数据
int[] array5 = new int[10];
Arrays.fill(array5,-1);//把array5中的数据全部填充成-1
System.out.println(Arrays.toString(array5));//[-1, -1, -1, -1, -1, -1, -1, -1, -1,
//-1]
Arrays.fill(array5,1,4,2);//从[1,4)填充成2
System.out.println(Arrays.toString(array5));//[-1, 2, 2, 2, -1, -1, -1, -1, -1, -1]
以上是一维数组的介绍,希望对你有帮助。