更新時間:2022-12-26 15:03:24 來源:動力節(jié)點(diǎn) 瀏覽1194次
1、判斷s1和s2是否相等
String s1 = "123";
String s2 = "123";
System.out.println(s1 == s2); // true
System.out.println(s1.equals(s2)); // true
首先需要知道的是第一種方式是常量池中的對象的地址的比較
第二種是利用了String類的equals方法比較,看下源碼:
public boolean equals(Object anObject) {
// 判斷當(dāng)前的string對象是否和傳入進(jìn)來的對象的地址值相同
if (this == anObject) {
return true;
}
// 傳入進(jìn)來的對象是否是字符串類型的
if (anObject instanceof String) {
// 向下轉(zhuǎn)型,利用多態(tài)性質(zhì)
String anotherString = (String)anObject;
// 判斷兩個字符串的長度是否是相等的
int n = value.length;
if (n == anotherString.value.length) {
// 拿到當(dāng)前對象的數(shù)組和比較進(jìn)來的數(shù)組
// 居然還有這種操作,對于同種數(shù)據(jù)類型的來說,可以直接來進(jìn)行操作
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
// 遍歷每一個字符數(shù)組中的每一個元素
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
// 如果對象既不是和當(dāng)前string對象地址相同;也不是同一個類型的;長度也不相等
return false;
}
可以看到返回true的只有兩個地方:一、是同一個對象;第二個、字符串中的每個字符都是相同的。
但是對于字符串來說,無論是哪一種都是可以的,只不過第一種的話更加實(shí)用而已。
2、以下代碼創(chuàng)建了幾個對象
String s = new String("abc");
首先第一步:確定常量池中是否有"abc"這個對象,如果沒有,那么先在常量池中創(chuàng)建"abc"對象;如果有,那么就不需要在創(chuàng)建;
然后再從堆中的其他空間來創(chuàng)建一個對象,"abc"
所以可能創(chuàng)建了一個對象,也可能是創(chuàng)建了兩個對象。這取決于常量池中是否有"abc"
3、判斷new String是否相等
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
第一行代碼先去常量池中查找是否"abc"對象,然后再去堆中創(chuàng)建一個對象,返回s1指向堆中的內(nèi)存;
第二行中直接返回常量池中的地址;
第三行中==比較的是兩個字符串的地址不同,所以返回為false;
第四行中利用的equals方法比較的是兩個字符串,上面已經(jīng)分析過了。
這里需要注意的是:堆內(nèi)存中的和常量池中的都是用數(shù)組來進(jìn)行存儲的,比較的是數(shù)組中的字符
4、string被final修飾,值是不可變的,解釋?
String類上就是用final來進(jìn)行修飾的,所以這個類是無法繼承的;
String類中用來存放成員的字符串使用char數(shù)組,只不過使用final來修飾的變量,如果一旦確定了值,那么對應(yīng)的地址將無法來進(jìn)行修改。但是我們可以修改其中的數(shù)組中的值,但是String類并沒有來給我們提供。
int i = 0;
while(true){
if(i>obj.length) break;
obj[i] = i;
i++;
}
可以賦值,也可以來修改值。但是數(shù)組的引用是固定的。
String類但是我們?nèi)プ鲂薷模]有提供對應(yīng)的方法來進(jìn)行操作。
看看下面這段代碼:
String s = "Java";
s = "HTML";
值是不可變的,說的是存儲的字符串的地址是沒有辦法改變的,但是引用可以隨便指向。
對于狀態(tài)來說,已經(jīng)是固定的,無法來對其進(jìn)行修改。
以上就是“修煉手冊:Java字符串面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743