前言
本文将对java数组做详细介绍:包括一维二维数组的定义,封装类Arrays和数组封装方法做一点介绍,
最后介绍几道数组的编程题目的解法。
一、数组
一维数组
在Java中有两种数据:primitive类型和objects.
数组必须初始化后才可使用。
数组属于object类型,所以必须用new来创建数组,同时数组具备一下特性:
1. 数组创建之后就不能改变大小
2. 数组创建之后,若没有指定初始值,则依据数组类型的不同,会预设不同的初始值
数组初始化方式:
1、静态初始化:Int[] arr1= new int[]{1,2,3,4,5};或int[] arr1={1,2,3,4,5};
2、动态初始化:Int[] arr1=new int[5]; // 创建一个可容纳5个元素的数组
3. 数组有一个length属性,可以取回数组中元素的个数
二维数组
二维数组用数组“名称”与“两个索引”来指定存取数组中的元素。
其定义方式与一维数组类似:
1、静态初始化:int[][] arr1= {{1,2,3}, {4,5,6}};
2、动态初始化:int[][] arr1=new int[3][3];
注意length所代表的长度,数组名后直接加上length(如arr.length),所指的是数组有几行; 指定索引后加上length(如arr[0].length),指的是该行拥有的元素,也就是列的数目。
值得注意的是,数组的游标是从0 开始的,比如一位数组的第一个元素:arr1[0]=1; arr[4]=5;
二位数组中:arr2[0][0]=1; arr2[2][2]=6;
二、数组封装类和方法的使用
1.数组的复制
1). 使用System.arraycopy()方法,可以赋值一个数组的部分值到另一个数组
System.arraycopy(来源,起始索引,目的,起始索引,复制长度);
例如:
int[]arr1 = {1,2,3,4,5};
int[]arr2 = new int[5];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);//之后数组2的值等于数组1的值
2). 在Java SE 6中,Arrays类新增了copyOf()方法,可以直接返回一个新的数组对象,而其中包括复制的内容
例如:
import java.util.Arrays;
int[]arr1 = {1,2,3,4,5};
int[]arr2 = Arrays.copyOf(arr1,arr1.length);
Arrays的copyOf()方法返回的数组是新的数组对象,所以改变返回数组中元素的值不会影响原来数组中元素的值。copyOf()方法中第二个变量指定新数组的长度,如果新数组的长度超过原来数组的长度,则多出来的元素会保留数组默认值。
除了copyOf()方法外,还有copyOfRange()方法,可以指定来源数组以及要复制的索引范围:
int arr1= {1,2,3,4,5};
intarr2 = Array.copyOfRange(arr1,1,4); // 复制索引1开始到索引4(但不包括索引4)的元素,arr2的元素会是2,3,4
2.Arrays类
Array类位于java.util包中,它提供了几个方法可以直接使用:
sort() - 对指定数组排序,作用是快速排序法
使用方法:用一个例子就可以说清楚:int[] arr={1,4,6,3,9,7};
使用类里面的方法:Arrays.sort(arr);之后数组的值会从小到大排列 arr={1,3,4,7,9};
binarySearch() - 让你对已排序的数组进行二分查找,如果找到指定的值就返回该值所在的索引,否则就返回负值
使用方法介绍:也是用上面一个数组来说:intnum=Arrays.binarySearch(arr,6);那么num=2
需要注意的是:括号里面有两个参数:第一个是数组名称,第二个是要在数组中查找的元素,
如果数组中没有这个元素就返回一个负数,否则返回的值是数组元素游标的值
fill() - Arrays.fill()将已创建数组的默认值改为指定值
使用:Arrays.fill(arr,3);使用后arr数组里面的全部值都变成3了
Arrays.equals() - 比较两个数组中的元素值是否全相等,如果相等返回true,否则返回false
boolean b=Arrays.equals(arr1,arr2);
Arrays.toString()- 可以一次输出数组的元素,每个元素之间用逗号相隔
System.out.println(Arrays.toString(arr));
Arrays类里面还有很多其他的封装的方法,如果有兴趣的话可以查看相关文档或浏览API;
3.foreach与数组
在Java SE 中, foreach的语法为:
int[] arr ={1,2,3,4,5};
for(int i : arr){
System.out.println(element);
}
结果将会依次输出数组arr里面的值
注意, i 类型必须与数组元素类型相同
4.一些题目分享
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
程序分析:创建一个五位数数的数组,把输入数字的每位数的值赋值到数组里面
* 把输入 数字从个位起获取,并且每获取一次之后/10,这样就能分别获取十位百位千位了
* 把数字打印出来就是题目所求了
代码演示:
运行结果:
程序示例2
题目:打印出杨辉三角形(要求打印出10行如下图)
程序分析:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1、二维数组的使用
2、第一列的数都是1
3、使用两个for循环,i控制行,j控制列;
从第二行第二列起arr[i][j]=arr[i-1][j-1]+arr[i-1][j]
代码演示:
总结
数组区别于其他容器的特性有三个:高效率,可以精确持有类型信息,可以持有基本类型。数组是Java中用来持有和访问对象最高效的方式,没有之一。数组的存储方式是简单的线性序列,这是导致其能告诉访问的根本原因。大家可能会想ArrayList不是和数组的特性非常相似么,为什么不使用ArrayList来代替Array。况且ArrayList还提供了更多的方法,并且可以动态的更改容器大小以适应元素的增加。那么我只能说,他提供这些额外的功能都有一定的开销的(别的不说,get这种使用Object类型参数的方法,向上转型是不是要开销?)。在我们追求极限效率的情况下,使用数组是一种更好的选择。