n******1 发帖数: 3756 | 1 为什么我这里的literal string 和我的封装类equals不上呢,放进set里面也说不相同
,但是hashcode是相等
import java.util.HashSet;
import java.util.Set;
public class SetTesting{
static class WrapString{
String str;
public WrapString(String str){
this.str = str;
}
@Override
public String toString(){
return str;
}
@Override
public int hashCode(){
return str.hashCode();
}
@Override
public boolean equals(Object o){
if(o == this)
return true;
if(o.hashCode() == this.hashCode())
return true;
if(o instanceof String){
String objectString = (String) o;
if(objectString.hashCode() == hashCode())
return true;
}
return false;
}
}
public static void main(String[] args){
Set set = new HashSet();
System.out.println(new WrapString("abc").equals(new String("abc")));
//true
System.out.println(new WrapString("abc").equals(new WrapString("abc"
))); //true
System.out.println("abc".equals(new String("abc"))); //true
System.out.println("abc".hashCode());
System.out.println(new WrapString("abc").hashCode());
System.out.println("abc".equals(new WrapString("abc")));//false
System.out.println(new WrapString("abc").equals("abc"));//true
set.add(new WrapString("abc"));
set.add(new WrapString("abc"));
set.add(new String("abc"));
set.add("abc");
System.out.println(set.size()); //2
}
} |
T****U 发帖数: 3344 | 2 首先,你调用string的equal method 比较两个不同的类,当然结果是false.
第二,wrapstring的equal方法的逻辑是错误的,hash相等,string并不一定相等/相同
,你要重新复习一下hashcode.如果这个逻辑你是故意 的,那你应该知道系统string类
的equal方法不是看hashcode的,而是比较单个char的值的
【在 n******1 的大作中提到】 : 为什么我这里的literal string 和我的封装类equals不上呢,放进set里面也说不相同 : ,但是hashcode是相等 : import java.util.HashSet; : import java.util.Set; : public class SetTesting{ : : static class WrapString{ : String str; : public WrapString(String str){ : this.str = str;
|
n******1 发帖数: 3756 | 3 对,那个equals确实是我贪图方便
或者我这样问吧,其实我主要想解决两个问题
1.如果我没法改变String的方法,String又不提供继承,那我怎么让可以让我这个类拿
去和String比较让它相等呢,我想到其中一种可能是调用toString的,这里我这里又写
了一个toString的原因
2.另外对于set,我这样直接add,怎么排重呢
【在 T****U 的大作中提到】 : 首先,你调用string的equal method 比较两个不同的类,当然结果是false. : 第二,wrapstring的equal方法的逻辑是错误的,hash相等,string并不一定相等/相同 : ,你要重新复习一下hashcode.如果这个逻辑你是故意 的,那你应该知道系统string类 : 的equal方法不是看hashcode的,而是比较单个char的值的
|
T****U 发帖数: 3344 | 4 不能直接比较,因为equal首先就判断是不是string类,不是直接就return false了。你
或者把string包装成你的类,再加到set比较;或者把你类里面的string提出来。
排重是什么意思?set本身就是unique的,重复(equal)的加不进去
【在 n******1 的大作中提到】 : 对,那个equals确实是我贪图方便 : 或者我这样问吧,其实我主要想解决两个问题 : 1.如果我没法改变String的方法,String又不提供继承,那我怎么让可以让我这个类拿 : 去和String比较让它相等呢,我想到其中一种可能是调用toString的,这里我这里又写 : 了一个toString的原因 : 2.另外对于set,我这样直接add,怎么排重呢
|
n******1 发帖数: 3756 | 5 我明白你意思了,谢谢
。你
【在 T****U 的大作中提到】 : 不能直接比较,因为equal首先就判断是不是string类,不是直接就return false了。你 : 或者把string包装成你的类,再加到set比较;或者把你类里面的string提出来。 : 排重是什么意思?set本身就是unique的,重复(equal)的加不进去
|