我有一个带有Object o
参数的方法。
在这种方法中,我完全知道String
在“ o”中存在一个不为空的值。无需检查或执行其他操作。我必须像对待String
对象一样对待它。
只是好奇-更便宜的是-将其投放String
或使用Object.toString()
?还是按时间/ CPU /内存价格相同?
更新:该方法可以接受,Object
因为它是接口的实现。无法更改参数类型。
而且根本不可能null
。我只是想说我不需要检查它是否为空或为空。就我而言,总是有一个非空字符串。
我有一个带有Object o
参数的方法。
在这种方法中,我完全知道String
在“ o”中存在一个不为空的值。无需检查或执行其他操作。我必须像对待String
对象一样对待它。
只是好奇-更便宜的是-将其投放String
或使用Object.toString()
?还是按时间/ CPU /内存价格相同?
更新:该方法可以接受,Object
因为它是接口的实现。无法更改参数类型。
而且根本不可能null
。我只是想说我不需要检查它是否为空或为空。就我而言,总是有一个非空字符串。
Answers:
强制转换为String较为便宜,因为它不需要外部函数调用,只需内部类型检查即可。
根据愚蠢的表现思维:x.toString()vs(String)x
最后,结果出奇的清晰:将对象转换为字符串的速度至少是调用Object.toString()的两倍。
我不会太担心性能,如果此操作每秒仅执行数千次,则没有明显的区别。
但是,我会担心“知道”输入。你必须接受的一个方法Object
,你应该把它当作这样的,即你不应该 知道的有关参数任何东西,除了它遵循的Object
接口,这恰好有一个toString()
方法。在这种情况下,我强烈建议您使用该方法,而不是仅仅假设任何事情。
OTOH,如果输入始终为 String
或null
,则只需将方法更改为接受String
s,并显式检查null
s(无论何时使用非基元,都应执行此操作……)
如果“ o”中的内容是字符串,则没有太大区别(可能强制转换更快,但这是VM / Library实现的事情)。
如果“ o”可能不是一个字符串,但应该是一个字符串,则强制转换是您想要的(但您应使该方法使用字符串而不是对象)。
如果“ o”可以是任何类型,则必须使用toString-但一定要先检查是否为null。
void foo(final Object o)
{
final String str;
// without this you would get a class cast exception
// be wary of using instanceof though - it is usually the wrong thing to do
if(o instanceof String)
{
str = (String)o;
}
}
要么
void foo(final Object o)
{
final String str;
// if you are 100% sure that o is not null then you can get rid of the else
if(o != null)
{
str = o.toString();
}
}
我宁愿将最后一个编码为:
void foo(final Object o)
{
final String str;
if(o == null)
{
throw new IllegalArgumentException("o cannot be null");
}
str = o.toString();
}
final
变量可能尚未初始化)。您需要一个else
将抛出异常或初始化str
为某种东西的对象。