(String)或.toString()?

时间:2009-03-24 06:51:53

标签: java casting

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

在这种方法中,我确切地知道“o”中有一个String,它不是空的。无需检查或执行其他操作。我必须像对待String对象一样对待它。

只是好奇 - 什么更便宜 - 将其投放到String,或使用Object.toString()? 或者是时间 - / cpu- / mem-价格相同吗?

更新: 该方法接受Object,因为它是接口的实现。无法更改参数类型。

根本不能null。我只是想说我不需要检查它是否为空或空。就我而言,总是有一个非空的字符串。

9 个答案:

答案 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,如果输入总是 Stringnull,只需将方法更改为接受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()只返回这个。

  • toString()输入的代码较少。
  • toString()的字节码较少。
  • 施放是一种昂贵的操作VS多态调用。
  • 演员可能会失败。
  • 使用String.valueOf(object),如果它不为null,则调用object.toString()。