本帖最后由 HM朱蛟 于 2013-4-2 01:47 编辑
问题解决了,谢谢各位!
我明白了
我太局限于代码了。忽略了al.contains(obj)的意思。
caontains是个动作,这个动作遵循 (o==null ? e==null : o.equals(e))
之前看api没看懂,其实o.equals(e)的意思就是说,我contains收到的参数,将与指定容器里的所有element分别作比较,
那么这个指定的容器是哪个呢?newal.contains,这样写是有道理的,这个指定容器就是newal。
所以当写成这样后,思路就清晰了:
Object obj = it.next()
if(!al.contains(obj))
我从函数里接收到的list取第一个元素,那么传入到equals的就是第1个元素01, 01.equals(null)...return false; -->add(01)
我从函数里接收到的list取第二个元素,那么传入到equals的就是第2个元素02, 02.equals(01)...return false; --->add(02)
我从函数里接收到的list取第三个元素,那么传入到equals的就是第3个元素01, 01.equals(02)...return false;
01.equals(01)...return true;--->kill
这样一写,this和p就清晰的分辨出来了。。。
总结:
犯这个问题的主要原因就是没理解到contains的原理,没看懂caontains的api。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
之前的问题:
虽然代码验证了 this代表指向前一个对象 p代表指向后进对象 但是我思路还是不够清晰
不能很清晰的看出他们之间是如何联系的
我怎么老感觉this和p是同一个对象呢?
该如何想才能清晰的分辨出this指向的对象和p指向的对象不同呢?
感谢各位的指点,可能是我没表述清楚自己的问题,小弟想问的不是this是什么,怎么用,也不是真真的真,真假得假。小弟疑惑的是这段代码里this和p是怎么指向不同的对象的。
我说下我的理解思路吧,我知道自己的思路是错的,运行结果验证了这点,但是我恐怖的发现我自己居然不知道错在哪里!所以我想请大家告诉我该如何去想这个问题.
我的思路:(下面标记 1 2 3 4是针对这个问题的执行顺序)
当执行到killEcho里的这句 if(!al.contains(obj))
取第一个对象,Object obj = it.next();
执行 if(!al.contains(obj)),由于obj不为空,执行o.equlas(e);那么这句自动调用Person里复写的equals,这时候equals里接收的obj为 【 new Person("haha01",1) ,】,所以我认为当前对象就是【 new Person("haha01",1) ,】 ,this指向 【 new Person("haha01",1) ,】 。继续执行下句,Person p =(Person)obj; 这句只是个向下转型,我觉得操作的还是【 new Person("haha01",1) ,】 , 所以我在这里也觉得 p也是指向了 【 new Person("haha01",1) ,】 ,
所以我的疑问点就在这里,p和this既然都是指向的【 new Person("haha01",1) ,】 ,2个指向同一个对象的引用味着不管怎么比this.name.equals(p.name) 都是返回的真
那么这句就是永远返回真 return this.name.equals(p.name) && this.age ==p.age; ,外面判断结果 !真if(!al.contains(obj)) ,即假,那么应该将元素全部添加到临时容器。
这就是我老是感觉this和p指向的是同一个对象的原因。比较郁闷,问题表述不当,各位见谅啊
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
代码如下
需求:将自定义对象作为元素存入集合内。并将容器内重复的对象元素剔除,保留不同的元素
比如:存人对象,同姓名同年龄,视为同一个人,为重复元素。
import java.util.*;
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public boolean equals(Object obj) // ----------2
{
if(!(obj instanceof Person))
return false;
Person p =(Person)obj; // ----------3
System.out.println(this.name+"...."+p.name);
return this.name.equals(p.name) && this.age ==p.age; // ----------4
}
}
class Run
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add(new Person("haha01",1));
al.add(new Person("haha02",2));
al.add(new Person("haha01",1));
al.add(new Person("haha02",2));
al.add(new Person("haha01",1));
al.add(new Person("haha05",5));
al = killEcho(al);
Iterator it = al.iterator();
while(it.hasNext())
{
Object obj = it.next();
Person p = (Person)obj;
sop(p.getName()+"...."+p.getAge());
}
}
public static ArrayList killEcho(ArrayList list)
{
ArrayList al = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext())
{
Object obj = it.next();
if(!al.contains(obj)) // ----------1
al.add(obj);
}
return al;
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
|
|