您的解决方案确实有点低效。
给你要解析的字符串的人也有点小丑。行业标准的序列化格式,比如JSON或XML,都有快速高效的解析方法。发明方轮永远不是一个好主意。
第一个问题:你在意吗?它是否足够慢,会影响应用程序的性能?可能不会,但只有一种方法可以找出来。对你的代码进行基准测试。
话虽如此,还有更有效率的解决方案。下面是一个例子。
public static void main (String[] args) throws java.lang.Exception
{
String test = "pet:cat::car:honda::location:Japan::food:sushi";
boolean stateiskey = true;
Map<String, String> map = new HashMap<>();
int keystart = 0;
int keyend = 0;
int valuestart = 0;
int valueend = 0;
for(int i = 0; i < test.length(); i++){
char nextchar = test.charAt(i);
if (stateiskey) {
if (nextchar == ':') {
keyend = i;
stateiskey = false;
valuestart = i + 1;
}
} else {
if (i == test.length() - 1 || (nextchar == ':' && test.charAt(i + 1) == ':')) {
valueend = i;
if (i + 1 == test.length()) valueend += 1;
String key = test.substring(keystart, keyend);
String value = test.substring(valuestart, valueend);
keystart = i + 2;
map.put(key, value);
i++;
stateiskey = true;
}
}
}
System.out.println(map);
}
这个解决方案是一个只有两个状态的有限状态机。它仅检查每个字符两次,一次在测试边界时,一次在将其复制到您的映射中的新字符串中。这是最少量。
它不会创建不需要的对象,如stringbuilders、strings或arrays,这可以保持集合压力低。
它保持良好的局部性。下一个字符可能总是在缓存中,因此查找是廉价的。
然而,它的代价很高,可能不值得:
- 它更加复杂和不明显
- 有各种各样的移动部件
- 当您的字符串格式出现意外情况时,调试变得更加困难
- 你的同事会讨厌你
- 当你不得不调试某些东西时,你会讨厌自己
值得吗?也许。你需要多快才能解析那个字符串?
https://ideone.com/8T7twy上的一个快速而肮脏的基准测试告诉我,对于这个字符串,这种方法大约快了4倍。对于更长的字符串,差异可能会更大。
但是你的版本仍然只有415毫秒,而这个版本只需要99毫秒就能完成10万次重复。