判断两个List元素是否相同,注释的很清楚,先看一下工具类:

评论区有小哥提出下面这种写法对于集合中有重复元素时,会判断不准确;这个坑记录一下;

不要用下面这个方法!!!

    /*** 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同* 哈希地址相同 返回true* 如果两个参数都为空,则返回true* 如果有一项为空,则返回false* 如果数据长度不相同,则返回false* 集合1包含集合2中的所有元素,并且集合2也包含集合1中的所有元素 则返回true* 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同* @param l0* @param l1* @return*/public static boolean isListEqual(List l0, List l1){if (l0 == l1)return true;if (l0 == null && l1 == null)return true;if (l0 == null || l1 == null)return false;if (l0.size() != l1.size())return false;if (l0.containsAll(l1) && l1.containsAll(l0)){return true;}return false;}

分别比较两个List集合的哈希地址、NULL判断,长度判断、和内容判断;

但有一点特别显眼:集合中的元素必须重写equals方法自行判断元素是否相同

原因:containsAll方法的逻辑是逐个contains,而contains的包含逻辑是equals判断;如果集合中的元素没有重写equals方法,那么即使你的元素完全相同,比较的也是不准确;

请使用这个工具类!!!

public class ListUtils {/*** 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同* 哈希地址相同 返回true* 如果两个参数都为空,则返回true* 如果有一项为空,则返回false* 如果数据长度不相同,则返回false* 集合1包含集合2中的所有元素,并且集合2也包含集合1中的所有元素 则返回true* 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同* @param l0* @param l1* @return*/public static boolean isListEqual(List l0, List l1){if (l0 == l1)return true;if (l0 == null && l1 == null)return true;if (l0 == null || l1 == null)return false;if (l0.size() != l1.size())return false;if (isEqualCollection(l0 , l1) && l0.containsAll(l1) && l1.containsAll(l0)){return true;}return false;}private static final Integer INTEGER_ONE = 1;public static boolean isEqualCollection(Collection a, Collection b){if (a.size() !=b.size()) {  // size是最简单的相等条件return false;}Map mapa = getCardinalityMap(a);Map mapb = getCardinalityMap(b);// 转换map后,能去掉重复的,这时候size就是非重复项,也是先决条件if (mapa.size() !=mapb.size()) {return false;}Iterator it =mapa.keySet().iterator();while (it.hasNext()) {Object obj = it.next();// 查询同一个obj,首先两边都要有,而且还要校验重复个数,就是map.valueif (getFreq(obj,mapa) != getFreq(obj, mapb)) {return false;}}return true;}/*** 以obj为key,可以防止重复,如果重复就value++* 这样实际上记录了元素以及出现的次数*/public static Map getCardinalityMap(Collection coll) {Map count = new HashMap();for (Iterator it =coll.iterator(); it.hasNext();) {Object obj =it.next();Integer c =(Integer) count.get(obj);if (c == null)count.put(obj, INTEGER_ONE);else {count.put(obj, new Integer(c.intValue() + 1));}}return count;}private static final int getFreq(Object obj, Map freqMap) {Integer count =(Integer) freqMap.get(obj);if (count != null) {return count.intValue();}return 0;}}

测试1,没有重写equals:

public class BaseControllerCommandBean {private String comdName;private String comdValue;public BaseControllerCommandBean(){}public BaseControllerCommandBean(String name, String value){comdValue = value;comdName = name;}public String getComdName() {return comdName;}public void setComdName(String comdName) {this.comdName = comdName;}public String getComdValue() {return comdValue;}public void setComdValue(String comdValue) {this.comdValue = comdValue;}public static void main(String[] gin){ArrayList l0 = new ArrayList();l0.add(new BaseControllerCommandBean("1","ccc"));l0.add(new BaseControllerCommandBean("123","abc"));ArrayList l1 = new ArrayList();l1.add(new BaseControllerCommandBean("1","ccc"));l1.add(new BaseControllerCommandBean("123","abc"));System.out.println(ListUtils.isListEqual(l0,l1));}
}

测试2,重写equals以后:

public class BaseControllerCommandBean {private String comdName;private String comdValue;public BaseControllerCommandBean(){}public BaseControllerCommandBean(String name, String value){comdValue = value;comdName = name;}public String getComdName() {return comdName;}public void setComdName(String comdName) {this.comdName = comdName;}public String getComdValue() {return comdValue;}public void setComdValue(String comdValue) {this.comdValue = comdValue;}@Overridepublic boolean equals(Object obj) {if (this == null && obj == null)return true;if (this == null || obj == null)return false;if (obj.getClass() != this.getClass())return false;BaseControllerCommandBean objBean = (BaseControllerCommandBean) obj;
//        if (TextUtils.equals(this.comdName,objBean.comdName) && TextUtils.equals(this.comdValue,objBean.comdValue))if (this.comdName.equals(objBean.comdName) && this.comdValue.equals(objBean.comdValue))return true;return false;}public static void main(String[] gin){ArrayList l0 = new ArrayList();l0.add(new BaseControllerCommandBean("1","ccc"));l0.add(new BaseControllerCommandBean("123","abc"));ArrayList l1 = new ArrayList();l1.add(new BaseControllerCommandBean("1","ccc"));l1.add(new BaseControllerCommandBean("123","abc"));System.out.println(ListUtils.isListEqual(l0,l1));}
}

集合中的泛型使用这个,判断元素是否相同就正确了;

判断两个List元素是否相同;相关推荐

