2012-02-26 79 views
4

...换句话说: 假设我有2个字符串声明为这样:如何检查实现内容相等的对象中的引用相等性?

String one = new String("yay!"); 
String two = new String("yay!"); 

这两个字符串是两个不同的对象,但如果我跑

if(one.equals(two)) 
    System.out.println("equals() returns true."); 

我得到的“平等()返回true“。 这是因为String类重写equals()方法来实现内容级别相等。 但是,我需要访问一个参考级别的相等(如在Object中实现的那个)来区分对象和对象之一。 我该怎么做?

我尝试这样做:

one.getClass().getSuperclass().equals(); 

,试图调用该对象等于字符串一个()的方法,但没有奏效。

有什么建议吗?

+1

您是否在寻找''==? – 2012-02-26 13:09:46

+1

我不想脱离主题,但是我想添加这些信息,我认为这对那些在这个问题上失败的人会有帮助。我的问题是能够处理实现内容相等性的对象作为独特的元素。当然,我的问题的另一方面是在HashMap 中使用它们作为关键元素。存在用于实现此目的的Map实现,即[IdentityHashMap](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/IdentityHashMap.html)。 – MaVVamaldo 2012-02-27 08:00:07

回答

2

在Java String使用String Literal Pool,这意思是:“当你试图创建一个字符串,第一String类的搜索结果在Literal Pool传统相同的字符串,如果存在返回它,如果不存在创建”,所以你不能equals方法检查字符串比较实例的refernce,你必须使用==操作如下:

String one = new String("yay!"); 
String two = new String("yay!"); 
if(one.equals(two)) 
    System.out.println("equals() returns true."); 
if(one == two) 
    System.out.println(" == operator returns true."); 

结果是:

equals() returns true. 

见下链路F以上信息:

  1. http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
  2. Java String.equals versus ==
1
if (one == two) 
    System.out.println("one and two are the same object"); 
0

唯一你需要的是“==”等号运算符。

2

如果你想查询参考刚刚执行:

one == two 

但要小心的字符串。有一种叫String constant pool的东西,所以它们可能会引用同一个对象。

+1

你是对的,但是“常量池”是类文件中的数据结构,另一个是*字符串实习池*,你引用的技术称为字串实习。 – 2012-02-26 13:16:22

1

使用简单的==进行比较。但为避免String实习,您必须使用char阵列创建字符串,例如:String me = new String(new char[] { 'm', 'e' });而不是使用字符串文字"me",例如String me = new String("me");

+0

知道的很好,谢谢。不幸的是,我无法控制字符串的创建,因为它们是由JAX2B编组器以XML输入形式安装的。也许它可以配置为避免字符串实习机制,但我不这么认为。 – MaVVamaldo 2012-02-27 09:22:29