我有一个大的浮点(原始)数组,并不是数组中的每个元素都被填充。我如何将特定元素标记为 EMPTY。我知道这可以通过一些特殊符号来实现,但我仍然想知道标准方式。即使我使用一些特殊符号,我将如何处理实际数据项是特殊符号值的情况。简而言之,我的问题是如何在 java 的原始类型数组中实现 NULL 功能。
PS - 我不使用 Float 对象的原因是为了实现高内存和速度性能。
谢谢 Vineeth
我有一个大的浮点(原始)数组,并不是数组中的每个元素都被填充。我如何将特定元素标记为 EMPTY。我知道这可以通过一些特殊符号来实现,但我仍然想知道标准方式。即使我使用一些特殊符号,我将如何处理实际数据项是特殊符号值的情况。简而言之,我的问题是如何在 java 的原始类型数组中实现 NULL 功能。
PS - 我不使用 Float 对象的原因是为了实现高内存和速度性能。
谢谢 Vineeth
您可以使用Float.NaN
, 任何有效值都不会是那样。
请注意,一个NaN
永远不等于另一个 NaN,因此您可以NaN
通过以下方式检查某些内容:
float a = Float.NaN;
if( a != a ) {
System.out.println("wat?");
}
在供人们阅读的代码中,您应该使用Float.isNaN
方法。
你可以使用 Float.NaN 吗?
public class FloatArray {
public static void main(String[] args) {
float[] data = new float[10];
data[5] = Float.NaN;
for (float f : data){
if (Float.isNaN(f)){
System.out.println("No Valve");
} else {
System.out.println(f);
}
}
}
}
那么使用像 -1 这样可能有效的Sentianl 值的风险在哪里,您可以使用 Float#isNaN(f) 进行测试
一种选择是使用像Float.MAX_VALUE
.
另一个是实际上有一个数组Float
而不是数组float
,这将允许您拥有null
值。
我倾向于为此使用Float.NaN
(不是数字)。
与Float.MAX_VALUE
et al 不同,当您对阵列进行数学运算时,您不必专门检查它们。NaNs 将保持 NaNs,而MAX_VALUE
et al 可能需要使用条件逻辑来处理。
唯一要记住的是,NaN 不等于任何东西,包括它们自己。
有一种方法可以在 float[] 中使用正常的浮点数、无穷大、NaN 和空标记。Float 具有二进制表示(参见 IEEE-754),您可以使用 Float.floatToIntBits(float) 来查看它。NaN“规范”(参见 Float API)二进制表示为 0x7fc00000。有趣的是,NaN 有许多二进制表示,它们都是有效的,例如 0x7ff00000 也是一个 NaN。试试这个
int nan1 = 0x7ff00000;
int nan2 = 0x7fc00000;
float f1 = Float.intBitsToFloat(nan1);
float f2 = Float.intBitsToFloat(nan2);
System.out.println(Float.isNaN(f1));
System.out.println(Float.isNaN(f2));
你会看到 f1 和 f2 都是 NaN。
因此,您可以使用任何非规范的 NaN,例如 0x7ff00000,作为空标记。确保在将浮点数写入数组时,将 NaN 转换为规范形式。例如
f = (f != f) ? f = Float.NaN : f;
请注意,f != f 是测试浮点数是否为 NaN 的最快方法。
检查浮点数是否为空标记
isEmptyMark = f != f && Float.floatToRawIntBits(f) == 0x7ff00000;
这是原语的主要问题之一。值的范围null
无法有意义地表示。
我建议您去,Float
否则您将不得不定义特定的值范围及其含义。
示例:如果您-1.0
在您的域中不是一个有意义的数字,您可以使用它来表示null
.
但我强烈建议切换到对象而不是原语。
我不使用 Float 对象的原因是为了实现高内存和速度性能。
除非您正在做一些非常繁重的数字运算,装箱/自动装箱不会导致任何性能问题。
与往常一样,进行测量,如果您发现确实存在性能问题,那么您可以放弃Float
使用 prematives。
不要过早优化