Android Studio中动态输入字符串split("")拆分出现空串的问题
关于Android Studio中字符串拆分开头空串的问题解答
嘿,我之前在做Android项目时也遇到过一模一样的问题,来给你理清楚原因和靠谱的解决办法,不用被迫从索引1开始遍历~
为什么会出现开头的空串?
这个问题本质是Java版本里String.split()的实现差异搞的鬼:
- 在Java 8及更早版本(Android的ART runtime很多时候是兼容Java 8的),当你用
split("")拆分非空字符串时,它会把字符串最开头的「空分隔位置」也当成一个元素返回,所以就出现了你看到的{"", "a", "b", "c", "D"}这种结果。 - 你说手动设置key时结果正常,大概率是你手动测试的环境(比如本地Java 9+的IDE运行)用了更新的
split()实现——Java 9之后修复了这个问题,split("")拆分非空字符串时不会再生成开头的空串。
当然也有极小概率是模拟器输入的字符串藏了看不见的空白字符(比如零宽空格),但结合你手动设置正常的情况,这个可能性很低,主要还是split()的版本实现差异导致的。
解决办法(不用跳过索引1)
给你几个实用的方案,按需选:
方案1:用toCharArray()替代split("")(最推荐)
这是最直接也最可靠的方式,直接把字符串转成字符数组,完全不会有空串问题,而且所有Android版本都支持:
char[] keyChars = key.toCharArray(); // 遍历处理每个字符 for (char c : keyChars) { // 比如打印字符 Log.d("KeyChar", String.valueOf(c)); }
方案2:用正则split("(?!^)")拆分
这个正则的意思是「只在非开头的位置拆分空串」,这样就能避开开头的空元素,Java 8里也能用:
String[] keys = key.split("(?!^)"); // 此时keys就是{"a", "b", "c", "D"}
方案3:用流过滤空串(Android API 26+可用)
如果你的项目适配的是Android 8.0及以上,可以用Java流来过滤掉拆分出来的空串:
import java.util.regex.Pattern; import java.util.stream.Collectors; String[] keys = Pattern.compile("") .splitAsStream(key) .filter(s -> !s.isEmpty()) .toArray(String[]::new);
总结
优先选toCharArray(),简单高效还没兼容性问题;如果必须要字符串数组,split("(?!^)")是最简洁的正则方案,不用额外处理。
内容的提问来源于stack exchange,提问作者Mona
相关产品推荐
相关产品推荐

