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

相关文章
相关标签/搜索