class R implements Comparable
{
int count;
public R(int count)
{
this.count = count;
}
public boolean equals(Object obj)
{
if (obj instanceof R)
{
R r = (R)obj;
if (r.count == this.count)//这里r.count代表 需要比较的对象的count值,this.count代表当
{ //前对象的count值 可是我始终无法理解这两个的含义 麻烦哪位结合①②③
return true;//帮我细细分析一下(当程序执行到①时 需要比较的对象 和 当前对象 //分别是什么?执行到②?执行到③?) 谢谢
}
}
return false;
}
public int compareTo(Object obj)
{
R r = (R)obj;
if (this.count > r.count)
{
return 1;
}
else if (this.count == r.count)
{
return 0;
}
else
{
return -1;
}
}
}
public class TestTreeSet2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new R(5));①
ts.add(new R(-3));②
ts.add(new R(9));③
}
}
{
int count;
public R(int count)
{
this.count = count;
}
public boolean equals(Object obj)
{
if (obj instanceof R)
{
R r = (R)obj;
if (r.count == this.count)//这里r.count代表 需要比较的对象的count值,this.count代表当
{ //前对象的count值 可是我始终无法理解这两个的含义 麻烦哪位结合①②③
return true;//帮我细细分析一下(当程序执行到①时 需要比较的对象 和 当前对象 //分别是什么?执行到②?执行到③?) 谢谢
}
}
return false;
}
public int compareTo(Object obj)
{
R r = (R)obj;
if (this.count > r.count)
{
return 1;
}
else if (this.count == r.count)
{
return 0;
}
else
{
return -1;
}
}
}
public class TestTreeSet2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new R(5));①
ts.add(new R(-3));②
ts.add(new R(9));③
}
}
比如你现在有一个对象o1,你想和另一个对象o2比较是否相等(这个相等可以自定义规则,但是不能违反一些原则)。即采用如下的调用方式:
o1.equals(o2)
如果硬翻译成中文的话,就好像:我现在持有对象o1,与o2比较。既然o1做为你现在持有的对象,那么你在equals里想用o1的属性或方法时,就要是用this,如this.p1,它表示“当前对象”的属性p1。那么谁是“当前对象”呢,就是调用方法的对象。
就是如果你用对象调用了一个方法,如:obj.m()。
那么感觉上就是obj做了一个动作,这个动作是m,那么m中的this,也就是当前对象,自然是做动作的那个家伙,也就是obj了
R r5 = new R(5);
R r3 = new R(-3);
R r9 = new R(9);
System.out.println(current.equals(r5));
System.out.println(current.equals(r3));
System.out.println(current.equals(r9));
你override了equals()方法,但是在你的main方法中没有调用该方法,该方法不会执行。修改main方法为如上代码。在创建current对象时传的参数为9,此时会调用有一个参数的构造方法public R(int count),在构造方法中会将9赋值给本对象中的count变量,即current对象中的count。
对象r5、r3、r9与current类似。当调用current.equals(r5)时,public boolean equals(Object obj);时r5被当做参数传递进去。此时current中的count变量为this.count,因为是调用的current的equals方法,
即this.count此时为9,obj.count的值为5,然后比较两个count值,不相等返回false。r3、r9与r5类似。只是r9时r9的count值与current的count相等,返回true。
{ //前对象的count值 可是我始终无法理解这两个的含义 麻烦哪位结合①②③
return true;//帮我细细分析一下(当程序执行到①时 需要比较的对象 和 当前对象 //分别是什么?执行到②?执行到③?) 谢谢ts.add(new R(5));①
执行到①,集合里只有一个元素,所以没有发生比较,所以不调用equals,也不调用compareTots.add(new R(-3));②
执行到②,集合里有两个元素,发生比较,会调用compareTo方法(不调用equals方法),当前元素是new R(-3),和当前元素比较的r是①添加的元素,这里会排好序,R(-3)排在前,R(5)排在后ts.add(new R(9));③
执行到③,集合里有3个元素,发生比较,会调用compareTo方法(不调用equals方法),当前元素是new R(9),和当前元素比较的r是②中排在后的元素,联合从上面的代码就是①添加的元素,然后排序,R(9)排在R(5)之后,因为compareTo方法决定的9大于5,这里面Lz如果细心的话会发现,如果R(9)排在R(5)前面的,会发生什么情况?那就是R(9)会继续和排在R(5)前面的元素比较,那么当前对象还是R(9),和R(9)比较的是排在R(5)前面的元素R(-3),等等,依此类推所以,总结,当发生add的时候,当前对象就是被add的对象,比较的对象r就是排好序的最后一个对象,如果当前对象比排好序的最后一个对象“大”,那么比较到此结束,否则,就继续和排好序的倒数第2个,第3个等等比较,直到当前对象比某个对象“大”或排在最前面(如果没有对象比它“大”)为止。