0

hashCode()equals()方法没有被覆盖StringBufferStringBuilder我在下面尝试这段代码..

    //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,StringBuffer或者StringBuilder在 string 的情况下是 2,因为 string 已经覆盖了hashCode()andequals()方法,请告知。

4

4 回答 4

5

StringBuilder/StringBuffer 是为了更有效的字符串操作而创建的,而不是为了存储值。因此,您不应将其用作键或实现您的版本。或者干脆调用toString它。

于 2012-04-28T06:48:54.457 回答
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 不依赖于此,因此它只有默认实现。

于 2012-04-28T07:32:47.787 回答
0

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

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

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

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

于 2012-04-28T07:29:42.977 回答
0

StringBuilder并且StringBuffer是可变的字符序列并且String是不可变的。

于 2012-04-28T07:15:44.677 回答