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
相关产品推荐
相关产品推荐

