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

ArrayList<String>可继承性疑问及contains方法失效问题

问题解答

关于ArrayList继承的疑问

  • ArrayList不是类,它是泛型类ArrayList的参数化类型。Java泛型采用擦除机制,编译后泛型信息会被移除,运行时实际是原始类型ArrayList。所以public static class StringArrayList extends ArrayList<String>能正常编译运行,本质是继承了原始类ArrayList,只是编译阶段编译器会帮你做元素类型的校验。
  • ArrayList本身是可扩展的,因为它没有被final关键字修饰。你继承的ArrayList<String>在运行时依然是ArrayList类型的实例,只是编译时限制了只能存储String类型元素。
  • 完全没必要继承ArrayList重写contains方法:ArrayList默认的contains逻辑就是遍历元素调用equals方法,而String的equals本来就是比较字符串内容,你重写的代码和默认逻辑完全一致,属于重复造轮子。

补充代码中contains未生效的原因

这段代码的问题出在contains方法的参数类型不匹配:

if(!star.contains(str.charAt(seq)+str.charAt(seq+1)))

str.charAt(seq)返回的是char类型,两个char相加会自动提升为int类型(因为char是数值型),所以你传给contains的是一个Integer对象,但你的ArrayList<String>里存储的是String对象。Integer和String类型不同,equals永远返回false,导致contains永远找不到元素,每次都会执行add操作,结果自然不符合预期。

修复方法

把参数改成字符串类型,和add里的写法保持一致即可:

// 方式1:用空字符串拼接转成String
if(!star.contains("" + str.charAt(seq) + str.charAt(seq+1)))

// 方式2:用substring更简洁高效
String subStr = str.substring(seq, seq+2);
if(!star.contains(subStr))
    star.add(subStr);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:53:22