SAX解析器和字符串interning

问题描述:

我注意到在DefaultHandler的事件方法被拦截的所有字符串。查看字符串与==而不是equals()是否相等会更好吗?SAX解析器和字符串interning

@Override 
public void startElement(String uri, String localName, String qName, 
    Attributes attributes) throws SAXException { 

if(localName == "element") 
// do something 

// or 

if(localName.equals("element")) 
// do something 

} 

由于所有字符串字符都被禁用,它应该提高性能。但是,所有的教程和例子我见过使用equals()

我可以看到一个问题是,如果你需要使用equalsIgnoreCase()

至少在甲骨文JDK7,第一件事String.equals(对象)不被检查对象引用相同的字符串实例:

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    ... 

所以,即使==在这些情况下会产生正确的结果,你已经完成了仅有的积蓄是一个方法调用(几乎)立即返回。我怀疑在任何测量方面节省的成本都是显而易见的。

即使有一些可衡量的成本节省,看起来这将是一个非常危险的优化 - 总是假定==比较正确的这些字符串。如果未来版本的SAX类改变行为会怎样?字符串实际上是API的文档化特征吗?听起来很可疑。

+0

谢谢你指出。我使用的SAX解析器具有String实习功能,但它可能会像您所说的那样改变。 – 2013-03-05 22:22:02