Array和Arrays的主要区别
Array类是Java.lang.reflect包中的一个类,该类不允许继承和实例化,由该类在java的反射包下可知该类用于动态地创建和访问java数组。
Arrays类位于Java.util包下,主要提供了对数组进行操作的一些方法,比如排序、搜索、复制等。此类还包含一个允许将数组作为列表来查看的私有静态内部类。
关于Array
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类型的可变参数,用于动态地创建二维数组。
关于Arrays
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<long[]> 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<Object[]> listObj1 = Arrays.asList(arrObj);
//上述代码编译不通过:cannot convert from List<Object> to List<Object[]>
List<Object> listObj = Arrays.asList(arrObj);
System.out.println(listObj.size());//-->2
System.out.println(listObj);
//Object类型,List<>中存放的就是对应的对象实例,因此size是2.
//List并没有重写toString,调用的是Object类的toString,数组未重写,打印的是地址,而自定义类重写了toString.
/*
*
*/
System.out.println(listObj.getClass());//--> class java.util.Arrays$ArrayList
listObj.add(new Car(50,"Ford"));//-->throw UnsupportedOperationException
//由上面的打印的内容可知,asList实际返回的是Arrays类下定义的私有静态内部类$ArrayList,并不是java.Util下的ArrayList,
//该类并没有add和remove等操作方法,因此会报错,具体可以查看Arrays的java源码。
//因此,除非确信array.aslist后长度不会增加,否则谨慎使用asList。
3 . Arrays中的copyOf()
方法对数组进行复制,当需要动态地改变数组类型时,就调用了reflect包下的Array.newInstance()
。