Array类是Java.lang.reflect包中的一个类,该类不允许继承和实例化,由该类在java的反射包下可知该类用于动态地创建和访问java数组。
Arrays类位于Java.util包下,主要提供了对数组进行操作的一些方法,比如排序、搜索、复制等。此类还包含一个允许将数组作为列表来查看的私有静态内部类。
1 . Array类创建数组以及通过get、set对数组访问的方法底层都是通过JNI调用native的C代码。
2 . Array类允许在执行 get 或 set 操作期间进行扩展转换,但如果发生收缩转换,则抛出 IllegalArgumentException。
import java.lang.reflect.Array;
public class TestArray {
public static void main(String[] args) {
int [] arrInt = {1,2,3};
System.out.println(Array.getLength(arrInt));// 3
//获取index对应的数据
System.out.println(Array.get(arrInt, 1));
//class java.lang.Integer --->可知get时会对基本数据类型进行自动装箱
System.out.println(Array.get(arrInt, 1).getClass());
System.out.println(Array.getDouble(arrInt, 2));//允许get时向上转型
System.out.println(Array.getByte(arrInt, 2));//向下转型thorw IllegalArgumentExeception
Array.setByte(arrInt, 0, (byte)5);//set同样允许向上转型
Array.setLong(arrInt, 0, 5);//向下转型thorw IllegalArgumentExeception
Array.set(arrInt, 0, new Integer(5));//可知set时会对基本数据类型进行自动拆箱
}
}
3 . Array类提供两个动态创建数组的方法,其内部仍然是调用了native的C代码:
public static Object newInstance(Class> componentType, int length)
用于根据传入的componentType和length动态地创建数组。
public static Object newInstance(Class> componentType, int... dimensions)
该方法传入int类型的可变参数,用于动态地创建二维数组。
1 . sort()和toString()
import java.util.Arrays;
import javalearn.List.Car;
public class TestArrays {
public static void main(String[] args) {
long [] arrLong = {7,8,9,1,2,3} ;
Arrays.sort(arrLong,1,5);
System.out.println(Arrays.toString(arrLong));//-->[7, 1, 2, 8, 9, 3]
//Arrays类封装了常用的数组排序方法,注意index参数的toIndex并不是指下标,该参数可取数组的length,
//排序时只排到toIndex-1。而fromIndex指的就是开始的下标。
//Arrays类还重写了toString方法,用来输出数组元素,对于Object类型,先调用的是String类的valueOf(Object o)方法,
//再调用Object的toString。
Object [] arrObj = {new Car(30,"Audi"),new Car(40, "BWM")};
System.out.println(Arrays.toString(arrObj));//-->[Car [price=30, brand=Audi], Car [price=40, brand=BWM]]
//自定义的Car类重写了toString(),因此上面输出的不是Car的地址
}
}
2 . asList() 和 List的toString()
List listLong = Arrays.asList(arrLong);
System.out.println(listLong.size());//-->1
System.out.println(listLong);//-->[[J@a5ae1e7]
//对于基本型数组,调用asList时返回的是List<>泛型参数必须是对应的数组类型(基本类型不能作为泛型参数)
//因此listLong中实际存放的类型是long数组,所以size为1.
//若想asList后存放的是对应数据类型,数组应使用基本型的包装类来定义。
System.out.println(listLong.get(0)==arrLong);//--> true
System.out.println(listLong.get(0).getClass());//--> class [J
System.out.println(arrLong.getClass());//--> class [J
//listLong存放的数组与数组本身指向同一个地址,类型相同。
//只有基本类型数组才可作为asList()的参数,不允许Object类型数组
List
3 . Arrays中的copyOf()
方法对数组进行复制,当需要动态地改变数组类型时,就调用了reflect包下的Array.newInstance()
。