Arrays类与Array类探究

来源:互联网 发布:有向图的关联矩阵 编辑:程序博客网 时间:2024/06/05 11:03

这里所说的Arrays类是util包中的java.util.Arrays,Array是反射包中的java.lang.reflect.Array。

首先介绍Arrays类的常用的静态方法:

1.排序方法:一系列重载的Arrays.sort(),参数是一个数组对象,可以是7种基本数据类型的数组,也可以是Object类型的数组。:

示例:

public static void main(String[] args) {int[] a = new int[] { 5, 6, 2, 1, 3, 8 };Arrays.sort(a);for (Object i : a) {System.out.print(i + " ");}}
2.二分查找方法:一系列重载的Arrays.binarySearch(),第一个参数是数组对象,第二个参数是要查找的值,有的重载可能不止有两个参数:

注意,此方法当且仅当在调用sort()方法后调用,返回值才有意义:

public static void main(String[] args) {int[] a = new int[] { 5, 6, 2, 1, 2, 8 };Arrays.sort(a);System.out.println();int index = Arrays.binarySearch(a, 5);System.out.println(index);//打印出3}
一开始数组是[5,6,2,1,2,8],在sort之后,数组变成了[1,2,2,5,6,8],用二分查找得到元素5的索引是3。

3.判断两个数组是否相同,也就是说判断两个数组的元素是否完全对应相同:Arrays.equals(),参数是两个数组对象,可以是null

public static void main(String[] args) {int[] a = new int[] { 5, 6, 2, 1, 2, 8 };int[] b = new int[] { 6, 5, 6, 2, 1, 9 };boolean same = equals(a, b);System.out.println(same);}
以上两个数组对象,因为第一个索引对应的值就不相同,所以返回是false。

4.把一个数组所有的元素都变成同一个值,一系列重载的Arrays.fill(),第一个参数是数组对象,第二个参数是数组各元素要变成的值:

public static void main(String[] args) {int[] a = new int[] { 2, 5, 8 };Arrays.fill(a, 3);for (int i : a) {System.out.print(i + " ");}}
fill()方法的内部实现其实就是按索引遍历数组,赋值。fill()方法执行过后,数组的的元素就都变成了指定的值,长度还是原来的长度。

5.复制一个数组,返回值是一个数组:Arrays.copyOf(),Arrays.copyOfRange():

copyOf()第一个参数是数组对象,第二个参数是要返回的数组的长度,从原数组的索引0处开始复制,如果要返回的数组的长度大于原来数组的长度,则多出来的是用默认值0补上的;

copyOfRange()第一个参数是参数对象,第二、第三个参数分别是开始索引及结束索引,这里索引的要求条件比较复杂,用的时候需要看下方法的源码。

public static void main(String[] args) {int[] a = new int[] { 2, 8, 5, 6 };int[] b = Arrays.copyOf(a, 6);int[] c = Arrays.copyOfRange(a, 1, 6);for (int i : a) {System.out.print(i + " ");}//打印结果是2 8 5 6<strong></strong>System.out.println();for (int i : b) {System.out.print(i + " ");}//打印结果是2 8 5 6 0 0System.out.println();for (int i : c) {System.out.print(i + " ");}//打印结果是8 5 6 0 0}

6.名字看起来很好,但是其实没什么卵用的一个方法,Arrays.asList(),参数是1个或者n个数组对象:

返回值是一个List对象,但是千万要注意,这个List对象的元素是原来的数组对象,而不是数组对象的元素,遍历的话得到的是数组对象,要想得到数组的元素,还得更深层的遍历,好鸡肋的方法:

public static void main(String[] args) {int[] a = new int[] { 2, 8, 5, 6 };int[] b = new int[] { 1, 3, 5 };List<int[]> list = Arrays.asList(a, b);System.out.println(list.size());//打印出2if (!CollectionUtils.isEmpty(list)) {for (int i = 0; i < list.size(); i++) {int[] c = list.get(i);if (c.length > 0) {for (int j = 0; j < c.length; j++) {System.out.print(c[j] + " ");}}}}//打印结果是2 8 5 6 1 3 5 }
7.用于数组简单打印的方法,Arrays.toString(),参数是一个数组对象,返回值是一个以左中括号开始、以右中括号结束的字符串。因为直接打印数组对象的话,会打印出我们看不懂的东西,所以如果只是想看看数组的元素是什么的话,就可以用这个方法,把数组转换成一个字符串,可以很轻松的看到数组的各个元素值:

public static void main(String[] args) {int[] a = new int[] { 2, 8, 5, 6 };String aStr = Arrays.toString(a);System.out.println(aStr);//打印出[2,8,5,6]}

接下来再介绍Array类的一些常用的静态方法:Array是动态生成和访问数组的工具类

1.生成数组对象的方法:Array.newInstance(),传两个参数,第一个参数是数组元素类型对应的Class对象,第二个元素是数组的长度:

public static void main(String[] args) {int[] a = (int[]) Array.newInstance(int.class, 3);Arrays.fill(a, 5);System.out.println(Arrays.toString(a));}
上面第一行代码创建了一个长度为3的int型数组,第二行代码把数组元素全部变成5,第三行代码简单打印此数组。

2.获得数组长度的方法:Array.getLength(),参数是一个数组对象。其实这个方法有点累赘了,获取数组长度直接用数组.length就好了:

public static void main(String[] args) {int[] a = (int[]) Array.newInstance(int.class, 3);System.out.println(Array.getLength(a));//打印出3}
3.获取某个数组的某个索引的值:Array.get(),Array.getXXX(),传两个参数,第一个参数是数组对象,第二个参数是索引值,效果等同于数组对象[i],所以基本不用这个方法

public static void main(String[] args) {int[] a = (int[]) Array.newInstance(int.class, 3);for (int i = 0; i < a.length; i++) {a[i] = 2 * i + 1;}Object b = Array.get(a, 1);System.out.println(b);int c = Array.getInt(a, 2);System.out.println(c);}
Array.get()返回值类型是Object,所以说如果传入的数组是别的接口返回的,自己不太清楚数组元素的类型时(极少数的情况),就可以用这个方法。Array.getInt()返回值则是int型。

4.设置某个数组的某个索引处的值:Array.set(),Array.setXXX(),传三个参数,第一个参数是一个数组对象,第二个参数是索引值,第三个参数是要设置成的值,效果等同于数组对象[i]=value,所以也基本不用这个方法:

public static void main(String[] args) {int[] a = (int[]) Array.newInstance(int.class, 3);a[0] = 6;Array.set(a, 1, 8);Array.setInt(a, 2, 10);System.out.println(Arrays.toString(a));}
综上,Array类最重要的方法就是newInstance(),用于动态产生一个数组。

0 0
原创粉丝点击