今日 LeetCode 的每日一题,代码很简单,官方的题解如下:
class Solution {
public List<String> summaryRanges(int[] nums) {
List<String> ret = new ArrayList<String>();
int i = 0;
int n = nums.length;
while (i < n) {
int low = i;
i++;
while (i < n && nums[i] == nums[i - 1] + 1) {
i++;
}
int high = i - 1;
StringBuffer temp = new StringBuffer(Integer.toString(nums[low]));
if (low < high) {
temp.append("->");
temp.append(Integer.toString(nums[high]));
}
ret.add(temp.toString());
}
return ret;
}
}
可以看到官方使用 StringBuffer 来连接字符串,在不需要考虑线程安全的环境,毫无疑问可以使用 StringBuilder 来代替,但是问题在于,为什么使用+号来连接的效果会比 StringBuilder 及 StringBuffer 差?
String temp = Integer.toString(nums[low]);
if (low < high) {
temp += "->" + Integer.toString(nums[high]);
}
ret.add(temp);
两者的差别为:
StringBuilder/StringBuffer:
执行用时:0 ms, 在所有 Java 提交中击败了 100.00%的用户
+号连接:
执行用时:8 ms, 在所有 Java 提交中击败了 70.02%的用户
同样的代码在本地各循环 1000 万次的结果为
JDK 1.8(与 LeetCode 相同):7708ms vs 7287ms
JDK 11:7320ms vs 4511ms
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.