EnumMap T[] toArray(T[] a) 实现
EnumMap T[] toArray(T[] a) implementation
我发现 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;
}
是否为mark N+1 element is null for the iterator?
它在 the javadoc of Set::toArray
中有解释 - 基本上它是一个标记,用于知道集合的最后一个元素在数组中的位置(假设集合不包含 null
元素):
If this set fits in the specified array with room to spare (i.e., the array has more elements than this set), the element in the array immediately following the end of the set is set to null. (This is useful in determining the length of this set only if the caller knows that this set does not contain any null elements.)
这里你有2个问题:
设计EnumMap T[] toArray(T[] a)
而不是toArray()
的目的是什么?
为列表添加了相同的实现。如果将 T[] toArray(T[] a)
与方法 toArray()
进行比较,toArray()
returns 就像 Object[] 一样是对象数组,而它是类型安全的通用实现。它告诉方法需要创建什么类型的 Array 和 return 而不是总是创建 Object[]。
为什么用var1[var2] = null;
这个方法的文档说:
如果此集合适合指定的数组并有剩余空间(即数组的元素多于此集合),则数组中紧跟集合末尾的元素设置为无效的。 (仅当调用者知道此集合不包含任何空元素时,这才有助于确定此集合的长度。)
我发现 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;
}
是否为mark N+1 element is null for the iterator?
它在 the javadoc of Set::toArray
中有解释 - 基本上它是一个标记,用于知道集合的最后一个元素在数组中的位置(假设集合不包含 null
元素):
If this set fits in the specified array with room to spare (i.e., the array has more elements than this set), the element in the array immediately following the end of the set is set to null. (This is useful in determining the length of this set only if the caller knows that this set does not contain any null elements.)
这里你有2个问题:
设计EnumMap T[] toArray(T[] a)
而不是toArray()
的目的是什么?
为列表添加了相同的实现。如果将 T[] toArray(T[] a)
与方法 toArray()
进行比较,toArray()
returns 就像 Object[] 一样是对象数组,而它是类型安全的通用实现。它告诉方法需要创建什么类型的 Array 和 return 而不是总是创建 Object[]。
为什么用var1[var2] = null;
这个方法的文档说:
如果此集合适合指定的数组并有剩余空间(即数组的元素多于此集合),则数组中紧跟集合末尾的元素设置为无效的。 (仅当调用者知道此集合不包含任何空元素时,这才有助于确定此集合的长度。)