原因:List中储存的对象类型的元素,而在类中没有重写equals()和hashCode()方法。
我这里是有一个field类(未修改之前的代码)。
public class filed { String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
在Servlet中对list集合用HashSet去重
//部分代码如下 List<filed> hangye1 = new ArrayList<filed>(); while (rs.next()) { filed f=new filed(); f.setName(rs.getString(1)); //System.out.println(rs.getString(1).split("\s+")[0]); //测试数据获取 hangye1.add(f); } //使用HashSet方法 HashSet<filed> set = new HashSet<filed>(hangye1); hangye1.clear(); hangye1.addAll(set); for(int i=0;i<hangye1.size();i++) { System.out.println(hangye1.get(i).name); }
执行结果发现,list中存在相同元素。
修改filed类
public class filed { String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if(this == o){ return true; } if(o == null){ return false; } if(getClass() != o.getClass()){ return false; } filed user = (filed) o; if(name == null){ if(user.name !=null){ return false; } }else{ if(!name.equals(user.name)){ return false; } } return true; } @Override public int hashCode() { return 1; } }
再次执行,去重操作执行。问题是解决了,但是原理还没看明白。
原理参考:https://blog.csdn.net/fjian123/article/details/79534586