  1. go 判断元素是否在slice_golang 判断 两个slice 是否相等

    目录 在golang中我们可以轻松地通过==来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了. slice相等的定义 ...

  2. MATLAB——判断两个矩阵的元素是否完全相同

    1 致谢 感谢网友Inside_Zhang的帮助, 链接如下: https://blog.csdn.net/lanchunhui/article/details/50717400 2 前言 今天在学习 ...

  3. C语言——判断两个数组中是否有相同的元素

    题目:判断两个数组中是否有相同的元素,有就输出"有",没有就输出"没有". 解法一:用第一个数组中的所有元素与第二个数组中的所有元素相比较,若有相同元素,则停止 ...

  4. 表单实例(判断两次密码是否一致)

    表单实例(判断两次密码是否一致) 一.实例描述: 本例是一个综合性的练习,除了们正在学习的JS知识外,还用到了HTML的表格,表单等相关知识. 二.截图 三.代码 1 <!DOCTYPE htm ...

  5. 判断两棵树是否相等与使用二叉链表法建立二叉搜索树

    //判断两个二叉树是否相等 //提问如果两个二叉树的前序遍历相等,能否说明,这两个树相等? //答案是否定的,只有这两个树的 A前序=B前序,A中序=B中序才可以. BOOL isEqualTree( ...

  6. 集合 判断是否为同一元素 总结

    集合判断是否是同一元素的策略总结 总结: 对于List集合,仅仅是通过判断两个对象的[equals]方法是否为true 对于Hash系列的集合,是先判断对象的[hashCode]返回值是否相同,再判断 ...

  7. golang 判断 两个slice 是否相等

    目录 slice相等的定义 判断两个[]byte是否相等 使用reflect判断slice是否相等 手写判断 在golang中我们可以轻松地通过==来判断两个数组(array)是否相等,但遗憾的是sl ...

  8. python中怎么比较两个列表-Python两个列表元素比较

    Python两个列表元素的对比经常遇到,如何正确的比较? 知识点:列表解析. 详解: 列表解析 List Comprehensions 表达式:[expression for iter_val in ...

  9. Python语言学习:利用pandas对两列字段元素求差集(对比两列字段所有元素的异同)

    Python语言学习:利用pandas对两列字段元素求差集(对比两列字段所有元素的异同) 目录 利用pandas对两列字段元素求差集(对比两列字段所有元素的异同) 输出结果 实现代码 利用pandas ...

最新文章

  1. 云计算已成创新基础设施,三大暗流左右未来“云市场”
  2. Git命令按人统计提交次数和代码量
  3. XGBoost在携程搜索排序中的应用
  4. system 无法以 sysdba 登录,提示:权限不足。
  5. java source folder作用_java项目把源码放到folder里,不是source folder,这个java代码还能被调用吗?...
  6. vlan间路由的问题
  7. 如何在Java中针对XSD验证XML
  8. 爬虫(二)-创建项目应用
  9. 菜鸟教程 程序员学习网站
  10. 中国大侠vs生化战士(转)
  11. 数字后端基本技能之:绕线Congestion怎么解?
  12. bat计算机清理原理,科技教程:电脑如何一键清除垃圾bat
  13. 笔记连载 | Day6 FPGA三种建模方式区别及Verilog语法基础篇
  14. 联想e470锁定计算机,联想E470c电脑设置硬盘启动的方法,你值得拥有!
  15. Oracle中对数据分组统计
  16. Delphi桌面精灵开发
  17. 01-HTML学习笔记
  18. 计算机插入的图片怎么改成线条格式,电脑把CAD转化为JPG格式后图片不清晰怎么办...
  19. app inventor2环境搭建
  20. UE4 unix13位时间戳 转Windows DateTime

热门文章

  1. npm WARN checkPermissions Missing write access
  2. 【python脚本】写一个刷b站评论区的脚本
  3. 使用vue实现网上电影票购票选座
  4. 云服务器硬件加速是灰色的,win7系统显卡硬件加速显示灰色不能设置的解决方法...
  5. VLAN端口类型详解——Huawei、Cisco
  6. ACM Weekly 2
  7. Vue中watch和copmpted的区别
  8. SQL SERVER 主键插入数据
  9. 爱情=友情+异性吸引
  10. 全国综合信用评估中心江苏综信通开展信用评价的说明