Java 字符串 & List集合 高频易错真题复盘(含全部错题+修正)

最近刷题最容易踩坑的字符串 String 和 List 集合 题型,我把你写过的所有错题、错误原因、正确代码、底层原理一次性整理成一篇完整复盘博客。

全部是考试/作业高频题,看完直接避开90%的新手BUG。

一、List 一次性初始化赋值(新手简化写法)

问题:多次调用 add() 太繁琐,如何一次性存入多个元素?

错误写法:重复多行 add

复制代码
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);

正确简洁写法

复制代码
// JDK8
ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3,4,5));

// JDK9+ 更推荐
ArrayList<Integer> list1 = new ArrayList<>(List.of(1,2,3,4,5));

核心知识点:List.of() / Arrays.asList() 得到的是固定大小集合,必须外层 new ArrayList 才能后续增删。

二、字符串去除所有空格(常见逻辑误区)

需求:删除字符串全部空格(首尾+中间)

新手错误思路:只使用 trim() + 尝试修改原字符串

错误根源:

  • String 不可变,不能循环中直接修改
  • trim()只能去首尾空格,去不了中间空格

最简正确写法

复制代码
public static String removeAllSpace(String str){
    if(str == null) return "";
    return str.replace(" ", "");
}

手动遍历原理版(理解用)

复制代码
public static String removeAllSpace(String str){
    if(str == null) return "";
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if(c != ' '){
            sb.append(c);
        }
    }
    return sb.toString();
}

三、统计子串出现次数(substring 经典错题)

新手两大致命错误:

  1. substring(起始下标, 长度) ------ 第二个参数是结束下标,不是长度
  2. 字符串对比用 == 比较地址,不是内容
  3. 循环条件少等号,漏判最后一组

修正完整版

复制代码
public static int subStringCount(String src,String sub){
    if(sub == null || sub.length() == 0 || sub.length() > src.length()){
        return 0;
    }
    int sum = 0;
    int subLen = sub.length();
    for (int i = 0; i <= src.length() - subLen; i++){
        String temp = src.substring(i, i + subLen);
        if (temp.equals(sub)){
            sum++;
        }
    }
    return sum;
}

四、字符串去重(保留第一次出现的字符)

你的原代码BUG:

  • 先 append 再判断,永远去重失败
  • contains 不能直接传 char
  • 返回值类型不匹配,需要 toString()

正确代码

复制代码
public static String removeDuplicateChar(String str){
    StringBuilder s1 = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        // 没有该字符才追加
        if(s1.toString().indexOf(c) == -1){
            s1.append(c);
        }
    }
    return s1.toString();
}

核心逻辑:先判断、后添加!

五、List 遍历删除元素(并发修改异常经典题)

错误代码现象 :增强 for 循环中 list.remove() 直接报错 ConcurrentModificationException

错误原因:增强for基于迭代器,遍历中修改集合结构会触发校验异常

最优三种写法

  1. Java8 最简写法(推荐)

    public static void removeBiggerThan10(List list){
    list.removeIf(s -> s > 10);
    }

  2. 迭代器写法(考试标准)

    public static void removeBiggerThan10(List list){
    Iterator it = list.iterator();
    while(it.hasNext()){
    Integer s = it.next();
    if(s > 10){
    it.remove();
    }
    }
    }

六、偶数放前面、奇数放后面(原地排序高频错题)

你的原代码BUG:

  • remove 之后没有临时变量,元素丢失,拿到错误值
  • 删除元素后 i 继续++,漏掉元素
  • 直接插入导致元素重复、下标错乱

稳妥满分写法(新建集合,零BUG)

复制代码
public static List<Integer> evenFirst(List<Integer> list){
    List<Integer> newList = new ArrayList<>();
    // 先存偶数
    for(Integer num : list){
        if(num % 2 == 0){
            newList.add(num);
        }
    }
    // 再存奇数
    for(Integer num : list){
        if(num % 2 != 0){
            newList.add(num);
        }
    }
    return newList;
}

七、List 获取最小值(逻辑完全跑偏错题)

你的原代码问题:双层循环累加数值,完全不是求最小值

正确求最小值标准写法

复制代码
public static int getMin(List<Integer> list){
    if(list == null || list.isEmpty()){
        throw new RuntimeException("集合为空");
    }
    int min = list.get(0);
    for (Integer num : list){
        if(num < min){
            min = num;
        }
    }
    return min;
}

八、字符串下标常用方法(必背对应关系)

  1. charAt(下标):根据下标拿字符

  2. indexOf(字符/子串):根据内容拿下标,找不到返回 -1

  3. lastIndexOf():从后往前找下标

九、全篇核心避坑总结(考前必看)

  • String 不可变,所有修改都要新字符串 / StringBuilder
  • 字符串比较内容必须用 equals,坚决不用 ==
  • substring 第二个参数是结束索引,不是长度
  • 增强 for 循环不能增删集合,必报并发修改异常
  • 集合删除元素后下标会前移,普通for循环必须手动控制i
  • 去重、判断类逻辑:先判断,再操作
相关推荐
qq_3646821519 分钟前
录音APP怎么切换语言?多语言版本如何使用
java·服务器·前端
Wang's Blog24 分钟前
Java 项目实战: 交友项目 - 用户体系集成:根据环信id查询用户详情
java·lua·交友
摇滚侠28 分钟前
《On Java 中文版 基础卷》阅读笔记 复用 13
java·笔记·python
2601_9689007731 分钟前
玻璃深加工的工艺窗口:4 道工序的温度与时间参数边界
android·java·javascript
薛之谦_37 分钟前
用 Java 实现阿里云式 IAM 子用户管理:架构设计与表结构详解
java·python·阿里云
甜到心里的蛋糕1 小时前
抖音评论自动回复机器人部署实践:无头 Chrome + DeepSeek + NapCat(2C2G 云主机)
java·jvm·chrome·python·抖音·deepseek
Java爱好狂.1 小时前
阿里1658页Java面试题总结(含答案)
java·后端·高并发·架构师·java面试·java面试题·java八股文
Thanks_ks1 小时前
从 0.1+0.2 不等于 0.3 说起:聊聊浮点数精度问题
java·python·数值计算·精度丢失·bigdecimal·浮点数·ieee754
海鸥-w1 小时前
区域名称同步存储实现笔记
java·笔记
Rain的Java大神之路2 小时前
LeetCode 21 合并两个有序链表:一道 Easy 题,凭什么刷掉一半候选人?
java·后端·算法