【问题标题】:Effective size versus actual size of an array, how to get to know the effective size?有效大小与数组的实际大小,如何知道有效大小?
【发布时间】:2015-01-21 03:01:16
【问题描述】:

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

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.length 做这样的事情吗?

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

我找不到任何重复的问题。我觉得很奇怪。在我的特殊情况下,它是关于 Java 的。

【问题讨论】:

  • 取决于您使用的语言。例如,C 数组没有长度属性,允许您访问数组边界之外的内存。 C# 数组有一个 Length 属性。
  • 感谢您的评论,我完全忘记了我这次没有使用Java标签。虽然听到主要语言的差异非常有趣。
  • int 不能为空。并且为了存储对象,大多数时候不应该使用数组。收藏品应该是首选。那么,您的问题是什么,因为您问的问题没有意义?
  • 没有。您使用列表,它允许添加任意数量的对象,并且不像数组那样具有固定长度。谷歌“Java 集合教程”。
  • @BoristheSpider:评论中没有足够的字符来说明程序员的工作是确保数组中没有空值(否则他没有考虑清楚)。并且尝试是不是建议:)它只是“可能”

标签: java arrays variable-length-array


【解决方案1】:

在 Java 中,您必须区分原始类型和引用类型。

当使用new <sometype>[size] 初始化数组时,它的所有元素都设置为默认值。对于intlongbyte 等,该值为 0。因此,您可以在这样的数组上运行平均函数,您将得到平均值 0。

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

如果类型是任何对象类型(类),包括众所周知的类型如StringInteger等,默认值都是null。

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

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

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

Integer[] intObjects = { 5, 17, 32 };

请注意,这是一个Integer 类型的数组,它是一个引用类型,而不是int,原始类型。如果您使用new Integer[3] 对其进行了初始化,您将拥有所有空值。但是当你按照我展示的那样初始化它时,它包含对三个 Integer 对象的引用,分别包含数字 5、17 和 32。所以你可以说它的有效尺寸和它的长度是一样的。

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

Integer[] intObjects = { 5, null, 32 };

考虑到所有这些,“我如何知道数组中有多少空值”这个问题的答案是:

  1. 如果数组是原始类型,则没有空值。它包含合法值,即使它们是零/假。
  2. 如果数组是引用类型,并且您使用new 对其进行了初始化,那么它的所有元素都是空的。
  3. 如果数组是引用类型,并且您使用 {...} 对其进行了初始化,或者在其初始化后分配了值,则您无法知道其中有多少空值,除非通过循环和计数。

【讨论】:

  • 这是我写的,虽然简洁,但你太夸张了!但是,+1 以获得好的答案...
【解决方案2】:

在 Java 中,一旦您创建了一个数组,基本上是您在此处提到的 primitive types like int,byte,etc.,所有数组元素都会自动初始化为值 0。因此,非空元素的讨论到此结束。

primitive data-types 的情况下,所有这些元素都不指向null,但在reference datatypes 的情况下,这些值指向null,除非明确指定OR,除非编码器通过分配一些其他参数来强制它这样做。但是,即使这样也会导致 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 中的原始数据类型,我们总是这样做

for(int i=0;i<array.length;array++){
   // do Something
}

这可能总是在 Java 中访问数组元素的方式,根据定义,所有元素都将构成一个数组,因此,

Effective size of Array in Java = Actual size of Array in Java

【讨论】:

  • 元素不指向null是因为它们不能,所以“除非明确指定”这句话没有意义。您不能将 null 分配给 int、句点。
  • 但是,您可以将 null 分配给 String 数组,这或多或少是首选数据类型!我在这个问题的评论中提到过! @RealSkeptic
  • 问题和答案中都没有关于字符串的内容。此外,OP 想要对他的数组中的值进行平均,这意味着他真的希望它们是数字的。
  • @RealSkeptic-OP 询问了 Java 对数组的一般行为!此外,您还可以看到有关问题的 cmets,其中包括关于 Colllections 的讨论——这也不是原语...
  • @RealSkeptic-您正在以其他方式回答答案,但是,相对而言,它是对所有数据类型的更一般的描述,无论是用户定义的还是原语!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多