【问题标题】:EnumMap T[] toArray(T[] a) implementationEnumMap T[] toArray(T[] a) 实现
【发布时间】:2019-09-09 12:21:57
【问题描述】:

我发现 EnumMap T[] toArray(T[] var2) 有这个实现:

public <T> T[] toArray(T[] var1) {

    int var2 = this.size();

    if (var1.length < var2) {
    var1 = (Object[])((Object[])Array.newInstance(var1.getClass().getComponentType(), var2));
    }

    if (var1.length > var2) {
    var1[var2] = null;
    }

    return (Object[])this.fillEntryArray(var1);
}

我不明白它的真正含义:

if (var1.length > var2) {
    var1[var2] = null;
}

如果我们的数组例如 String[5] 并且我们尝试:

enum myKeys{ONE, TWO, THREE};        

EnumMap myEnum = new EnumMap<myKeys, String>(myKeys.class);

myEnum.put(myKeys.ONE, "1");
myEnum.put(myKeys.TWO, "2");
myEnum.put(myKeys.THREE, "3");

final Object[] objects = myEnum.entrySet().toArray(new Object[8]);

for (Object o: objects) {
    System.out.println(o);
}

输出是:

ONE=1
TWO=2
THREE=3
null
null
null
null
null

1) 设计EnumMap T[] toArray(T[] a)而不是toArray()的目的是什么?

2) 为什么使用

if (var1.length > var2) {
    var1[var2] = null;
}

是不是因为标记N+1元素对于迭代器为空?

【问题讨论】:

  • 1) 我的猜测:避免创建不必要的数组。 2)我认为空值是一个“终结者”。它表示“这是枚举映射内容的结尾”。

标签: java maps toarray


【解决方案1】:

它在the javadoc of Set::toArray 中进行了解释 - 基本上它是一个标记,用于知道集合的最后一个元素在数组中的位置(假设集合不包含null 元素):

如果此集合适合指定的数组并有剩余空间(即,数组的元素多于此集合),则数组中紧跟集合末尾的元素设置为 null。 (只有当调用者知道这个集合不包含任何空元素时,这对确定这个集合的长度很有用。)

【讨论】:

  • “假设集合不包含空元素”。我认为可能只是集合中的一个空值(唯一)。同意。
【解决方案2】:

这里有两个问题:

设计EnumMap T[] toArray(T[] a)而不是toArray()的目的是什么?

为列表添加了相同的实现。如果将T[] toArray(T[] a) 与方法toArray() 进行比较,toArray() 会像 Object[] 一样返回对象数组,而它是类型安全的通用实现。它告诉方法需要创建什么类型的 Array 并返回,而不是总是创建 Object[]。

为什么使用var1[var2] = null;

这个方法的文档说:

如果这个集合适合指定的数组并有剩余空间(即,数组的元素比这个集合多),则数组中紧跟集合末尾的元素设置为空。 (仅当调用者知道该集合不包含任何空元素时,这对确定该集合的长度很有用。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 2011-09-26
    • 2015-04-08
    • 2012-07-29
    • 2022-06-17
    • 1970-01-01
    • 2018-01-12
    • 2016-07-16
    相关资源
    最近更新 更多