我有一个Object o
参数的方法。
在这种方法中,我确切地知道“o”中有一个String
,它不是空的。无需检查或执行其他操作。我必须像对待String
对象一样对待它。
只是好奇 - 什么更便宜 - 将其投放到String
,或使用Object.toString()
?
或者是时间 - / cpu- / mem-价格相同吗?
更新:
该方法接受Object
,因为它是接口的实现。无法更改参数类型。
根本不能null
。我只是想说我不需要检查它是否为空或空。就我而言,总是有一个非空的字符串。
答案 0 :(得分:66)
转换为String更便宜,因为这不需要外部函数调用,只需要内部类型检查。
答案 1 :(得分:44)
我会使用演员。这证实了你的“知识”,即它是一个字符串。如果由于某种原因你最终得到一个bug并且有人传递了一个字符串以外的东西,我认为抛出一个异常(演员会做的)比继续执行有缺陷的数据更好。
答案 2 :(得分:32)
根据Silly performance musings: x.toString() vs (String)x
最终,结果令人惊讶 明确:它至少快两倍 将Object转换为String而不是调用 Object.toString()强>
答案 3 :(得分:5)
如果您知道Object o是一个String,我会说它只是将它转换为String并以这种方式强制执行。
可能只会在一个你知道的对象上调用toString(),这可能只会增加混乱。如果Object o可能不是String,则需要调用toString()。
答案 4 :(得分:3)
我不会太担心性能,如果这个操作每秒只进行几千次 - 那就没有明显的区别了。
但是,我会担心“知道”输入。你有一个接受Object
的方法,你应该这样对待它,即你不应该知道关于参数的任何内容,除了它遵守Object
接口,碰巧有一个toString()
方法。在这种情况下,我强烈建议使用该方法而不是假设任何东西。
OTOH,如果输入总是 String
或null
,只需将方法更改为接受String
,并明确检查{{1} s(无论何时处理非基元时你都应该这样做......)
答案 5 :(得分:1)
o中不能有'空字符串'。如果o为null,则它不包含空字符串,它只是null。首先检查o是否为null。如果强制转换或在null上调用ToString(),则会崩溃。
答案 6 :(得分:1)
如果“o”中的内容是一个字符串,则没有太大区别(可能是演员阵容更快,但这是VM / Library实现的事情)。
如果“o”可能不是String但它应该是一个String,那么转换就是你想要的(但是你应该让方法取一个String而不是一个Object)。
如果“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();
}
答案 7 :(得分:1)
我奇怪地发现演员阵容比tostring调用隐含的vtable查找慢。
答案 8 :(得分:1)
鉴于引用类型是Object,所有Objects都有toString(),只需调用object.toString()。 String.toString()只返回这个。