哪个更好,更便宜:类匹配与异常?

Ble*_*eek 3 c# java exception

哪个更便宜,更可取: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 (...){}
Run Code Online (Sandbox Code Playgroud)

问题修订:问题不是那么清楚.让我稍微修改一下这个问题.我忘记了转换,因此put2依赖于强制转换异常失败.isAssignableFrom(),isInstanceOf()和instanceof在功能上相似,因此产生相同的费用,只有一个是包含子类的方法,而第二个是精确类型匹配,第三个是运算符版本.反射方法和例外都是昂贵的操作.

我的问题是那些在这个领域做过一些基准测试的人 - 哪个更便宜,也更可取:instanceof/isassignable from vs cast exception?

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 (...){}
Run Code Online (Sandbox Code Playgroud)

Jas*_*rff 12

可能你想要:

if (item[i] instanceof Animal)
    map.put(key[i], (Animal) item[i]);
Run Code Online (Sandbox Code Playgroud)

这几乎肯定比打电话要好得多isAssignableFrom.

或者在C#中(因为你添加了c#标签):

var a = item[i] as Animal;
if (a != null)
    map[key[i]] = a;
Run Code Online (Sandbox Code Playgroud)

编辑:更新的问题是更好的:instanceof或cast-and-catch.功能基本相同.性能差异可能不大,我不得不衡量它; 一般抛出异常很慢,但我不知道其余的.所以我会根据风格来决定.说出你的意思.

如果你总是期望item[i]成为一个Animal,你只是要格外小心,投射和捕获.否则我发现使用instanceof更清楚,因为它明确地说出你的意思:"如果这个对象是动物,就把它放在地图中".