黑马程序员技术交流社区
标题:
使用TreeSet时重写equals和不重写equals的区别
[打印本页]
作者:
熊永标
时间:
2013-1-9 17:34
标题:
使用TreeSet时重写equals和不重写equals的区别
package cn.javastudy.p3.Collection.copy;
import java.awt.peer.SystemTrayPeer;
import java.util.*;
@SuppressWarnings("unused")
public class MyVector3 {
public static void main(String[] args)
{
MyComparator com=new MyComparator();
TreeSet<myInteger> v=new TreeSet<myInteger>(com);
//向ArrayList中添加元素
v.add(new myInteger(10));
v.add(new myInteger(40));
v.add(new myInteger(20));
v.add(new myInteger(50));
v.add(new myInteger(50));
Iterator<myInteger> it=v.iterator();
while(it.hasNext())
System.out.println(it.next().getIt());
}
}
class myInteger extends abc
{
public Integer getIt() {
return it;
}
public myInteger(Integer it) {
this.it = it;
}
public boolean equals(Object obj) {
return it.equals(((myInteger)obj).it);
}
}
class abc
{
Integer it=null;
}
class MyComparator implements Comparator<abc>
{
@Override
public int compare(abc o1, abc o2) {
if(o1.equals(o2))
return 0;
return o1.it<o2.it?-1:1;
}
}
/*
10
20
40
50
*/
复制代码
不重写如下
package cn.javastudy.p3.Collection.copy;
import java.awt.peer.SystemTrayPeer;
import java.util.*;
@SuppressWarnings("unused")
public class MyVector3 {
public static void main(String[] args)
{
MyComparator com=new MyComparator();
TreeSet<myInteger> v=new TreeSet<myInteger>(com);
//向ArrayList中添加元素
v.add(new myInteger(10));
v.add(new myInteger(40));
v.add(new myInteger(20));
v.add(new myInteger(50));
v.add(new myInteger(50));
Iterator<myInteger> it=v.iterator();
while(it.hasNext())
System.out.println(it.next().getIt());
}
}
class myInteger extends abc
{
public Integer getIt() {
return it;
}
public myInteger(Integer it) {
this.it = it;
}
// public boolean equals(Object obj) {
// return it.equals(((myInteger)obj).it);
// }
}
class abc
{
Integer it=null;
}
class MyComparator implements Comparator<abc>
{
@Override
public int compare(abc o1, abc o2) {
if(o1.equals(o2))
return 0;
return o1.it<o2.it?-1:1;
}
}
复制代码
使用TreeSet存贮对像时,还得重写对像的equals方法,不重写的话,有重复的元素
作者:
熊永标
时间:
2013-1-9 17:36
不重写返回:
20
40
50
50
作者:
肖志锋
时间:
2013-1-9 21:15
。。。看看两者代码就知道,TreeSet的构造函数里面有一个参数是比较器,而看这个比较器的代码可以知道,他调用了容器里面元素的equals方法,而如果不重写equals方法,则调用的是从Object继承而来的那个用"=="来实现比较的原来方法,比较值(地址值或者数值),所以基本没什么意义。在代码里面每new一个对象他们的地址值基本不会一样,这样必然存在重复元素。这是实现无重复元素的第一种方式,让容器具有比较性。一般使用内部类实现就行了,也比较常用。
第2种方式,就是让对象具有比较性,去实现Comparable接口,然后实现compareTo方法即可。TreeSet会根据这个方法的返回值决定元素的位置,以及要不要添加他,也就去掉了重复元素。
作者:
黄锦成
时间:
2013-1-9 23:09
不重写的话是比较内存地址,重写的话,是自己定义比较的内容,一般都建议重写
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2