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的文档化特征吗?听起来很可疑。
谢谢你指出。我使用的SAX解析器具有String实习功能,但它可能会像您所说的那样改变。 – 2013-03-05 22:22:02