在上篇博客,我们了解了数组的概念,学习了数组的一些基本操作,但是有没有觉得很麻烦勒?
java中提供了两个很方便的操作数组的类,用于数组的动态创建及方法调用,下面我们就来学习一下这两个类。
Array是java.lang.reflect下的一个类,并且不能被new出来,也就是不能被实例化,它的构造器被private所修饰,且由于类被final修饰因此不能被继承,参考源码如下
package java.lang.reflect;
/**
* The {@code Array} class provides static methods to dynamically create and
* access Java arrays.
*
* {@code Array} permits widening conversions to occur during a get or set
* operation, but throws an {@code IllegalArgumentException} if a narrowing
* conversion would occur.
*
* @author Nakul Saraiya
*/
public final
class Array {
/**
* Constructor. Class Array is not instantiable.
*/
private Array() {}
// 以下省略
}
该类中提供了一系列的静态方法,我截取源码中的一部分看看
public static Object newInstance(Class> componentType, int length)
throws NegativeArraySizeException {
return newArray(componentType, length);
}
public static Object newInstance(Class> componentType, int... dimensions)
throws IllegalArgumentException, NegativeArraySizeException {
return multiNewArray(componentType, dimensions);
}
public static native int getLength(Object array)
throws IllegalArgumentException;
public static native Object get(Object array, int index)
throws IllegalArgumentException, ArrayIndexOutOfBoundsException;
public static native void setBoolean(Object array, int index, boolean z)
throws IllegalArgumentException, ArrayIndexOutOfBoundsException;
可能看到这里有点懵逼啊。。。啥玩意,static倒是认识,native是个什么鬼?
你们也不用去百度了,我已经百度过了,度娘里的大神是这么说的:native主要用于方法上1、一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。2、在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
因为java是由c编写的,那么这一部分的代码应该是由c去实现的,我们不用关心它是怎么实现的,我们只需要会使用即可
public static void main(String[] args) {
int[] array = {1,2,3};
System.out.println(Array.get(array,1)); // 获取一个数组下标为1的元素,返回为object对象
System.out.println(Array.getInt(array,2)); // 获取一个数组下标为2的元素,返回为int
Array.setInt(array,2,4); // 设置数组下标为2的元素为4,此时数组为{1,2,4}
String[] strings = (String[]) Array.newInstance(String.class,3); // 创建一个长度为3的字符串数组
}
大概也就以上几类方法,也比较简单,就不具体展开了,使用的较少,我们主要还是看Arrays类
这个类提供的好用的方法远远多于Array,也是平时我们开发时候经常使用的一个工具类,下面来看看
Arrays是java.util包下的一个工具类,提供了许多对数组操作的静态方法,包括数组的排序,对比,转化等等系列方法,十分的好用。
Arrays.toString
public static void main(String[] args) {
int[] array = {3,2,1,4,5};
System.out.println(array); // 输出 [I@61bbe9ba
System.out.println(Arrays.toString(array)); // 输出 [3, 2, 1, 4, 5]
}
Arrays.sort
从小到大排序
public static void main(String[] args) {
int[] array = {3,2,1,4,5};
Arrays.sort(array); // 从小到大排序
System.out.println(Arrays.toString(array)); // 输出 [1, 2, 3, 4, 5]
}
查看了一下Arrays的方法,并没有提供从大到小的排序方法,那么如何从大到小排序呢?我们就需要重写compare方法来实现从大到小。看到这里,经常使用python来进行编程的朋友可能要骂娘了,我靠,这么麻烦,python中一个sorted函数不就搞定啦?那也没办法,java就是这个亚子,接受吧!
从大到小排序
public static void main(String[] args) {
Integer[] array = {3,2,1,4,5};
Comparator cmp = new Comparator() {
public int compare(Integer i1, Integer i2) {
return i2-i1;
}
};
Arrays.sort(array,cmp); // 从大到小排序
System.out.println(Arrays.toString(array)); // 输出 [5, 4, 3, 2, 1]
}
其实还有一种方法是这个亚子的,偷偷告诉你们,要牢记于心,不然就要像上面一样重写方法啦,懒人才不会去重写!
public static void main(String[] args) {
Integer[] array = {3,2,1,4,5};
Arrays.sort(array, Collections.reverseOrder()); // 从大到小排序
System.out.println(Arrays.toString(array)); // 输出 [5, 4, 3, 2, 1]
}
Arrays.equals 比较一维数组
Arrays.deepEquals 比较多维数组
public static void main(String[] args) {
int[] array1 = {1,2,3};
int[] array2 = {1,2,3};
int[] array3 = {1,2,4};
System.out.println(Arrays.equals(array1,array2)); // 数组的比较,返回true
System.out.println(Arrays.equals(array1,array3)); // 数组的比较,返回false
}
public static void main(String[] args) {
Integer[][] array1 = {{1,2,3}};
Integer[][] array2 = {{1,2,3}};
Integer[][] array3 = {{1,2,4}};
System.out.println(Arrays.equals(array1,array2)); // 多维数组的比较,返回false
System.out.println(Arrays.equals(array1,array3)); // 多维数组的比较,返回false
System.out.println(Arrays.deepEquals(array1,array2)); // 多维数组深比较,判断是否是同一个对象,返回true
}
toArray
Arrays.asList
public static void main(String[] args) {
Integer[] array = {1,2,3};
List arrayList = new ArrayList<>(Arrays.asList(array)); // 数组转ArrayList
System.out.println(arrayList); // 输出 [1, 2, 3]
arrayList.toArray(); // ArrayList转数组
}
Arrays.fill
public static void main(String[] args) {
Integer[] array = new Integer[5];
Arrays.fill(array,0,3,9); // 给数组下标 0~2的元素填充9
System.out.println(Arrays.toString(array)); // 输出[9, 9, 9, null, null]
}
Arrays.copyOf
public static void main(String[] args) {
Integer[] array = {1,2,3,4,5};
Integer[] arrayCopy = Arrays.copyOf(array,10); // 拷贝并生成一个新的数组对象,并设置长度为10
System.out.println(Arrays.toString(arrayCopy));
}
以上就是常用的一些Arrays的方法,上面只是举了一些demo,还需要勤加练习才能熟练掌握。