更新時間:2020-10-22 17:09:53 來源:動力節(jié)點 瀏覽1280次
相信各位想面試程序員的朋友們,在面試前都會做的功課就是java面試題的搜集整理與學(xué)習(xí)。字符串是在面試中經(jīng)常出現(xiàn)的題目,算是必考題。關(guān)于字符串,我們以前也學(xué)習(xí)過string字符串以及字符串截取方式等相關(guān)知識,下面整理了10道java字符串面試題,里面的內(nèi)容都是十分基礎(chǔ)的,大家可以來檢測一下關(guān)于java字符串的內(nèi)容自己掌握的是否全面。
1、創(chuàng)建String對象的不同方式有哪些?
答:兩種方式。一種是通過new很關(guān)鍵字來創(chuàng)建。使用這種方式時,JVM創(chuàng)建字符串對象但不存儲在字符串池中,我們可以調(diào)用intern()方法將該字符串對象存儲在字符串池中,如果該字符串池已經(jīng)有了同樣值得字符串,則返回引用。另一種是使用雙引號來直接創(chuàng)建。使用這種方式時。JVM去字符串找有沒有相同值的字符串,如果有,則返回找到的字符串引用。否則創(chuàng)建一個新的字符串對象,并存儲在字符串池中。
2、什么是String,它是什么數(shù)據(jù)類型?
答:String是定義在java.lang包下的一個類,它不是基本數(shù)據(jù)類型。
String是不可變的,JWM使用字符串池來儲存所有的字符串對象。
3、如何比較兩個字符串?
答:String內(nèi)部實現(xiàn)了Comparable接口,有兩個比較方法:compareTo(String anotherString)和compareToIgnoreCase(String str)。
compareTo(String anotherString)與傳入的anotherString字符串進行比較,如果小于傳入的字符串返回負(fù)數(shù),如果大于則返回正數(shù)。當(dāng)兩個字符串值想等時,返回0此時equals方法會返回true。equalsIgnoreCase(String str)該方法與compareTo方法類似,區(qū)別只是內(nèi)部利用了Character.toUpperCase等方法進行了大小轉(zhuǎn)換后進行比較。
4、String、StringBuffer、StringBuilder的區(qū)別?
答:String是不可變類,每當(dāng)我們對String進行操作的時候,總會創(chuàng)建新的字符串。操作String和耗費資源,所以java提供了兩個工具類來操作String——StringBuffer和StringBuilder。
StringBuilder和StringBuffer是可變類,StringBuffer是線程安全的,StringBuilder則不是線程安全的。所以在多線程對同一字符串進行操作的時候,我們選擇StringBuffer。在不需要處理多線程的情況下,StringBuilder的效率比StringBuffer高。
5、String是不可變的有什么好處?
答:由于String是不可變類,所以在多線程中使用是安全的,我們不需要做其他任何同步操作。String是不可變的,其值也是不可變的,所以用來存儲數(shù)據(jù)密碼很安全。因為java字符串不可變,可以在java運行時節(jié)省大量堆空間。因為不同的字符串變量可以引用池中的相同的字符串。如果字符串是可變的話,任何一個變量的值改變,就會映射到其他變量,那么字符串池也就沒有什么意義了。
6、下面程序的運行結(jié)果是什么?
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2)); //1,false
StringBuffer s3 = new StringBuffer("abc");
System.out.println(s3.equals("abc")); //2,false
System.out.println(s3.toString().equals("abc")); //3,true
答:注釋1打印為false,主要考察String的equals方法,String源碼中 equals 方法有對參數(shù)進行 instance of String 判斷語句,StringBuffer的祖先為CharSequence,所以不相等;注釋2打印為false,因為StringBuffer 沒有重寫Object的equals方法,所以O(shè)bject的equals方法實現(xiàn)是==判斷,故為 false; 注釋3打印為true,因為Object的toString方法返回為String類型,String重寫了equals方法實現(xiàn)為值比較。
7、為什么針對安全保密高的信息,char[]比String更好?
答:因為String是不可變的,一旦創(chuàng)建就不能更改,直到垃圾收集器將它回收才能消失,即使我們修改了原先的變量,實際上也是在內(nèi)存中新建一個對象,原數(shù)據(jù)還是保留在內(nèi)存中等待回收;而字符數(shù)組char[]中的元素是可以更改的,也就是說像密碼等保密信息用完之后我們可以馬上修改它的值而不留痕跡,從而相對于String有更好的安全性。
8、說說 String str = "hello world"; 和 String str = new String("hello world"); 的區(qū)別?
答:在 java的class文件中有專門的部分用來存儲編譯期間生成的字面常量和符號引用,這部分叫做class文件常量池,在運行期間對應(yīng)著方法區(qū)的運行時常量池,所以String str = "hello world"; 在編譯期間生成了 字面常量和符號引用,運行期間字面常量 "hello world" 被存儲在運行時常量池(只保存了一份),而通過new關(guān)鍵字來生成對象是在堆區(qū)進行的,堆區(qū)進行對象生成的過程是不會去檢測該對象是否已經(jīng)存在的,所以通過new來創(chuàng)建的一定是不同的對象,即使字符串的內(nèi)容是相同的。
9、如何判斷兩個String是否相等?
答:有兩種方式判斷字符串是否相等,使用“= = ”或者使用equals方法。當(dāng)使用 “= =”操作符時,不僅比較字符串的值還比較引用的內(nèi)存的值。大多相互情況下,我們只需要判斷值是否相等,此時用equals方法即可。還有一個用equalsIgnoreCase可以用來忽略大小寫進行比較。
10、如何將String轉(zhuǎn)換為byte array,反過來呢?
答:使用String的getBytes()方法將String轉(zhuǎn)換成byte數(shù)組,使用String的構(gòu)造方法new String(byte[] arr)將byte數(shù)據(jù)轉(zhuǎn)為String。
public class StringToByteArray{
public static void main(String[] args){
String str="PANKAJ";
byte[] byteArr=str.getBytes();
//print the byte[] elements
System.out.println("String to byte array:"+Array.toString(byteArr))
}
public static void main(String[] args)
{
byte[] byteArray={'P','A','N','k','A','J'};
byte[] byteArray={80,65,78,75,65,74};
String str=new String(byteArray);
Srting str1=new String(byteArray1);
System.out.println(str);
System.out.println(str1);
}
}
以上是今天要學(xué)習(xí)的java字符串面試題,因為現(xiàn)在的公司越來越看重java程序員的基本能力十分扎實,對java的基礎(chǔ)知識考查是十分重視的,所以上面的10道java字符串面試題中涉及的內(nèi)容希望大家認(rèn)真學(xué)習(xí),遇到不會的及時查漏補缺,為java面試做好準(zhǔn)備。
初級 202925
初級 203221
初級 202629
初級 203743