import java.util.HashSet;public class Test { public static void main(String[] args) {
String s2 = new String("this");
String s3 = new String("this");
String s4 = "this"; HashSet<String> hs = new HashSet<String>();
hs.add(s2);
hs.add(s3);
hs.add(s4); System.out.println(hs.size()); //output:1 。还望高人解答
}
}
String s2 = new String("this");
String s3 = new String("this");
String s4 = "this"; HashSet<String> hs = new HashSet<String>();
hs.add(s2);
hs.add(s3);
hs.add(s4); System.out.println(hs.size()); //output:1 。还望高人解答
}
}
解决方案 »
- 客户端 服务端 实现MP3文件的传输???
- 高手进来在线等,报出一个SocketException异常
- java中如何判断一个线程是否存在?
- 问点JAVA工作问题
- i can't set the Background colour.....
- 怎么保存Icon 到数据库或者.ico文件?
- jode有使用混淆成功的人吗?网上这资料好少啊!
- 键盘监听和鼠标监听为什么不能同时使用??
- 推荐基本JAVA的好书
- java applet用socket要sign是吗?(高分!!)
- 关于java的.split方法
- Exception in thread "main" java.lang.NullPointerException 各位大大帮忙看一下吧
所以Set<String>中,只能有一个"this"
String s2 = new String("this");
String s3 = new String("this");
s2 和s3 不是用一个对象吧?...
用new创建的,就应该不是同一个对象,那为什么不能重复添加进hashset?
Set:无顺序的,元素不可重复(值不相同)
遍历:迭代
排序:SortedSet
HashSet:采用哈希算法来实现Set接口
唯一性保证:重复对象equals方法返回为true
重复对象hashCode方法返回相同的整数
不同对象 哈希码 尽量保证不相同
System.out.println(s2.equals(s3));
System.out.println(s3.equals(s4));
值都是true
import java.util.HashSet;
import java.util.Set;public class Test {
public boolean equals(Object o){
return true;
}
public static void main(String[] args) { Set<Test> hs = new HashSet<Test>();
Test t1 = new Test();
Test t2 = new Test();
hs.add(t1);
hs.add(t2); System.out.println(t1.equals(t2)); //true
System.out.println(hs.size()); //2
}
}
s2.equals(s3)); ---> true
s3.equals(s4)); ---> true而s2 == s3 ---> false
s3 == s4 ---> false
import java.util.Set;public class Test {
public boolean equals(Object o){
return true;
}
public int hashCode(){
return 100;
}
public static void main(String[] args) { Set<Test> hs = new HashSet<Test>();
Test t1 = new Test();
Test t2 = new Test();
hs.add(t1);
hs.add(t2); System.out.println(t1.equals(t2)); //true
System.out.println(hs.size()); //1
}
}
import java.util.Set;public class Test
{
/*public boolean equals(Object o)
{
return true;
}*/
public static void main(String[] args)
{
Set<Test> hs = new HashSet<Test>();
Test t1 = new Test();
Test t2 = new Test();
hs.add(t1);
hs.add(t2);
System.out.println(t1.equals(t2)); // false
System.out.println(hs.size()); //2
}
}
public boolean equals(Object o)
{
return true;
}
你让它返回true,不代表它就是t1.equals(t2) == true
....
看看你写的那个,不管谁调用都返回"true",这个貌似没什么意义吧?
重写的equals的返回值应该是 return false; 不然的话,你new 100个对象放set里 大小也都是1 !
这个没重写 hashCode()他比较地址发现不等,就不用比较equals()了.比较顺序是先 hashCode() 若相等在 equals()若hashCode()不等 那就不等了 就不调用equals()了.
equals return true 只是用来测试玩的,呵呵
2. String的hashCode依据: 以依赖于char[i]的int值以和char[i]的排列序的算法计算出的.不依赖String的ref.
3. String的equals依据: a=b || ( a.length=b.length && { a[i]=b[i] } )
4. 只有用a=b时比校的才是比校的ref,也就是说这时才是比校是a与b是不是同一个对象
5. 结论: 两个不同ref的String可能会被认为是集合中的同一个元素.