去掉List中重复元素

 

 

看测试代码:

 

 

/**
 * 版权所有 (c) 2016,xiaoming有限公司  
 */
package ToolTest;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * 类说明:
 *
 * <pre>
 * Modify Information:
 * Author        Date          Description
 * ============ =========== ============================
 * xiaoming      2016-7-12    Create this file
 * </pre>
 *
 */
public class removeDuplicate {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<PersonBean> list = new ArrayList<PersonBean>();
        PersonBean person1 = new PersonBean();
        person1.setAge(11);
        person1.setName("xiaom");
        list.add(person1);
        PersonBean person2 = new PersonBean();
        person2.setAge(12);
        person2.setName("xiaom");
        person2.setmN("ddf");
        list.add(person2);

        PersonBean person3 = new PersonBean();
        person3.setAge(11);
        person3.setName("xiaom");

        list.add(person3);

        System.out.println(list);
        System.out.println(list.size());
        /**
         * 去重方法1
         *  HashSet<PersonBean> hs = new HashSet<PersonBean>(list);
            list.clear();//清除原先list
            list.addAll(hs);
            System.out.println(list);
            System.out.println(list.size());
         */

        /**
         * 去重方法2
         * 判断两个对象相等是否要重写equals 和hashcode方法
         * 首先说建议的情况:    比如你的对象想放到Set集合或者是想作为Map的key时,那么你必须重写equals()方法,这样才能保证唯一性。当然,在这种情况下,你不想重写hashCode()方法,也没有错。但是,对于良好的编程风格而言,你应该在重写equals()方法的同时,也重写hashCode()方法。
                            必须重写hashCode()的情况:
                               如果你的对象想放进散列存储的集合中(比如:HashSet,LinkedHashSet)或者想作为散列Map(例如:HashMap,LinkedHashMap等等)的Key时,在重写equals()方法的同时,必须重写hashCode()方法。
                            最后明白两点就行了:
                            1.hashCode()方法存在的主要目的就是提高效率。
                            2.在集合中判断两个对象相等的条件,其实无论是往集合中存数据,还是从集合中取数据,包括如果控制唯一性等,都是用这个条件判断的,条件如下:
                                首先判断两个对象的hashCode是否相等,如果不相等,就认为这两个对象不相等,就完成了。如果相等,才会判断两个对象的equals()是否相等,如果不相等,就认为这两个对象不相等,如果相等,那就认为这两个对象相等。
                                上面的条件对于任何集合都是如此,只要理解上面的条件,你就明白了,为什么在有些情况下建议重写hashCode().有些情况下,是必须要重写的,只有一个目的,就是提高效率,你想想,如果你重写了hashCode(),只要不满足第一个条件,那就直接可以判断两个对象是不等的,也就不用花费时间再去比较equals了。
                               最后总结一句话就是,hashCode()方法存在的主要目的就是提高效率,但是如果你想把对象放到散列存储结构的集合中时,是必须要重写的。
         */

        for ( int i = 0 ; i < list.size() - 1 ; i ++ ) {
            for ( int j = list.size() - 1 ; j > i; j -- ) {
              if (list.get(j).equals(list.get(i))) {
                list.remove(j);
              }
             }
           }
           System.out.println(list);
           System.out.println(list.size());
    }

}

 

 

 

 

 

PersonBean  代码:

 

/**
 * 版权所有 (c) 2016,xiaoming有限公司  
 */
package ToolTest;

/**
 * 类说明:
 *
 * <pre>
 * Modify Information:
 * Author        Date          Description
 * ============ =========== ============================
 * xiaoming      2016-7-12    Create this file
 * </pre>
 *
 */
public class PersonBean {

    private String  name;
    private Integer age;
    private String  mN;

    /**
     * @return the mN
     */
    public String getmN() {
        return mN;
    }

    /**
     * @param mN the mN to set
     */
    public void setmN(String mN) {
        this.mN = mN;
    }


    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * @param age the age to set
     */
    public void setAge(Integer age) {
        this.age = age;
    }


   /* @Override
    public boolean equals(Object obj) {
        PersonBean s=(PersonBean)obj;
        return age.equals(s.age) && name.equals(s.name);
    }
    @Override
    public int hashCode() {
        String in = age + name;
        return in.hashCode();
    } */

}

 

 

 

 

 

如果list中元素是一个对象 Object,有多个字段的,根据代码里面注释, 是要在PersonBean 中重写 equals 和hashcode方法的

 

08-26 22:32