Daw*_*ood 7 java optimization casting numbers
如何检查字符串是表示长,双,还是只是常规字符串?我需要这样做,因为这个值需要根据其类型在数据库中建立索引.目前我这样做是通过尝试解析字符串并检查异常但由于代码被频繁调用,我想知道是否有更有效的方法来执行它.我的代码目前看起来像这样:
String value = ...;
// For example, could be "213678", "654.1236781", or "qwerty12345"
try {
Long longValue = Long.parseLong(value);
// Index 'longValue' in the database
} catch (NumberFormatException parseLongException) {
try {
Double doubleValue = Double.parseDouble(value);
// Index 'doubleValue' in the database
} catch (NumberFormatException parseDoubleException) {
// Index 'value' in the database
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我只是根据@ user949300建议使用正则表达式模式进行了快速基准测试,它的表现略好于上面的异常处理代码.这是代码,以防其他人发现它有用:
Pattern longPattern = Pattern.compile("^[-+]?[0-9]+$");
Pattern doublePattern = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$");
// Check for long regex pattern before the double regex pattern
// since the former is a strict subset of the latter
if (longPattern.matcher(value).matches()) {
// Perform indexing for long in the database
} else if (doublePattern.matcher(value).matches()) {
// Perform indexing for double in the database
} else {
// Perform indexing for string in the database
}
Run Code Online (Sandbox Code Playgroud)
以下是检查50,000个条目的基准测试结果,其中类型的近似细分为50%长度,10%双倍,40%字符串(代表我的应用程序处理的工作负载):
--- Exception handling code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 2561 ms
--- Regex pattern matching code ---
STRING - actual: 19861, found: 19861
DOUBLE - actual: 4942, found: 4942
LONG - actual: 25197, found: 25197
Time taken: 1565 ms
Run Code Online (Sandbox Code Playgroud)
您考虑过正则表达式吗?
如果字符串包含除 -(开头)、0-9 或 . 以外的任何内容,则它是字符串。(注意 - 这忽略了国际化和科学记数法 - 它们是问题吗?)
否则,它包含一个 .,它是一个双精度数。(好吧,你应该只测试一个 .,但这是一个开始)
不然就很长了。
出于偏执,我仍然可能会检查异常,但这可能是更快的方法。
添加注释我猜测测试正则表达式比从各种解析例程中抛出异常更快,但这实际上可能并非如此。你应该做一些测试。