【发布时间】:2009-11-20 07:04:49
【问题描述】:
哪个更便宜,更可取:put1 还是 put2?
Map<String, Animal> map = new Map<String, Animal>();
void put1(){
for (.....)
if (Animal.class.isAssignableFrom(item[i].getClass())
map.put(key[i], item[i]);
void put2(){
for (.....)
try{
map.put(key[i], item[i]);}
catch (...){}
问题修订: 问题不是那么清楚。让我稍微修改一下这个问题。我忘记了强制转换,所以 put2 依赖于强制转换异常失败。 isAssignableFrom()、isInstanceOf() 和 instanceof 在功能上相似,因此产生相同的费用,只有一个是包含子类的方法,而第二个是精确类型匹配,第三个是运算符版本。反射方法和异常都是昂贵的操作。
我的问题是针对那些在该领域进行过一些基准测试的人 - 成本更低且更可取:instanceof/isassignablefrom 与强制转换异常?
void put1(){
for (.....)
if (Animal.class.isAssignableFrom(item[i].getClass())
map.put(key[i], (Animal)item[i]);
void put2(){
for (.....)
try{
map.put(key[i], (Animal)item[i]);}
catch (...){}
【问题讨论】:
-
听起来您高估了原始 CPU 速度的问题。您应该更多地担心什么是正确、清晰、可读和惯用的 Java 代码。只有在极少数情况下,您才会为了缩短几个时钟周期而扭曲它。