使用java.util.List的containsAll()方法可能导致的问题

这篇具有很好参考价值的文章主要介绍了使用java.util.List的containsAll()方法可能导致的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天在偶然之间发现了一个bug,原因居然是使用了containsAll()方法,这个问题很简单,看以下代码就能发现很大的问题。

package collection;

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

/**
 * @author heyunlin
 * @version 1.0
 */
public class ListExample {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(2);
        list.add(3);
        list.add(3);

        List<Integer> integerList = new ArrayList<>();

        integerList.add(3);
        integerList.add(3);
        integerList.add(3);

        System.out.println(list);
        System.out.println(integerList);
        System.out.println(list.containsAll(integerList));
    }

}

上面的结果最后一行打印的是true,因为containsAll()方法的作用类似于遍历指定的集合c,通过contains()比较集合中每个元素,如果有元素不包含在当前的list对象中,就返回false,否则返回true,为了便于理解,写了以下伪代码

public interface List<E> extends Collection<E> {

    public boolean containsAll(Collection<?> c) {
        for (Object o : c) {
            if (!this.contains(o)) {
                return false;
            }
        }
        
        return true;
    }

}

因此,文章给出的代码等价于

package collection;

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

/**
 * @author heyunlin
 * @version 1.0
 */
public class ListExample {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(2);
        list.add(3);
        list.add(3);

        System.out.println(list);
        System.out.println(integerList);
        System.out.println(list.contains(3));
    }

}

总结:这篇文章分享了一下项目中遇到的关于containsAll()方法使用时要注意的的问题,当比较的两个list中元素个数相同时,用equals()方法替代containsAll()方法使用,但是在使用之前需要对两个集合排序(因为List的源码里已经说明了,只有集合元素的个数和顺序都一样才返回true)。

/**
 * Compares the specified object with this list for equality.  Returns
 * true if and only if the specified object is also a list, both
 * lists have the same size, and all corresponding pairs of elements in
 * the two lists are equal.  (Two elements e1 and
 * e2 are equal if (e1==null ? e2==null :
 * e1.equals(e2)).)  In other words, two lists are defined to be
 * equal if they contain the same elements in the same order.  This
 * definition ensures that the equals method works properly across
 * different implementations of the List interface.
 *
 * @param o the object to be compared for equality with this list
 * @return true if the specified object is equal to this list
 */
boolean equals(Object o);

好了,文章就分享到这里了,感谢阅读~文章来源地址https://www.toymoban.com/news/detail-624583.html

到了这里,关于使用java.util.List的containsAll()方法可能导致的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “No primary or single unique constructor found for interface java.util.List”问题原因及解决

    问题原因: 这个错误通常出现在使用 MyBatis 查询结果映射时,MyBatis 无法找到适合的构造方法来将查询结果转换为指定的 Java 对象。具体来说,错误信息 \\\"No primary or single unique constructor found for interface java.util.List\\\" 意味着 MyBatis 在将查询结果转换为 List 类型对象时遇到了问题,

    2024年02月09日
    浏览(38)
  • java.sql.SQLFeatureNotSupportedException 问题及可能的解决方法

    目录 问题 分析: 解决方法 java.sql.SQLFeatureNotSupportedException   可能是你的 druid的maven依赖版本太低了,我的以前是1.1.16,就出现了异常!   解决方法 把 druid的maven依赖版本调高! 运行结果: 成功!可以查出数据!    在postman中测试:  

    2024年02月13日
    浏览(23)
  • 可能导致balenaEtcher写入出错的原因以及如何解决这些问题

    balenaEtcher是一款流行的免费开源烧录软件,它能够帮助用户将ISO映像文件或者img文件烧录到USB闪存驱动器或SD卡上。尽管balenaEtcher使用简单,但有时候在烧录过程中可能会出现错误。下面是一些可能导致balenaEtcher写入出错的原因以及如何解决这些问题: 1.不正确的映像文件:

    2024年02月05日
    浏览(106)
  • Go坑:time.After可能导致的内存泄露问题分析

    Go 中 time.After 可能导致的内存泄露 go v1.20.4 time 包中有 3 个比较常用的定时函数:NewTicker,NewTimer 和 time.After: NewTimer : 表示在一段时间后才执行,默认情况下执行一次。如果想再次执行,需要调用 time.Reset() 方法,这时类似于 NewTicker 定时器了。可以调用 stop 方法停止执行。

    2024年02月02日
    浏览(43)
  • 未检查的转换: ‘java.lang.Object‘ 转换为 ‘java.util.List

    在这个示例中,我们使用JSON.toJSONString()将object对象转换为JSON字符串,然后使用JSON.parseObject()将JSON字符串转换为List对象。 需要注意的是,为了正确地解析泛型类型,我们使用了TypeReference类作为parseObject()方法的第二个参数。TypeReference类是fastjson提供的一个工具类,用于解析泛

    2024年02月11日
    浏览(24)
  • WPF 已知问题 RadioButton 指定 GroupName 后关闭窗口可能导致无法选中

    本文记录一个 WPF 已知问题,当 WPF 的 RadioButton 指定 GroupName 且将 IsChecked 状态绑定到 ViewModel 上,将包含以上控件的代码的窗口显示两个,接着关闭其中一个。此时可以看到依然开着的窗口的 RadioButton 控件无法正确在用户界面上点击选中 此问题已经报告给 WPF 官方,请看 ht

    2024年02月08日
    浏览(29)
  • WPF 已知问题 传入错误数据给到 WriteableBitmap 可能导致渲染线程锁住

    本文记录一个 WPF 已知问题,此问题已经被我修复。传入错误的数据给到 WriteableBitmap 对象,比如调用 WritePixels 时传入错误的 stride 数值,将可能导致渲染线程进入无限自旋锁 应用程序停止渲染,或者是界面未响应。表现是在 渲染 线程卡住,从任务管理器看可以看到有一个

    2024年02月09日
    浏览(28)
  • 关于可能由 VSCode 自动更新导致的 Jupyter 无法检测到内核的问题的解决

    环境 使用 Anaconda 中安装的 Jupyter Notebook 在 VSCode 中安装 Jupyter 相关插件以在 VSCode 中使用,如下: 问题描述 之前可以选择内核(可能要先 “Python: 选择解释器”,也可能不用),并且是自己检测到 conda 环境中的 Python。 但是后来会突然找不到内核,点击选择内核,会在空白

    2024年04月09日
    浏览(47)
  • 【Element】el-dialog 内使用 el-image 并添加 preview-src-list 预览,拖拽导致图片预览不完整问题

    el-dialog 内使用 el-image 并添加 preview-src-list 预览,拖拽导致图片预览不完整 添加 preview-teleported 属性,官方对这个的解释是: image-viewer 是否插入至 body 元素上。 嵌套的父元素属性会发生修改时应该将此属性设置为 true 解决el-image在el-dialog内预览展示不全

    2024年02月16日
    浏览(28)
  • 调试器加载错误,从任务栏打开可能会导致该问题(微信开发者工具)

    在使用HBuilder X 3.6.4 运行微信小程序的时候,发现报错如下: [微信小程序开发者工具] × #initialize-error: [error] 工具的服务端口已关闭。要使用命令行调用工具,请在下方输入 y 以确认开启,或手动打开工具 - 设置 - 安全设置,将服务端口开启。     尝试了手动开启服务端口之

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包