先说StringBuilder和StringBuffer的区别:
StringBuilder是JDK1.5引入的,与StringBuffer几乎完全一样,唯一区别仅在于StringBuilder没有实现原StringBuffer的线程安全功能,故性能有所提高,以供重视性能而安全要求不高的场合选用。
String与StringBuilder和StringBuffer的区别:
- String用于处理常量字符串,而StringBuilder和StringBuffer则用于处理内容可变得字符串,这三个类都被声明为final,不能被继承。(因为StringBuilder和StringBuffer除了安全性能,几乎完全一样,所以下面StringBuffer和StringBuilder统称为StringBuffer)。
- String重写了从Object继承的equals方法,而StringBufffer没有。
- 因为String类只能处理常量字符串,所以不适合频繁的插入,删除和修改等操作,会产生大量String对象,内存消耗极大,这种情况应先转为StringBuffer。
- String对象之间可以用操作符“+”进行拼接,而StringBuffer对象不可以,但可以用append()方法。
但我知道这个知识点后,我做了一道面试题,让我有了直观的感受。(摘自LeetCode一道面试题)
9.求最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
(PS:如果你看了上面的String和StringBuilder的区别后,再用到字符串拼接时候,你会下意识用到StringBuilder的,速度性能确实得到了极大的提升,我在LeetCode测试,速度性能直接从25ms 锐减到 8ms)
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 1)
return strs[0];
else if (strs.length == 0)
return "";
StringBuilder s = new StringBuilder();
String string = "";
int i = 0;
int len = strs[0].length() >= strs[1].length() ? strs[1].length() : strs[0].length();
while (i != len) {
if (strs[0].charAt(i) == strs[1].charAt(i)) {
s.append(strs[0].charAt(i));
} else {
break;
}
i++;
}
string = s.toString();
if (string.equals(""))
return "";
for (int k = 2; k < strs.length; k++) {
int leng = string.length() > strs[k].length() ? strs[k].length() : string.length();
StringBuilder sb = new StringBuilder();
if (leng == 0)
return "";
int x = 0;
while (x != leng) {
char ch = strs[k].charAt(x);
if (string.charAt(x) != ch && x == 0) {
return "";
} else if (string.charAt(x) == ch) {
sb.append(ch);
}else if(string.charAt(x) != ch) {
break;
}
x++;
}
if(!string.equals(sb.toString()))
string = sb.toString();
}
return string;
}
}
版权声明:本文为qq_36695156原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。