2012-04-28 63 views
0

hashCode()equals()方法均未StringBufferStringBuilder重写时,我试图这块以下代码..关于方法在StringBuffer和StringBuilder中没有被覆盖?

//StringBuffer does not override equals & hashCode 
     //StringBuffer s = new StringBuffer("saral"); 
     //StringBuffer s1 = new StringBuffer("saral"); 

     StringBuilder s = new StringBuilder("saral"); 
     StringBuilder s1 = new StringBuilder("saral");   

     //String s = new String("saral"); 
     //String s1 = new String("saral"); 

     HashSet set=new HashSet(); 
     set.add(s); 
     set.add(s1); 
     set.add(null); 
     System.out.println("There are "+set.size()+" elements in the set."); 

所得出来余马得到的是3在两个当我使用的情况下StringBufferStringBuilder但在字符串的情况下,2,因为字符串已覆盖hashCode()equals()方法,请告知。

回答

5

StringBuilder/StringBuffer创建用于更高效的字符串操作,而不是存储值。所以你不应该把它用作键或者实现你的版本。或者只需拨打toString即可。

+0

StringBuilder还有其他用途,比如使用CharSequence来避免分配。不幸的是它没有得到执行。 – NateS 2012-06-15 10:30:51

0

StringBuilderStringBuffer是可变的字符序列而String是不可变的。

0

正如Paul Vargas所说,StringBuffer/StringBuilder是可变的。

这意味着两个StringBuilders或两个StringBuffers不能真正地说是平等的,除非它们实际上是相同的实例。因此,通过身份平等是最合适的语义。

StringBuffers和StringBuilders可变的事实也意味着它们不适合用作基于值的键等等。你应该首先创建一个字符串。

如果你真的需要一个具有等值的语义的“可变字符串”类,你总是可以复制AbstractStringBuilder的代码......或者从头开始实现它。

+0

您好史蒂芬,非常感谢,所以您的意思是说,我应该创建一个自定义类,扩展AbstractStringBuilder并重写hascode()和equals()作为字符串类已完成..! – dghtr 2012-04-28 10:18:22

+0

仅仅因为一个对象是可变的并不意味着它应该忽略实现等于。 AbstractStringBuilder不公开char []。 – NateS 2012-06-15 10:29:26

+0

@NateS - 我没有说任何人应该IGNORE实现平等。我所说的是,身份平等是对这些阶级平等的最适当的定义。请在downvoting之前尝试理解我的意思。 – 2012-06-15 11:19:40

1

不能让hashCode,equals或compareTo取决于对象添加到集合后可能发生的任何事情。例如

StringBuilder s1 = new StringBuilder("saral"); 
StringBuilder s2 = new StringBuilder("saral");   

HashSet set = new HashSet(); 
set.add(s1); 
set.add(s2); 
assert set.size() == 2; 

s2.append("-two"); 
assert set.size() == 2; 

如果你让s1.equals(s2)只有一个条目,当你改变s2时会发生什么?你现在有一两个参赛作品吗?

在StringBuilder的情况下,内容可以改变,所以它的hashCode和equals不依赖于它,所以它只有默认的实现。