黑马程序员技术交流社区
标题:
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
[打印本页]
作者:
零敢
时间:
2013-12-18 16:31
标题:
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
是用==还是equals()? 它们有何区别?
作者:
恨死我了
时间:
2013-12-18 16:43
Set是Collection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象。
使用equals()区分更合适。==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。所以应该用equals()来判断。
作者:
風諾
时间:
2013-12-18 16:44
HashSet是先用HashCode,相同就equals比较
TreeSet应该是根据元素自身的比较性
作者:
程洋
时间:
2013-12-18 17:22
不能单一的说Set是怎样实现它自身的元素唯一性的,还要看他子类的底层数据结构.
HashSet的底层是哈希表,保持证元素的唯一性的依据是:它是通过元素的两个方法hashCode()和equals来完成的,如果hashCode值相同,才会判断equals 是否相同。反之不会判断equals
TreeSet底层是二叉树,保证元素唯一性的依据:用compareto这个方法来验证来验证两个元素是否相同,返回值为零表示两数相同,不存,返回正数,表示新来的元素大于已有的元素,返回负数,表示小于已有的元素。
作者:
夏德宇
时间:
2013-12-18 21:48
public class Test {
public static void main(String[] args) {
Set<String> set = new HashSet();
set.add("a");
set.add("a");
set.add("b");
set.add("c");
for(String str : set){
System.out.println(str);
//打印结果为:b c a 证明第二个“a"没能存进去
}
}
}
复制代码
所以肯定不是“==”,如果是“==”那么“a" == "a"肯定会得到两者不同,二个“a"会存进去。
具体是什么情况参照楼上。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2