目錄
到底创建了几个对象? " >到底创建了几个对象?
st1和st2是否相等? " >st1和st2是否相等?
判断一下st2和st3是否相等 " >判断一下st2和st3是否相等
首頁 Java Java面試題 5道String面試題,能全答對的人不到10%! (附答案)

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

Aug 23, 2023 pm 02:49 PM
java面試題

這篇來看看關於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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1244
24
面試官:Spring Aop 常見註解和執行順序 面試官:Spring Aop 常見註解和執行順序 Aug 15, 2023 pm 04:32 PM

你一定知道 Spring , 那說說 Aop 的去全部通知順序, Spring Boot 或 Spring Boot 2 對 aop 的執行順序影響?說說你在 AOP 中遇到的那些坑?

某團面試:如果線上遇到了OOM,該如何檢查?如何解決?哪些方案? 某團面試:如果線上遇到了OOM,該如何檢查?如何解決?哪些方案? Aug 23, 2023 pm 02:34 PM

OOM 意味著程式存在漏洞,可能是程式碼或 JVM 參數配置引起的。這篇文章跟讀者聊聊,Java 進程觸發了 OOM 後如何排查。

餓了麼筆試題,看似簡單,難倒一批人 餓了麼筆試題,看似簡單,難倒一批人 Aug 24, 2023 pm 03:29 PM

在很多公司的筆試題中,千萬別小看,都是有坑的,一不小心自己就掉進去了。遇到這種關於循環的筆試題,建議,自己冷靜思考,一步一步來。

5道String面試題,能全答對的人不到10%! (附答案) 5道String面試題,能全答對的人不到10%! (附答案) Aug 23, 2023 pm 02:49 PM

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

小白也能與BAT面試官對線:CAS 小白也能與BAT面試官對線:CAS Aug 24, 2023 pm 03:09 PM

Java並發程式設計系列番外篇C A S(Compare and swap),文章風格依然是圖文並茂,簡單易懂,讓讀者們也能與面試官瘋狂對線。

上週,XX保險面試,涼了! ! ! 上週,XX保險面試,涼了! ! ! Aug 25, 2023 pm 03:44 PM

上週,一位群組裡的朋友去平安保險面試了,結果有些遺憾,蠻可惜的,但希望你不要氣餒,正如你所說的,面試中遇到的問題,基本上都是可以通過背面試題解決的,所以請加油!

幾乎所有Java面試都會問到的問題:說ArrayList和LinkedList的差別 幾乎所有Java面試都會問到的問題:說ArrayList和LinkedList的差別 Jul 26, 2023 pm 03:11 PM

Java的資料結構是面試考察的重點,只要參與Java面試的同學相信都有所體會。面試官問這類問題的時候往往是想檢視你是否研究過Java中常用資料類型的底層結構,而不是只是簡單的停留在"會使用"的層次。

美團面試:請手寫一個快排,被我懟了! 美團面試:請手寫一個快排,被我懟了! Aug 24, 2023 pm 03:20 PM

快速排序由C. A. R. Hoare在1962年提出。它的基本想法是:透過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以[遞歸]進行,以此達到整個資料變成有序序列。

See all articles