如何理解数组的length?

本文聚焦Java数组,指出其是特殊对象。介绍了数组继承自Object,有成员变量length;java.lang.reflect.Array用于动态操作数组;java.util.Arrays可进行排序等操作;数组无对应类文件,类名古怪且运行时生成。还探讨了数组length的问题,猜测是编译器处理。
Java中的数组其实也是一个对象,但是确实是一个特殊的对象,实在是太特殊了,
 
以致我们都不好把它多做对象处理。
 
1.数组是对象,继承自Object
  唯一比Object多一个成员变量length,而且应该是public的。
 
2.java.lang.reflect.Array是final的,所以数组肯定不是它的子类
  这个类用来动态生成数组或者操作数组(获得长度等).
 
3.java.util.Arrays是一个数组操作应用类,主要就是排序,填充,而分查找等。
  注意:排序使用的是快速排序,时间复杂度是o(n*log(n)),如果你要对数组排序
  Arrays绝对是首选。
 
4.数组没有对应的类文件,String对应String.class.但是数组却没有,而且他们的
  类名字很古怪,可以这样获得 new int[2].getClass().getName();
  这是和其他对象最大的不同点,因为数组类是在运行时生成的。
 
5.数组的length是什么?
  第一步:我们确定数组的父类是Object,
  new Object[0].getClass().getSuperClass()  是Object.class
   很显然Object没有length变量,所以应该是数组中的成员变量
  第二步:new Object[0].getClass().getDeclaredFields() 返回的数组长度
   为0,这里我们自然动态活动这个数组的Class,但是结果证明这个Class里没有
   对length的定义,这个完全和第一步得出的违背。
  第三步:很显然第一步和第二步是想矛盾的,但是第一步的分析完全没有错呀。
   我也无法知道究竟是怎么回事,这里有两种可能,我比较支持第二步的结果。
  
   数组类根本没有length成员变量,这样就和第二步的结果相同
   对于 Object[] objs=new Object[2];
   这个数组对象很显然和一般的对象不一样,一般的构造函数不是这个样子的。
   对于 int i=objs.length;
   因为我猜测是数组类是没有length成员的,但是这里却明明可以调用,我觉得
   这里是编译器处理过的,他会在编译时把数组的length调用转化成一个方法
   调用,比如Array.getLength(obj);虽然我试图用这两种方法编译成class文件
   后用javap得到不同的JVM指令,我仍然觉得是编译器处理的数组的length!
 
   如果我是错的,谁能帮我解释一下第二步发生的事!
 
 
 
 
<think>好的,我现在需要回答用户的问题,关于如何在VB.NET中获取数组的长度。首先,我要回忆一下VB.NET中数组的基本知识。根据用户提供的引用,特别是引用[2]和[3],数组有一个Length属性,可以直接使用。例如,数组名.Length。另外,还有一个GetUpperBound方法,可能用于多维数组的情况。 接下来,我需要确认不同版本的VB.NET是否有变化,但根据引用[3],数组列表(ArrayList)在VB.NET中取代了旧的集合(Collection),而数组本身的长度属性是基于0开始的。这说明Length属性应该是可用的,并且是推荐的方法。 用户的问题可能涉及一维数组和多维数组,所以需要分别说明。对于一维数组,直接使用Length属性即可,如arr.Length。如果是多维数组,比如二维数组,可能需要使用GetUpperBound(0)来获取第一维的上界,然后加1得到元素个数。不过要注意,Length属性返回的是总元素数,而GetUpperBound用于特定维度的索引上限。 还需要提到,数组的索引是从0开始的,所以最大索引是Length - 1,这一点在引用[2]和[3]中都有提到。此外,引用[4]中的数组定义方式可能影响维度的处理,所以需要举例说明不同情况下的获取方法。 另外,用户可能对数组列表(ArrayList)的长度感兴趣,但根据引用[3],ArrayList的大小是动态的,使用Count属性而不是Length。不过用户的问题主要集中在数组上,所以这部分可能作为补充提到。 最后,需要确保回答结构清晰,分点说明,并且正确引用提供的资料。可能还需要检查是否有其他方法,比如使用GetLength方法处理多维数组的不同维度长度,但根据提供的引用,可能主要提到GetUpperBound和Length属性。 总结一下,回答应该包括以下部分: 1. 使用Length属性获取一维数组总长度。 2. 使用GetUpperBound获取多维数组各维的上界,并计算长度。 3. 注意索引从0开始,最大索引为Length - 1。 4. 可能补充数组列表(ArrayList)的Count属性,但用户问题主要是数组。 5. 提供示例代码,如引用中的例子,说明具体用法。</think>在VB.NET中获取数组长度的方法主要有以下几种,具体取决于数组类型和需求: ### 1. 一维数组的长度获取 使用`Length`属性可直接获取数组总元素个数: ```vb.net Dim arr() As Integer = {1, 2, 3, 4, 5} Dim length As Integer = arr.Length ' 返回5 ``` 此时最大有效索引为`arr.Length - 1`[^2]。 ### 2. 多维数组的长度处理 对于多维数组: - **总元素数**仍用`Length`属性: ```vb.net Dim matrix(2, 3) As Integer ' 3行4列 Dim totalElements As Integer = matrix.Length ' 返回12 ``` - **单维度长度**使用`GetUpperBound(维度)+1`: ```vb.net Dim rows As Integer = matrix.GetUpperBound(0) + 1 ' 第0维上界2 → 3行 Dim cols As Integer = matrix.GetUpperBound(1) + 1 ' 第1维上界3 → 4列 ``` ### 3. 动态数组的长度验证 即使声明动态数组后重新分配空间,`Length`仍有效: ```vb.net Dim dynamicArr() As String ReDim dynamicArr(4) ' 分配5个元素 Console.WriteLine(dynamicArr.Length) ' 输出5 ``` ### 4. 数组列表(ArrayList)的长度 若使用集合类型`ArrayList`,需改用`Count`属性: ```vb.net Dim arrList As New ArrayList() arrList.AddRange({1, 2, 3}) Console.WriteLine(arrList.Count) ' 输出3 [^3] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值