(string)或.toString()?

我有一个Object o参数的方法。

在这个方法中,我完全知道在“o”中有一个不为null的String 。 没有必要检查,或者做别的事情。 我必须把它看作一个String对象。

只是好奇 – 什么更便宜 – 把它投到String ,或使用Object.toString() ? 还是按时间/ cpu- / mem-价格是相同的?

更新:该方法接受Object因为它是一个接口的实现。 没有办法改变参数types。

它不能为null 。 我只是想说,我不需要检查它是空的还是空的。 在我的情况下,总是有一个非空string。

铸造到一个string更便宜,因为这不需要外部函数调用,只是内部types检查。

我会使用一个演员。 这certificate你的“知识”是一个string。 如果因为某种原因你最终会遇到一个bug,并且有人传递了一个string以外的东西,我认为抛出一个exception(这是一个强制转换)会比继续执行有缺陷的数据更好。

根据愚蠢的performance沉思:x.toString()vs(String)x

最后,结果是令人惊讶的清楚: 将Object强制转换为String的速度至less是调用Object.toString()的两倍。

如果你知道对象o是一个string,我会说只是把它转换为一个string,并强制这样做。 在你确定知道的对象上调用toString()方法是一个String可能会增加混淆。

如果Object o可能不是string以外的任何东西,则需要调用toString()。

我不会太在意这个performance,如果这个行动每秒只做几千次 – 没有什么实质性的差别。

然而,我会关心“知道”这个input。 你有一个方法接受一个Object ,你应该这样对待,即你不应该知道任何关于参数,除了遵守Object接口,这恰好有一个toString()方法。 在这种情况下,我强烈build议使用这种方法,而不是仅仅假设任何东西。

OTOH,如果input总是Stringnull ,只要将方法改为接受String ,并明确地检查是否为null (在处理非基元时你应该做任何事情…)

如果你在“o”中有一个string,那么没有太大的区别(可能转换速度更快,但这是一个虚拟机/库实现的东西)。

如果“o”可能不是一个string,但它应该是一个string,那么这个转换就是你想要的(但是你应该让这个方法取一个String而不是一个Object)。

如果“o”可以是任何types,那么你必须使用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(); } 

鉴于引用types是一个对象,所有的对象都有一个toString()只是调用object.toString()。 String.toString()只是返回这个。

  • toString()是更less的代码键入。
  • toString()是较less的字节码。
  • 铸造是一个昂贵的操作VS多态的调用。
  • 演员可能会失败。
  • 使用String.valueOf(object),如果它不为null,则调用object.toString()。

o中不能有'空string'。 如果o为null,它不包含空string,它只是null。 首先检查一下null。 如果您在null上施放或调用ToString(),则会崩溃。

我奇怪地发现,演员比tostring调用隐含的vtable查找要慢。