关于Java的Array和Arrays

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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值