鄙人才疏学浅,初识Java,抱着一颗无畏而炽热的心踏上Java不归路,希望与志同道合之人一起分享心得与经验,提高自己,挑战自己,共同进步。路漫漫其修远兮,吾将上下而求索!废话少说,上重点,下面和大家聊聊我对数组的理解和总结。
一 、数组是什么
在Java中,只有8中基本数据类型,即boolean、char、byte、short、int、long、float、double。很显然,数组不属于基本数据类型。其实,在Java中,数组是以对象的形式存在的(Java数组继承自Object类),既然我们知道数组是对象了,那么它有哪些特点呢?
- 数组是长度固定的数据结构,存储的元素必须具有相同的数据类型。
- 数组的下标从0开始,即第0位表示数组的第一个元素,数组的length属性表示数组的长度。
- 在编译时,编译器不会自动检查索引是否越界,但在运行期间会抛出异常,即ArrayIndexOutOfBoundsException,这是数组中最容易出现的异常,必须牢记。
二 、定义数组
方式1(推荐使用)
type[] array = new type[元素个数];
如:int[] array = new int[10];
array[0] = 1;
......;
方式2
type array[] = new type[元素个数];
如:int array[] = new int[10];
array[0] = 1;
......;
方式3(直接初始化)
type[] array = new type[]{元素值,中间用逗号隔开};
其中new type[]也可以省略
如:int[] array = new int[]{1,2,3,4,5,6};
int[] array = {1,2,3,4,5,6};
三 、数组的属性及操作方法
1. length属性:
在数组中定义了一个length属性,即 public static final int length ,表示数组的长度,在数组定义完后,该数组的length值就不会改变。
2. 数组的拷贝方法
- 在Java编程中,System类中提供了一种特殊的方法拷贝数组,即public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
参数:src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。
以下为实现该方法的代码:
public class Test {
public void testArrayCopy(int[] oldArray){
//获取数组的长度
int length = oldArray.length;
//遍历oldArray数组:增强型for循环
System.out.print("oldArray:");
for(int i : oldArray){
System.out.print(i+" ");
}
//换行
System.out.println();
//创建新的数组newArray
int[] newArray = new int[length];
//将oldArray的内容复制到newArray中
System.arraycopy(oldArray, 0, newArray, 0, length);
//遍历newArray数组:使用索引进行遍历
System.out.print("newArray:");
for (int i = 0; i < length; i++) {
System.out.print(newArray[i]+" ");
}
}
运行结果如下:
oldArray:1 2 3 4 5 6 7 8 9
newArray:1 2 3 4 5 6 7 8 9
- 数组的拷贝有另外一种方法,在Object类中提供了另外一种方法,clone(),因为所有对象都是Object的子类,所有数组继承了该方法。
以下为实现该方法的代码
public class TestClone {
public static void main(String[] args) {
int[] oldArray = {1,3,5,7,9};
int[] newArray = oldArray.clone();
System.out.print("oldArray:");
for(int i : oldArray){
System.out.print(i+" ");
}
System.out.println();
System.out.print("newArray:");
for(int i : newArray){
System.out.print(i+" ");
}
}
}
运行结果如下:
oldArray:1 3 5 7 9
newArray:1 3 5 7 9
3. 数组的比较
在Java中,”==”是用来比较两个对象的引用是否相同,而不是比较对象的内容是否相等。在Object类中,有equals()方法,其实Object中的equals()方法和”==”是相同的,数组却没有重写equals()方法,所以数组用equals()和”==”进行对象的比较会得到相同的结果。但是,有没有比较数组内容是否相同的方法?答案是肯定的。Java工具包提供了一个数组类(下面会详细介绍),Arrays类重写了equals()方法,用于进行数组内容的比较。另外自己也可以编写代码实现数组内容的比较,比较简单,代码在这里就不写了。
实现代码如下:
import java.util.Arrays;
public class TestEquals {
public static void main(String[] args) {
int[] a = {2,4,6,8};
int[] b = {2,4,6,8};
System.out.println("a==b : "+(a==b));
System.out.println("a.equals(b) : "+a.equals(b));
System.out.println("Arrays.equals(a, b) : "+Arrays.equals(a, b));
}
}
运行结果如下:
a==b : false
a.equals(b) : false
Arrays.equals(a, b) : true
四 、 二维数组的介绍
简单来说,二维数组就是在一维数组里面再嵌套一个数组。而为数组的定义和初始化极为相似,下面列举一种创建方式。
type[][] array = new type[行][列];
下面用代码实现一下二维数组的打印,代码如下:
public class Two_Array {
public static void main(String[] args) {
//静态初始化方式创建二维数组,数组每行的个数也不必要求必须相等。
int[][] array = {{1,2,3,4},{5,6,7},{8,9}};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
}
运行结果如下:
1 2 3 4
5 6 7
8 9
五 、数组类–Arrays
该类在”java.util”包中,它提供一些方法,这些方法全部为static方法,可以通过Arrays类直接调用,并且对这些方法进行了重载(方法名相同,参数不同)。常用方法如下:(参数没写,详情看API文档)
equals() 比较数组内容是否相同,上面已介绍。 sort() 对该数组按数字进行升序排序 toString() 将数组以字符串的形式返回 binarySearch() 使用二分搜索法来搜索指定的type型数组,以获得指定的 值。(使用该方法之前,必须先对该数组从小到大进行排序) fill() 将指定的type值分配给指定type型数组的每个元素。 copyOf() 复制指定的数组,截取或用默认值填充(如有必要),以使副本具有指定的长度。 copyOfRange() 将指定数组的指定范围复制到一个新数组。
上述一些方法的具体实现如下:
import java.util.Arrays;
public class TestArrays {
public static void main(String[] args) {
int[] array = {3,1,6,9,8,5,2,7,4};
//打印原数组:
System.out.print("原数组为:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
//调用sort()方法对数组进行排序
Arrays.sort(array);
System.out.print("\n"+"排序后: ");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
System.out.print("\n"+"将数组转换为字符串: ");
String str = Arrays.toString(array);
System.out.print(str);
//fill()方法
System.out.print("\n"+"将数组的第二位到第六位填充为0,填充后的数组为:");
//第一个参数为数组,第二个参数为起始位置,第三个参数为结束位置(不包括),第四个参数为填充的值
Arrays.fill(array,1,6,0);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
//copyOf()方法,第一个参数为原数组,第二个参数为截取的长度。如果超过原数组长度,则用默认值代替,如下:
int[] newArray = Arrays.copyOf(array, 13);
System.out.print("\n"+"copyOf()方法:");
for (int i = 0; i < newArray.length; i++) {
System.out.print(newArray[i]+" ");
}
//copyOfrange(),第一个参数为原数组,第二个参数为起始位置,第三个参数为结束位置(不包括),例子如下:
System.out.print("\n"+"copyOfRange()方法:");
int[] newArray2 = Arrays.copyOfRange(array, 0, 8);
for (int i = 0; i < newArray2.length; i++) {
System.out.print(newArray2[i]+" ");
}
}
}
运行结果如下:
原数组为:3 1 6 9 8 5 2 7 4
排序后: 1 2 3 4 5 6 7 8 9
将数组转换为字符串: [1, 2, 3, 4, 5, 6, 7, 8, 9]
将数组的第二位到第六位填充为0,填充后的数组为:1 0 0 0 0 0 7 8 9
copyOf()方法:1 0 0 0 0 0 7 8 9 0 0 0 0 copyOfRange()方法:1 0 0 0 0 0 7 8
六 、总结
经过一上午的奋斗,我的第一篇博客终于诞生啦,虽然有很多瑕疵,但是心情还是很激动的,毕竟人生的第一次就这样没有了,哈哈。写博客,是很严谨的一件事,要查阅相关资料,立足确保知识的正确性,在写博客的过程中,也收获了很多,查漏补缺,希望自己再接再厉,加油!