黑马程序员技术交流社区
标题:
Set问题
[打印本页]
作者:
曾辉
时间:
2012-1-12 13:48
标题:
Set问题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
作者:
李娟
时间:
2012-1-12 13:50
你问题真多{:soso_e127:}
作者:
李娟
时间:
2012-1-12 13:53
1、什么是Set?
Set是Collection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象。
2、如何来区分重复与否呢?
“ 用 iterator() 方法来区分重复与否 ”,这是在网上流传的答案,个人认为这是个错误的答案。JPI中写的很明白:“set 不包含满足e1.equals(e2) 的元素对 e1 和 e2 ”,由此可见回答使用equals()区分更合适。
3、为什么用equals()而不用==来区分?
应该从它俩的区别谈起,==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。所以应该用equals()来判断。
作者:
曾辉
时间:
2012-1-12 14:12
呵呵,不懂就要问,学习中......
作者:
张冬冬
时间:
2012-1-12 14:18
set集合分为,hashset和treeSet
hashset是根据对象的hashset值来先判断是否为同一元素,hash值相同的在比较equals,
TreeSet是二叉树的结构,大的数放在第一个数的右边,小的在左边,就这么找,找到最后比较的也应该是equals,
所以我觉得都有吧,毕竟==和hash一样,比较的都是地址值.
作者:
zl918
时间:
2012-1-12 16:09
加入Set的元素必须定义equals()方法以确保对象的唯一性。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责)
存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
作者:
大梅
时间:
2012-1-26 00:09
翻了一下源码,HashSet是用HashMap集合实现的,例如添加一个元素时调用的是HashMap的put方法。当添加元素的时候,已存在于集合的元素不应该被添加进去。
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table
; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
{
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
注意红色部分,我们可以发现源码中既用==比较一下,又用equals比较一下,只要其中一个一样,再加上这个对象存储在相应的hashcode的存储区内,我们就认为这两个值相等。
==是比较了对象中的值,equals是比较了对象存储的地址,两者有这样的区别。
作者:
黄秋
时间:
2012-1-26 22:01
==比较的是两个对象的地址,而equals比较的是两个对象的内容(值)。
当equals为true时,==不一定为true:
public static void main(String[] args) {
String s1,s2,s3,s4;
s1=new String("abc");
s2="abc";
s3="abc";
s4=new String("abc");
System.out.println(s3==s2);
System.out.println(s1==s2);
System.out.println(s1==s4);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s4));
}
复制代码
//为 true false false true true
s1与s2、s4的比较,用“==”为false,显然与目的不符,判断它们的值是否相等,应用equals方法。所以set 一般用equals方法比较两个对象,前面几楼也有解释。Integer还要特殊一点,小于128 的保存在常量池,大于等于128在堆:
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a ==b); //true
System.out.println(c ==d); //false
System.out.println(c.equals(d)); //true
复制代码
总结:
1、两个简单类型的数值是否相等,可用“==”来比较;
2、两个对象的值是否相等,则要用对象的equals()方法比较;
3、两个对象是否指向同一对象(地址),则使用“==”来进行比较;
4、对于自定义的类,应该根据情况覆盖其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。
作者:
余海龙
时间:
2012-2-6 15:42
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
首先:
== :用于比较基本数据类型的值是否相等,还可以用于比较两个对象是否指向同一个对象。
equals():是Object类中的方法,一般类在新建时都会重写equals()和hashCode ()方法。
Set集合 : hashSet集合在添加元素时,会自动调用元素类中的hashCode()和equals()方法,会对新添加的元素与集合中元素进行比较,
如果集合中有则不会添加到集合中,如果没有则添加到结合中。
TreeSet集合在添加元素时,会调用元素类中的compareTo()方法或者调用比较器的compare( )方法,如果方法返回的值为0,
则不能填加到结合。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2