我应该关心 trove4j 中的 no_entry_value 吗?
Should I care about no_entry_value in trove4j?
我将 trove4j 用于其原始集合。我注意到它有像
这样的构造函数
public TLongArrayList( int capacity, long no_entry_value )
其中 no_entry_value
表示空值。默认值为零。
集合中的空值,特别是Set,按照我的认知是很重要的。但是看了源码发现trove4j并没有怎么用到这个值
所以我很困惑我应该关心那个值。我应该精心挑选一个永远不会出现在我的程序中的值,还是让它默认为零。
这是您在需要时知道自己需要的东西之一。这归结为您是否只想调用 get(...)
并在不调用 containsKey(...)
的情况下知道该值是否在地图中。这就是“无条目值”出现的地方,因为这是在您没有将该键存储在地图中的情况下返回的内容。默认值为 0,因此如果您从不在地图中存储 0 值,这将适用于检查。但当然这可能有点冒险。典型值为 0、-1、Integer.MAX_VALUE... 诸如此类。
如果没有您可以保证永远不会出现在您的地图中的值,那么您需要确保在信任返回值之前检查 containsKey
。您可以使用类似以下内容的方法将执行两次查找的开销降至最低:
int value = my_map.get( my_key );
// NOTE: Assuming no entry value of 0
if ( value == 0 && !my_map.containsKey( my_key ) ) {
// value wasn't present
}
else {
// value was present
}
与每次执行 get
之前调用 containsKey
相比,这是一个性能改进。
我将 trove4j 用于其原始集合。我注意到它有像
这样的构造函数public TLongArrayList( int capacity, long no_entry_value )
其中 no_entry_value
表示空值。默认值为零。
集合中的空值,特别是Set,按照我的认知是很重要的。但是看了源码发现trove4j并没有怎么用到这个值
所以我很困惑我应该关心那个值。我应该精心挑选一个永远不会出现在我的程序中的值,还是让它默认为零。
这是您在需要时知道自己需要的东西之一。这归结为您是否只想调用 get(...)
并在不调用 containsKey(...)
的情况下知道该值是否在地图中。这就是“无条目值”出现的地方,因为这是在您没有将该键存储在地图中的情况下返回的内容。默认值为 0,因此如果您从不在地图中存储 0 值,这将适用于检查。但当然这可能有点冒险。典型值为 0、-1、Integer.MAX_VALUE... 诸如此类。
如果没有您可以保证永远不会出现在您的地图中的值,那么您需要确保在信任返回值之前检查 containsKey
。您可以使用类似以下内容的方法将执行两次查找的开销降至最低:
int value = my_map.get( my_key );
// NOTE: Assuming no entry value of 0
if ( value == 0 && !my_map.containsKey( my_key ) ) {
// value wasn't present
}
else {
// value was present
}
与每次执行 get
之前调用 containsKey
相比,这是一个性能改进。