搜尋
首頁JavaJava面試題5道String面試題,能全答對的人不到10%! (附答案)

這篇來看看關於Java String#類別的5 道面試題,這五題,我自己在面試過程中親身經歷過幾題目,本篇就帶你了解這些題的答案為什麼是這樣。

st1和st2是否相等?

public class Demo2_String { 
  public static void main(String[] args) {
    String st1 = "abc";
    String st2 = "abc";
    System.out.println(st1 == st2);
    System.out.println(st1.equals(st2));
  }
}

輸出結果:

  • #第一行:true
  • 第二行:true

分析

先看第一個列印語句,在Java中==這個符號是比較運算符,它可以基本資料類型和引用資料類型是否相等,如果是基本資料類型,==比較的是值是否相等,如果是引用資料類型,==比較的是兩個物件的記憶體位址是否相等。

字串不屬於8中基本資料類型,字串物件屬於引用資料型,在上面把「abc」同時賦值給了st1和st2兩個字串對象,指向的都是同一個位址,所以第一個列印語句中的==比較輸出結果是true 然後我們看第二個列印語句中的equals的比較,我們知道,equals是Object這個父類別的方法,在String類別中重寫了這個equals方法。

#

在JDK API 1.6文档中找到String类下的equals方法,点击进去可以看到这么一句话“将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的String 对象时,结果才为 true。” 注意这个相同字符序列,在后面介绍的比较两个数组,列表,字典是否相等,都是这个逻辑去写代码实现。

由于st1和st2的值都是“abc”,两者指向同一个对象,当前字符序列相同,所以第二行打印结果也为true。下面我们来画一个内存图来表示上面的代码,看起来更加有说服力。

5道String面試題,能全答對的人不到10%! (附答案)

内存过程大致如下:

1)运行先编译,然后当前类Demo2_String.class文件加载进入内存的方法区

2)第二步,main方法压入栈内存

3)常量池创建一个“abc”对象,产生一个内存地址

4)然后把“abc”内存地址赋值给main方法里的成员变量st1,这个时候st1根据内存地址,指向了常量池中的“abc”。

5)前面一篇提到,常量池有这个特点,如果发现已经存在,就不在创建重复的对象

6)运行到代码 Stringst2 =”abc”, 由于常量池存在“abc”,所以不会再创建,直接把“abc”内存地址赋值给了st2

7)最后st1和st2都指向了内存中同一个地址,所以两者是完全相同的。

到底创建了几个对象?

String st1 = new String(“abc”);

答案是:在内存中创建两个对象,一个在堆内存,一个在常量池,堆内存对象是常量池对象的一个拷贝副本。

分析

我们下面直接来一个内存图。

5道String面試題,能全答對的人不到10%! (附答案)

当我们看到了new这个关键字,就要想到,new出来的对象都是存储在堆内存。然后我们来解释堆中对象为什么是常量池的对象的拷贝副本。

“abc”属于字符串,字符串属于常量,所以应该在常量池中创建,所以第一个创建的对象就是在常量池里的“abc”。

第二个对象在堆内存为啥是一个拷贝的副本呢,这个就需要在JDK API 1.6找到String(String original)这个构造方法的注释:初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。所以,答案就出来了,两个对象。

st1和st2是否相等?

package string;
public class Demo2_String {
   public static void main(String[] args) {
     String st1 = new String("abc");
     String st2 = "abc";
     System.out.println(st1 == st2);
     System.out.println(st1.equals(st2));
   }
}

答案:false 和 true 由于有前面两道题目内存分析的经验和理论,所以,我能快速得出上面的答案。

==比较的st1和st2对象的内存地址,由于st1指向的是堆内存的地址,st2看到“abc”已经在常量池存在,就不会再新建,所以st2指向了常量池的内存地址,所以==判断结果输出false,两者不相等。

第二个equals比较,比较是两个字符串序列是否相等,由于就一个“abc”,所以完全相等。

内存图如下

5道String面試題,能全答對的人不到10%! (附答案)

st1和st2是否相等?

public class Demo2_String { 
   public static void main(String[] args) {
     String st1 = "a" + "b" + "c";
     String st2 = "abc";
     System.out.println(st1 == st2);
     System.out.println(st1.equals(st2));
   }
}

答案是:true 和 true 分析:“a”,”b”,”c”三个本来就是字符串常量,进行+符号拼接之后变成了“abc”,“abc”本身就是字符串常量(Java中有常量优化机制),所以常量池立马会创建一个“abc”的字符串常量对象,在进行st2=”abc”,这个时候,常量池存在“abc”,所以不再创建。所以,不管比较内存地址还是比较字符串序列,都相等。

判断一下st2和st3是否相等

public class Demo2_String {
 
   public static void main(String[] args) {
     String st1 = "ab";
     String st2 = "abc";
     String st3 = st1 + "c";
     System.out.println(st2 == st3);
     System.out.println(st2.equals(st3));
   }
}

答案:

  • false
  • #true

##true

5道String面試題,能全答對的人不到10%! (附答案)

#分析

上面的答案第一個是false,第二個是true,第二個是true我們很好理解,因為比較一個是“abc”,另外一個是拼接得到的“ abc”,所以equals比較,這個是輸出true,我們很好理解。

5道String面試題,能全答對的人不到10%! (附答案)那麼第一個判斷為什麼是false,我們很疑惑。同樣,下面我們用API的註解說明和記憶體圖來解釋這個為什麼不相等。

首先,開啟JDK API 1.6中String的介紹,找到下面圖片這句話。

關鍵點就在紅圈這句話,我們知道任何資料和字串進行加號( )運算,最終得到是一個拼接的新的字串。號操作到底做了什麼?推薦看下。

上面註解說明了這個拼接的原理是由StringBuilder或StringBuffer類別和裡面的append方法實作拼接,然後呼叫toString() 把拼接的物件轉換成字串對象,最後把得到字串物件的地址賦值給變數。結合這個理解,我們下面畫一個記憶圖來分析。

大致記憶體過程

###1)常數池建立「ab」對象,並賦值給st1,所以st1指向了「ab」#### ##2)常數池建立「abc」對象,並賦值給st2,所以st2指向了「abc」######3)由於這裡走的的拼接方法,所以第三步是使用StringBuffer類別的append方法,得到了“abc”,這個時候內存0x0011表示的是一個StringBuffer對象,注意不是String對象。 ######4)呼叫了Object的toString方法把StringBuffer物件裝換成了String物件。 ######5)把String物件(0x0022)賦值給st3######所以,st3和st2進行==判斷結果是不相等,因為兩個物件記憶體位址不同。 ###

總結

這篇的面試題,完全就是要求掌握JDK API中一些註解與原理,以及記憶體圖分析,才能得到正確的結果,我承認是畫內存圖讓我理解了答案為什麼是這樣。

#

以上是5道String面試題,能全答對的人不到10%! (附答案)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:Java后端技术全栈。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器