You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中ArrayList的contains方法无法正确判断船舶是否沉没问题

问题根因分析
  • 核心错误是对ArrayList.contains()方法的使用逻辑完全错误:你的fleetList是存储Ship对象的列表,而data.isAfloat()返回的是boolean类型的布尔值,两种完全不同类型的对象不可能匹配,所以contains()方法永远会返回false。
  • 你原本的判断逻辑if(fleetList.contains(data.isAfloat()) == false)就会永远成立,导致每遍历一艘船就给沉没数+1,最终统计出全部5艘都沉没的错误结果。
  • 额外的逻辑错误:你根本不需要调用contains方法来判断当前船舶是否沉没,直接取当前遍历到的Ship实例的isAfloat()返回值判断即可:isAfloat()返回true代表船舶正在漂浮,返回false代表已经沉没。
修正后的代码

只需要修改shipShow方法里的循环判断逻辑即可:

public static void shipShow(List<Ship> fleetList ) {
    System.out.println("ARRAY LIST OF SHIPS FROM METHOD");
    fleetList.remove(2);
    Ship ws2 = new WarShip("attack submarine", "United States Navy", true, 2015, "USS John Warner");
    fleetList.add(ws2);
    int sunk = 0;
    for (Ship data : fleetList) {
        System.out.println(data);
        // 直接判断当前船是否未漂浮(即沉没)
        if(!data.isAfloat()) {
            sunk += 1;
        }
    }
    System.out.println(sunk + " of these ships sank!");
}
补充说明

如果你后续确实需要用contains方法做船舶存在性校验(比如判断某艘特定的船是否在列表中),需要你在Ship类中重写equals()和hashCode()方法,否则contains会默认比对对象的内存地址,而不是对象的属性值。

内容的提问来源于stack exchange,提问作者NextBoldHarpy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:36:05