java中如何知道数组中实际的元素个数
我声明一个数组,array[20],然后我向其中放入对象信息,但是只放了10个对象信息,怎样知道这个数组中有10个元素?代码?...
我声明一个数组,array[20],然后我向其中放入对象信息,但是只放了10个对象信息,怎样知道这个数组中有10个元素? 代码?
展开
5个回答
展开全部
java原生数组的话,除了遍历以外不能做到。
因为,数组实际上是内存中的一段逻辑上的连续空间,比如int[] numbers = new int[5],是相当于有5个int在内存中“一字排开”。不管是否对其进行赋值,他们所在的那一段内存空间中都是有值的。如果你认为,对numbers[0] = 1, numbers[1] = 2这样赋值之后,赋过值的和没赋过值的在存储上有什么不同,认为没赋过值的部分是null一类的东西,从而可以快速找到有哪些元素是被赋值过的话,那就错了。
对于元素是引用变量类型的数组同理。假如我们进行 Object[] objs = new Object[4]; objs[0] = new Date(); 的操作,虽然确实objs[0]指向的对象不是null,而objs[1], objs[2],objs[3]都是指向了null对象,但实际上对于这些引用变量,他们在内存中所占的空间都是相同的,因此只有访问到这个变量并且去查看它指向的对象,才能知道它是否被赋过值,也就是必须要遍历才能统计。
如果想不遍历就知道数组中哪些是被赋过值的,哪些是初始化后没动过的,需要自己定义一个数据结构,维护数组的同时记录下其中的哪些位置被操作过,类似这样的:
public class ExpandArray{
public Object[] data;
public String index;
//每个操作都需要更新index,index可以是一个"00000001"这样的字符串,用1表示数组中这个位置被操作过,0表示是只进行过初始化过的
}
因为,数组实际上是内存中的一段逻辑上的连续空间,比如int[] numbers = new int[5],是相当于有5个int在内存中“一字排开”。不管是否对其进行赋值,他们所在的那一段内存空间中都是有值的。如果你认为,对numbers[0] = 1, numbers[1] = 2这样赋值之后,赋过值的和没赋过值的在存储上有什么不同,认为没赋过值的部分是null一类的东西,从而可以快速找到有哪些元素是被赋值过的话,那就错了。
对于元素是引用变量类型的数组同理。假如我们进行 Object[] objs = new Object[4]; objs[0] = new Date(); 的操作,虽然确实objs[0]指向的对象不是null,而objs[1], objs[2],objs[3]都是指向了null对象,但实际上对于这些引用变量,他们在内存中所占的空间都是相同的,因此只有访问到这个变量并且去查看它指向的对象,才能知道它是否被赋过值,也就是必须要遍历才能统计。
如果想不遍历就知道数组中哪些是被赋过值的,哪些是初始化后没动过的,需要自己定义一个数据结构,维护数组的同时记录下其中的哪些位置被操作过,类似这样的:
public class ExpandArray{
public Object[] data;
public String index;
//每个操作都需要更新index,index可以是一个"00000001"这样的字符串,用1表示数组中这个位置被操作过,0表示是只进行过初始化过的
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
写一个遍历数组的方法,用里面的.class方法判断是否为你定义的类型,是就在标记为加一,否则不变,最后查看标记为数据就可以了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int n = 0;
for(int i = 0; i < array.length; i++)
{
if(null != array[i]) n++;
}
System.out.println(n);
for(int i = 0; i < array.length; i++)
{
if(null != array[i]) n++;
}
System.out.println(n);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你定义一个int i=0;没加入一个对象信息i++;不就能知道了么
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询