概念
所谓的数组(Array),就是数据的组合,简单地说就是一个存储容器,里面可以包含多个数据。该容器在内存中开辟了一块连续的存储空间,可以用来保存相同类型的多个数据。给大家举个栗子,下图的这个东西你见过吗?
有的人说这不是鸡蛋吗?其实壹哥想让你看的是存储这些鸡蛋的”容器“--鸡蛋托!一个鸡蛋托有多个存储格子,每个格子只能存储一个鸡蛋,并且这些格子只能用来存储鸡蛋,不能存储其他的东西。一个鸡蛋托可以存储的鸡蛋数量是有限的,不能无限存储。
其实Java里的数组就类似于是”鸡蛋托“,数组中存储的数据元素就是一个个的”鸡蛋“。一个数组占据了内存中的一片连续空间,只能存储相同类型的数据,数组有一定的存储空间。我们在创建数组时,需要先声明数组的类型,之后该数组中只能存储指定类型的数据。
●我们把存储在数组中的每一个数据,称为”数据元素“。这些数据元素会按着一定的顺序排列存储,并赋予每个数据元素对应的编号。我们可以直接通过编号(索引、下标)的方式来调用指定位置上的数据元素,查找速度会很快。
●数组本身是引用类型,但数组中的数据元素可以是任何数据类型,包括基本数据类型和引用数据类型。
●数组创建时需要指定一个名称,并会在内存中开辟一整块连续的内存空间,数组名引用的就是这块连续空间的首地址(第一个地址)。
●数组创建后,长度一旦确定,就不能再被修改。
java支持的数组
1.基本类型数组:包括 boolean、byte、short、char、int、long、float 和 double 类型的数组。
2.引用类型数组:包括任何类、接口、数组类型的对象的数组。
java不支持的数组
1.C/C++ 中的指针数组,因为 Java 中没有指针。
2.多维变长数组,例如 C/C++ 中的动态二维数组。在 Java 中,多维数组的每个维度的大小必须在定义时确定,且在程序运行时无法改变。
3.超过 JVM 堆空间大小限制的大型数组。Java 数组的最大大小受 JVM 堆空间大小的限制。如果尝试创建一个超过 JVM 堆空间大小限制的数组,则会引发 OutOfMemoryError 异常。
4.Java不支持泛型数组
java为什么不支持泛型数组
Java不支持泛型数组是由于以下两个原因:
1.类型擦除
在Java中,泛型使用类型擦除来实现。在编译时,所有泛型类型都会被替换为它们的限定类型或Object类型,因此在运行时无法获得泛型类型的信息。这意味着在创建泛型数组时,编译器无法确切知道数组元素的类型。例如,以下代码无法编译:
List[] arr = new List[10];
因为编译器无法确定List在运行时的类型。
2.安全性
如果Java允许泛型数组,那么可能会导致类型安全问题。例如,假设以下代码可以编译:
List[] arr = new List[10];
Object[] objArr = arr;
objArr[0] = new ArrayList();
String s = arr[0].get(0); // ClassCastException
由于数组是协变的,因此我们可以将一个数组赋值给另一个数组,但是在这个例子中,我们把一个ArrayList赋值给一个List[],这样就破坏了类型安全,因为我们可以在编译时避免类型错误,但在运行时会抛出ClassCastException异常。
为了避免这些问题,Java禁止使用泛型数组。如果需要创建泛型容器,可以使用集合框架,例如List、Set和Map。