Java 阵列的有效大小与实际大小,如何了解有效大小?

Java 阵列的有效大小与实际大小,如何了解有效大小?,java,arrays,variable-length-array,Java,Arrays,Variable Length Array,我想问同样问题的另一种方法是如何知道数组中空点元素的数量 int[] arrayOfEffectiveSizeTen = new int[10]; // some black box in which the content of the array is changed calculateAverage(arrayOfEffectiveSizeTen) //how can you do this for instance? 您真的必须在for循环中使用i

我想问同样问题的另一种方法是如何知道数组中空点元素的数量

int[] arrayOfEffectiveSizeTen = new int[10];
// some black box in which the content of the array is changed
calculateAverage(arrayOfEffectiveSizeTen) //how can you do this for instance?
您真的必须在
for
循环中使用
i
执行类似操作吗

arrayOfEffectiveSizeTen[i] == null ? nullPointingElement++ : elementInArray++;

我找不到任何重复的问题。我觉得很奇怪。在我的例子中,它是关于Java的。

在Java中,只要创建一个数组,基本上是int、byte等
基本类型。
您在这里提到过,所有数组元素都会自动初始化为值0。因此,关于非空元素的讨论到此结束

基本数据类型
的情况下,所有这些元素都不会指向null,但在
参考数据类型
的情况下,这些值都指向null,除非明确指定,或者除非编码器通过分配给一些其他参数强制这样做。不过,即使这样,在Java中也会导致运行时异常。因此,避免在不进行初始化的情况下使用引用数据类型,因为这样会导致NUllPointerException

对于参考数据类型,我们需要

String sarray[]={"Hello","World"};  
// see here array initialised,else would have produced NullPointerException
for(int i=0;i<sarray.length;array++){
   // do Something
}

在Java中,必须区分基本类型和引用类型

当使用
new[size]
初始化数组时,其所有元素都设置为默认值。对于
int
long
byte
等,值为0。所以你可以在这样一个数组上运行一个平均值函数,平均值为0

如果类型为布尔值,则初始值为
false

如果类型是任何对象类型(类),包括众所周知的类型,如
String
Integer
等,则默认值均为空

所以基本上,当你创建一个数组时,如果它是一个基元类型,那么你可以说,根据你的定义,它的长度是它的“有效大小”,因为
0
false
是合法的值

如果它是引用类型,那么当您创建它时,它的有效大小(根据您的定义)是零,因为不存在非null元素

但是,使用
new
并不是初始化数组的唯一方法。例如,您可以使用以下内容:

Integer[] intObjects = { 5, 17, 32 };
Integer[] intObjects = { 5, null, 32 };
请注意,这是一个类型为
Integer
的数组,它是一个引用类型,而不是原语类型
int
。如果您使用
新整数[3]
初始化它,您将拥有所有空值。但是,当您如我所示初始化它时,它包含对三个分别包含数字5、17和32的
Integer
对象的引用。所以你可以说它的有效尺寸和它的长度是一样的

但是,请注意,编写以下内容也是合法的:

Integer[] intObjects = { 5, 17, 32 };
Integer[] intObjects = { 5, null, 32 };
考虑到所有这些,对于“我如何知道数组中有多少空值”这个问题的答案是:

  • 如果数组是基元类型,则不存在空值。它包含合法值,即使它们为零/假
  • 如果数组是引用类型,并且您使用
    new
    对其进行了初始化,则其所有元素都为null
  • 如果数组是引用类型,并且在初始化后使用
    {…}
    或赋值对其进行初始化,则除了循环和计数外,无法知道其中有多少个空值

  • 取决于您使用的语言。例如,C数组没有长度属性,允许您访问数组边界之外的内存。C#数组有一个长度属性。谢谢你的评论,我完全忘了这次我没有使用Java标记。虽然听到主要语言之间的差异很有趣,
    int
    不能为空。为了存储对象,大多数情况下不应该使用数组。收藏应该是首选。那么,你的问题是什么,因为你问的问题没有意义?没有。你使用的是一个列表,它允许添加任意数量的对象,并且不像数组那样有固定的长度。Google搜索“Java集合教程”。@BoristheSpider:评论中没有足够的字符来说明确保数组中没有空值是程序员的工作(否则他没有仔细考虑)。catch try并不是一个建议:)它只是“可能”元素不指向null,因为它们不能,所以关于“除非明确指定”的句子毫无意义。您不能将
    null
    分配给int,period。但是,您可以将null分配给字符串数组,这或多或少是首选的数据类型!我在对这个问题的评论中提到过@事实上,问题和答案中都没有关于字符串的内容。此外,OP希望对数组中的值求平均值,这意味着他真的希望这些值是数字的。@realpoint,正如OP询问Java对数组的一般行为一样!此外,您还可以看到关于这个问题的评论,其中包括关于
    集合的讨论,这些集合也不是原语…@realdonsignist您的答案是相反的,但是,相对而言,它是对所有数据类型的更一般的描述,无论是用户定义的还是原语!这就是我写的,虽然用简洁的方式,你只是夸大了!但是,一个好的答案是+1。。。