哪个更便宜,更可取: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更清楚,因为它明确地说出你的意思:"如果这个对象是动物,就把它放在地图中".
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |