ArrayList的contains方法

  1. ArrayList實現插入時,實現去重插入,首先想到是什麼方法?contains?這個方法可靠嗎? 既然這麼問了確定就是不可靠,執行下面的代碼,來驗證這個方法是不可靠的,兩個集合同樣,卻進入不了if語句
public class Test1 {

	@Test
	public void test(){
		List<Person> list1 = new ArrayList<Person>();
		List<Person> list2 = new ArrayList<Person>();
		
		list1.add(new Person("1","1"));
		list1.add(new Person("2","2"));

		
		list2.add(new Person("1","1"));
		list2.add(new Person("2","2"));

		
		
		for(Person info : list1){
			if(list2.contains(info)){
				System.out.println("list2包含 list1的對象");
			}
		}
	}
	
	class Person {
		private String id;
		private String name;
		public Person(String id, String name) {
			this.id= id;
			this.name = name;
		}
		public String getId() {
			return id;
		}
		public void setId(String id) {
			this.id = id;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
	}
}

其實這個問題剛開始接觸java的時候,你們或許還知道,入行久了就淡忘了. 若是想繼續使用contians怎麼解決呢?從新equals方法. 在Person類中,添加equals方法java

class Person {
		private String id;
		private String name;
		public Person(String id, String name) {
			this.id= id;
			this.name = name;
		}
		public String getId() {
			return id;
		}
		public void setId(String id) {
			this.id = id;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		
		public boolean equals(Object o){
			Person person = (Person)o;
			
			return id == person.id && name == person.name;
		}
	}
  1. 爲何會出現這樣呢?先看下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;
    }

equals()默認的是比較引用,若是比較兩個對象的內容是否相等,就需像上面重寫equals方法.this

相關文章
相關標籤/搜索