关于String,StringBuilder和StringBuffer的区别

先说StringBuilder和StringBuffer的区别:

       StringBuilder是JDK1.5引入的,与StringBuffer几乎完全一样,唯一区别仅在于StringBuilder没有实现原StringBuffer的线程安全功能,故性能有所提高,以供重视性能而安全要求不高的场合选用。

String与StringBuilder和StringBuffer的区别:   

  1. String用于处理常量字符串,而StringBuilder和StringBuffer则用于处理内容可变得字符串,这三个类都被声明为final,不能被继承。(因为StringBuilder和StringBuffer除了安全性能,几乎完全一样,所以下面StringBuffer和StringBuilder统称为StringBuffer)。
  2. String重写了从Object继承的equals方法,而StringBufffer没有。
  3. 因为String类只能处理常量字符串,所以不适合频繁的插入,删除和修改等操作,会产生大量String对象,内存消耗极大,这种情况应先转为StringBuffer。
  4. 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版权协议,转载请附上原文出处链接和本声明。