数组

本文深入探讨Java数组的特性,包括其作为特殊对象的属性、如何通过不同维度标识数组类名,以及数组转换为List时的常见陷阱。揭示了数组在JVM中的处理方式及其与普通Java类的区别。

数组是一个简单的数据复合类型,是一个特殊的对象。数组是Object的直接子类,属于第一类对象,但又与其他对象不同。

public class Test {
public static void main(String[] args) {
int[] array_00 = new int[10];
System.out.println("一维数组:" + array_00.getClass().getName());
int[][] array_01 = new int[10][10];
System.out.println("二维数组:" + array_01.getClass().getName());
第 18 章 数组之一:认识 JAVA 数组 | 152
int[][][] array_02 = new int[10][10][10];
System.out.println("三维数组:" + array_02.getClass().getName());
}
}
-----------------Output:
一维数组:[I
二维数组:[[I
三维数组:[[[I

通过这个实例我们知道:[代表了数组的维度,一个[表示一维,两个[表示二维。可以简单的说数组的类名由若干
个’[‘和数组元素类型的内部名称组成。

public class Test {
public static void main(String[] args) {
System.out.println("Object[]:" + Object [].class);
System.out.println("Object[][]:" + Object[][].class);
System.err.println("Object[][][]:" + Object[] [][].class);
System.out.println("Object:" + Object.class);
}
}
---------Output:
Object[]:class [Ljava.lang.Object;
Object[][]:class [[Ljava.lang.Object;
Object[][][]:class [[[Ljava.lang.Object;
Object:class java.lang.Object

普通的 Java类是以全限定路径名 + 类名来作为自己的唯一标示的,而数组则是以若干个 [+L+ 数组元素类全限定路径+类来最
为唯一标示的。这个不同也许在某种程度上说明了数组也普通 Java 类在实现上存在很大的区别,也许可以利用
这个区别来使得 JVM 在处理数组和普通 Java 类时作出区分。

[l类是一个空类,没有任何成员变量、成员方法、构造函数、Annotation 甚至连 length 成员变量这个都没有,但 JVM 对数组的长度做了特殊的处理,它是通过 arraylength 这条指令来实现的。

在进行数组复制时,如果通过 Arrays.copyOf() 方法产生的数组是一个浅拷贝。同时数组的 clone() 方法也是,集合的 clone() 方法也是,若数组元素为一个对象,数组里面的数据是对象的引用。

数组转换为list需要注意的地方

我们经常需要使用到 Arrays 这个工具的 asList() 方法将其转换成列表。方便是方便,但是有时候会出现莫名其
妙的问题。如下:

public static void main(String[] args) {
int[] datas = new int[]{1,2,3,4,5};
List list = Arrays.asList(datas);
System.out.println(list.size());
}
------------Output:
1

为什么结果是1不是5呢?

先看 asList() 的源码

public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}

注意这个参数:T…a,这个参数是一个泛型的变长参数,我们知道基本数据类型是不可能泛型化的,也是就说 8
个基本数据类型是不可作为泛型参数的,但是为什么编译器没有报错呢?这是因为在 Java 中,数组会当做一个
对象来处理,它是可以泛型的,所以我们的程序是把一个 int 型的数组作为了 T 的类型,所以在转换之后 List 中
就只会存在一个类型为 int 数组的元素了。所以我们这样的程序 System.out.println(datas.equals(list.ge
t(0)));输出结果肯定是 true。当然如果将int改为 Integer,则长度就会变成 5 了。

数组利用Array.asList转换为list时,asList 返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,我们是无法通过 add、remove 来增加或者减少其长度的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值