Java如何拆分含换行符的长字符串并将每行内容存入List集合
字符串按行拆分存入List的正确实现
现有代码问题
你当前写的逻辑存在几个明显bug,无法正常得到预期结果:
- 死循环问题:
while (content.contains("\n"))的循环体内从未修改过content变量的值,只要初始字符串包含换行符,循环判断条件永远为真,程序会直接卡死在循环中,无法执行到后续打印逻辑。 - 逻辑冗余:循环内反复执行完全相同的拆分、赋值操作,没有任何实际意义,属于无效代码。
- 兼容性差:硬编码用
\n做分隔符,无法识别Windows系统常用的\r\n、老Mac系统常用的\r换行符,拆分结果可能残留多余的\r字符。 - 集合限制:
Arrays.asList返回的是固定长度的List,不支持add/remove等修改操作,后续如果要调整集合内容会抛出异常。
正确实现方案
方案1:JDK11+ 推荐写法(最鲁棒简洁)
JDK11新增的String.lines()方法会自动识别所有主流换行符,自动跳过字符串末尾的空行,直接拆分得到行流,收集为List即可:
import java.util.List; public class LineSplitTest { public static void main(String[] args) { String content = "das,fdfd,fdsd,dsds,arer" + "\n" + "abv,dsds,dsa,wew,ewewew" + "\n" + "dfdf,wewes,mds,ojop,nsmcd"; List<String> lineList = content.lines().toList(); System.out.println(lineList); // 输出:[das,fdfd,fdsd,dsds,arer, abv,dsds,dsa,wew,ewewew, dfdf,wewes,mds,ojop,nsmcd] // 集合长度为3,完全符合预期 } }
方案2:JDK8 兼容写法
如果使用JDK8及更早版本,可以用正则匹配所有换行符做拆分,需要可变集合的话用ArrayList包一层:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class LineSplitTestJdk8 { public static void main(String[] args) { String content = "das,fdfd,fdsd,dsds,arer" + "\n" + "abv,dsds,dsa,wew,ewewew" + "\n" + "dfdf,wewes,mds,ojop,nsmcd"; // 正则匹配 \r\n、\n、\r 三种换行符 List<String> lineList = new ArrayList<>(Arrays.asList(content.split("\\r?\\n|\\r"))); System.out.println(lineList); } }
注意:如果不需要后续修改集合,也可以去掉外层
new ArrayList<>(),直接使用Arrays.asList返回的固定长度列表,按需选择即可。
内容的提问来源于stack exchange,提问作者Ajm Kir
相关产品推荐
相关产品推荐

