国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
到底創(chuàng)建了幾個(gè)對象? " >到底創(chuàng)建了幾個(gè)對象?
st1和st2是否相等? " >st1和st2是否相等?
判斷一下st2和st3是否相等 " >判斷一下st2和st3是否相等
首頁 Java Java面試題 5道String面試題,能全答對的人不到10%! (附答案)

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

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

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

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));
  }
}

輸出結(jié)果:

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

分析

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

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

#

在JDK API 1.6文檔中找到String類下的equals方法,點(diǎn)擊進(jìn)去可以看到這么一句話“將此字符串與指定的對象比較。當(dāng)且僅當(dāng)該參數(shù)不為null,并且是與此對象表示相同字符序列的String 對象時(shí),結(jié)果才為 true。” 注意這個(gè)相同字符序列,在后面介紹的比較兩個(gè)數(shù)組,列表,字典是否相等,都是這個(gè)邏輯去寫代碼實(shí)現(xiàn)。

由于st1和st2的值都是“abc”,兩者指向同一個(gè)對象,當(dāng)前字符序列相同,所以第二行打印結(jié)果也為true。下面我們來畫一個(gè)內(nèi)存圖來表示上面的代碼,看起來更加有說服力。

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

內(nèi)存過程大致如下:

1)運(yùn)行先編譯,然后當(dāng)前類Demo2_String.class文件加載進(jìn)入內(nèi)存的方法區(qū)

2)第二步,main方法壓入棧內(nèi)存

3)常量池創(chuàng)建一個(gè)“abc”對象,產(chǎn)生一個(gè)內(nèi)存地址

4)然后把“abc”內(nèi)存地址賦值給main方法里的成員變量st1,這個(gè)時(shí)候st1根據(jù)內(nèi)存地址,指向了常量池中的“abc”。

5)前面一篇提到,常量池有這個(gè)特點(diǎn),如果發(fā)現(xiàn)已經(jīng)存在,就不在創(chuàng)建重復(fù)的對象

6)運(yùn)行到代碼 Stringst2 =”abc”, 由于常量池存在“abc”,所以不會(huì)再創(chuàng)建,直接把“abc”內(nèi)存地址賦值給了st2

7)最后st1和st2都指向了內(nèi)存中同一個(gè)地址,所以兩者是完全相同的。

到底創(chuàng)建了幾個(gè)對象?

String st1 = new String(“abc”);

答案是:在內(nèi)存中創(chuàng)建兩個(gè)對象,一個(gè)在堆內(nèi)存,一個(gè)在常量池,堆內(nèi)存對象是常量池對象的一個(gè)拷貝副本。

分析

我們下面直接來一個(gè)內(nèi)存圖。

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

當(dāng)我們看到了new這個(gè)關(guān)鍵字,就要想到,new出來的對象都是存儲(chǔ)在堆內(nèi)存。然后我們來解釋堆中對象為什么是常量池的對象的拷貝副本。

“abc”屬于字符串,字符串屬于常量,所以應(yīng)該在常量池中創(chuàng)建,所以第一個(gè)創(chuàng)建的對象就是在常量池里的“abc”。

第二個(gè)對象在堆內(nèi)存為啥是一個(gè)拷貝的副本呢,這個(gè)就需要在JDK API 1.6找到String(String original)這個(gè)構(gòu)造方法的注釋:初始化一個(gè)新創(chuàng)建的 String 對象,使其表示一個(gè)與參數(shù)相同的字符序列;換句話說,新創(chuàng)建的字符串是該參數(shù)字符串的副本。所以,答案就出來了,兩個(gè)對象。

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 由于有前面兩道題目內(nèi)存分析的經(jīng)驗(yàn)和理論,所以,我能快速得出上面的答案。

==比較的st1和st2對象的內(nèi)存地址,由于st1指向的是堆內(nèi)存的地址,st2看到“abc”已經(jīng)在常量池存在,就不會(huì)再新建,所以st2指向了常量池的內(nèi)存地址,所以==判斷結(jié)果輸出false,兩者不相等。

第二個(gè)equals比較,比較是兩個(gè)字符串序列是否相等,由于就一個(gè)“abc”,所以完全相等。

內(nèi)存圖如下

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”三個(gè)本來就是字符串常量,進(jìn)行+符號拼接之后變成了“abc”,“abc”本身就是字符串常量(Java中有常量優(yōu)化機(jī)制),所以常量池立馬會(huì)創(chuàng)建一個(gè)“abc”的字符串常量對象,在進(jìn)行st2=”abc”,這個(gè)時(shí)候,常量池存在“abc”,所以不再創(chuàng)建。所以,不管比較內(nèi)存地址還是比較字符串序列,都相等。

判斷一下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%! (附答案)

#分析

上面的答案第一個(gè)是false,第二個(gè)是true,第二個(gè)是true我們很好理解,因?yàn)楸容^一個(gè)是“abc”,另外一個(gè)是拼接得到的“ abc”,所以equals比較,這個(gè)是輸出true,我們很好理解。

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

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

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

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

大致記憶體過程

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

總結(jié)

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

#

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

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
面試官:Spring Aop 常見註解和執(zhí)行順序 面試官:Spring Aop 常見註解和執(zhí)行順序 Aug 15, 2023 pm 04:32 PM

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

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

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

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

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

上週,XX保險(xiǎn)面試,涼了! ! ! 上週,XX保險(xiǎn)面試,涼了! ! ! Aug 25, 2023 pm 03:44 PM

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

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

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

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

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

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

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

面試官:說一下類別載入的過程(10張圖解) 面試官:說一下類別載入的過程(10張圖解) Aug 23, 2023 pm 03:05 PM

當(dāng)我們要使用一個(gè)類別的時(shí)候,要透過ClassLoader將類別載入到記憶體中。

See all articles