用到集合ArrayList時經常會用到里面自帶的方法boolean contains(Object o);此方法用於判斷集合里面是否包含元素o,現在討論下在Object類型為類類型的時候的情況;
class Point1{ //代表細胞 public int x; //行 public int y; //列 public Point1(int x,int y){ this.x=x; this.y=y; } } public class Test{ public static void main(String args[]){ List<Point1> list=new ArrayList<Point1>(); Point1 a=new Point1(1,2); Point1 b=new Point1(1,2); list.add(a); if(list.contains(b)){ System.out.println("1"); } } }
無輸出,因為對象a和b是擁有不同的引用!
看ArrayList的contains的源碼
public boolean contains(Object o) { return indexOf(o) >= 0; } public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; }
在語句 o.equals(elementData[i]) 中,調用了equals方法,眾所周知,此方法比較的是引用,所以可以Override此方法以達到我們所需要的效果。
class Point1{ //代表細胞 public int x; //行 public int y; //列 public Point1(int x,int y){ this.x=x; this.y=y; } @Override public boolean equals(Object obj) { Point1 newPoint=(Point1)obj; return this.x==newPoint.x && this.y==newPoint.y; } }
class Point1{ //代表細胞 public int x; //行 public int y; //列 public Point1(int x,int y){ this.x=x; this.y=y; } @Override public boolean equals(Object obj) { Point1 newPoint=(Point1)obj; return this.x==newPoint.x && this.y==newPoint.y; } } public class Test{ public static void main(String args[]){ List<Point1> list=new ArrayList<Point1>(); Point1 a=new Point1(1,2); Point1 b=new Point1(1,2); list.add(a); if(list.contains(b)){ System.out.println("1"); } } }
1