與String相關的面試題彙總

1、先來個最古老的,String是否是基本數據類型

答:不是,基礎數據類型包括byte、char、short、int、long、float、double、boolean ,這八種類型都是Java中內置的類型,也叫原生類型,string不是,它是一個類。

2、String s1="abc";String s2="abc"; System.out.println(a==b);  輸出結果是什麼?

答:結果是true,由於String是final類,字符串是常量(內存中創建後不能被修改),而且字符串經常在程序中使用,所以Java爲其提供了緩衝區,緩衝區內

的字符串會被共享,使用雙引號形式定義一個字符串的時候就會被存儲在緩衝區的,使用"abc"的時候會先在緩衝區中尋找是否存在此字符串,沒有就創建一個,

有則直接使用,第一次使用“abc”的時候會在緩衝區中創建,第二次的時候就會直接引用。

所以,如果問題目中的代碼創建了幾個對象,那麼也就是創建了一個。

比較一下:

public class StringDemo1 {
	public static void main(String[] args) {
		test1();
		test2();
	}
	private static void test1() {
		String s1="abc";
		String s2="abc";
		System.out.println(s1==s2);//true
	}

	private static void test2() {
		String s3=new String("bcd");
		String s4="bcd";
		System.out.println(s3==s4);//false	
	}
}
 

所以,再用構造函數創建一個字符串對象的時候,是每次都在緩衝區外創建一個新的對象,用"=="比較的時候永遠不會相等。

3、String s1="abc";String s2="ab"+"c"; System.out.println(a==b);  輸出結果是什麼?

答:結果還是true;其實這裏的s2並沒有進行字符串相加,兩個字符串常量相加在編譯的時候會自動轉換成一個字符串。

4、下面這條語句一共創建了多少個對象:String s="a"+"b"+"c"+"d";

答:由前面的兩道題,其實我們已經知道這道題的答案了,明白了它的原理也就不那麼難了,答案就是0個或者1個

因爲如果對象"a"+"b"+"c"+"d"在編譯的時候會自動將其編譯成"abcd",所以這道題就變成了String s="abcd";創建了幾個對象?  

如果在執行該句代碼之前緩衝區中存在"abcd"這個對象,那麼就不會重新創建對象,那麼就是0個,如果緩衝區中沒有"abcd"這個對象,那麼就是1個。

5、String s=new String("xyz");創建了幾個對象?有什麼不同?

答:創建了一個或者兩個 ,首先new String("xyz")肯定會在內存中創建一個對象,它是參照常量"xyz"進行創建對象,所以首先會看緩衝區中是否存在常

量"xyz",如果不存在,要先在緩衝區中創建一個常量"xyz",否則不用創建,所以答案爲1個或者2個。

6、==和equals的區別

(1)、基本數據類型,也稱爲原始數據類型(byte、char、short、int、long、float、double、boolean)它們之間的比較用雙等號(==),比較的是它們的值。

(2)、對象的比較,當對象用==進行比較的時候比較的是它們的內存中的存放地址,所以,new出的兩個相同對象用==比較是不相等的,因爲它們在內存中存放的地址不同,所以對象的比較要用equals進行比較,值得注意的是,其實Object類中定義的equals方法也是基於==的,源代碼如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }
在Object類中equals比較的也是內存地址,但是在String、Integer、Date等類中覆寫了Object類中的equals方法,我們拿String類中的equals方法看一下:
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;//本身字符串長度
            if (n == anotherString.value.length) {//如果本身字符串長度與傳遞進來的字符串長度相等就繼續向下比較
                char v1[] = value;//取每一個位置的字符
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])//對每一個位置的字符進行逐一比較
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
看明白了吧,String中覆寫的equals方法是用來比較兩個字符串的內容是否相同的,而不是內存中的存放地址。

7、String s="abcdefg"; s.substring(0,3);System.out.println(s);

答:這題就比較簡單了,答案就是abcdefg,因爲String類是final類,值不可改變,final類不可被繼承。

8、String類和StringBuffer類的區別

Java平臺提供了兩個類,String和StringBuffer類,String類提供了數值不可改變的字符串,StringBuffer類提供的字符串可以進行修改。

所以我們可以使用StringBuffer來構造動態數據。舉個例子:

我們要把1到100的所有字符串拼起來,組成一個新的字符串,當我們用String類和StringBuffer類分別執行的時候:

import java.util.Date;
public class StringDemo {
	public static void main(String[] args) {
		StringTest();
		StringBufferTest();
	}

	private static void StringTest() {
		long d1=new Date().getTime();
		String s = "";
		for(int i=1;i<=10000;i++){
			s=s+i;
		}
		long d2=new Date().getTime();
		System.out.println("應用String類用時"+(d2-d1));//190
	}
	private static void StringBufferTest() {
		long d3=new Date().getTime();
		StringBuffer s1 =new StringBuffer();
		for(int i=1;i<=10000;i++){
			s1=s1.append(i);
		}
		long d4=new Date().getTime();
		System.out.println("應用StringBuffer類用時"+(d4-d3));//1
	}
	
}

通過打印看出StringBuffer類的效率要比String高的多。因爲用String的時候要循環創建100個對象,而用StringBuffer的時候只是一個對象的值在不斷改變。

另外,兩者還有個重要的區別,就是String類覆寫了Object類的equals方法,所以new String(“abc”).equals(new String("abc"))的結果是true,而

StringBuffer類並沒有覆寫Object的equals方法。所以new StringBuffer("abc").equals(new StringBuffer("abc"))的結果爲false。

注意:StringBuffer 對象用append()來修改其對象,而不是用“+”; StringBuffer對象不能用“=”賦值,只能用構造函數(new StringBuffer(""))來賦

值。

8、StringBuffer和StringBuilder的區別

區別就是StringBuffer是支持多線程操作,是線程安全的,而StringBuilder只能支持單線程操作,是線程不安全的。由於StringBuffer支持了多線程的操作導

致比StringBuilder性能慢。

以後看見新的再補充,也歡迎大家幫忙補充……


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章