日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?

發(fā)布時(shí)間:2025/3/12 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

String str = “a” + “b” + “c"到底創(chuàng)建了幾個(gè)對(duì)象?這是我們?cè)谟懻撝凶罱?jīng)常遇到的一個(gè)問(wèn)題同時(shí)也是面試題。我們都知道在Java中從”.java"文件編譯成".class"文件的過(guò)程,會(huì)有一個(gè)優(yōu)化器去優(yōu)化我們的代碼。這個(gè)問(wèn)題需要分成三種情況去考慮,下面我們就來(lái)分析這三種情況!!

前言
在JVM(JDK8)的內(nèi)存結(jié)構(gòu)中有一塊區(qū)域叫作字符串常量池,這塊區(qū)域存儲(chǔ)了兩樣?xùn)|西,分別是“字面量”和“符號(hào)引用”。字面量也就是一串字,例如String str = “abc” 這里的"abc"就是字面量。符號(hào)引用是用于定位引用指向的問(wèn)題。(JDK8完完全全把字符串常量池從方法區(qū)搬到堆中了)

一、第一種情況(常量相加)

String str = “a” + “b” + "c

因?yàn)檫@種情況是常量之間相加,經(jīng)過(guò)編譯器優(yōu)化成了String str = “abc”,所以答案是創(chuàng)建了一個(gè)對(duì)象?!癮”、“b”、"c"這些都是常量,因?yàn)樗鼈兪莊inal修飾放在字符串常量池中的對(duì)象(注意:字面量也是對(duì)象)

我們通過(guò)javac編譯,然后反編譯后的結(jié)果和內(nèi)存分配情況如下

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //package com.soft.wesker;public class Test {public Test() {}public static void main(String[] var0) {String var1 = "abc";} }


二、第二種情況(變量相加)

String a = “a”;
String b = “b”;
String c = “c”;
String str = a + b + c;

因?yàn)檫@種情況是變量之間相加,已經(jīng)不是之前的常量相加了,經(jīng)過(guò)編譯器優(yōu)化成了StringBuilder,所以答案是創(chuàng)建了三個(gè)對(duì)象。new StringBuilder()、new String()、“abc”,因?yàn)樽罱K會(huì)通過(guò)StringBuilder()里面的toString()方法進(jìn)行new String(“abc”)類型轉(zhuǎn)換。

我們通過(guò)javac編譯,然后反編譯后的結(jié)果和內(nèi)存分配情況如下

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //package com.soft.wesker;public class Test {public Test() {}public static void main(String[] var0) {String var1 = "a";String var2 = "b";String var3 = "c";(new StringBuilder()).append(var1).append(var2).append(var3).toString();} }


三、第三種情況(無(wú)優(yōu)化)

String str = “a” + “b” + "c

如果不考慮優(yōu)化的情況下,這一共是創(chuàng)建了5個(gè)對(duì)象的,因?yàn)橐粋€(gè)雙引號(hào)就是一個(gè)字面量(對(duì)象),這里創(chuàng)建了5個(gè)對(duì)象,分別是"a"、“b”、“c”、“ab”、“abc”。

下面是內(nèi)存分配情況

總結(jié)
在沒(méi)有明確的題目的情況下,我們討論這個(gè)問(wèn)題,有時(shí)候沒(méi)有正確的答案,大家的想法和說(shuō)法都不一樣,需要分情況去討論,這是一個(gè)爭(zhēng)議題,比如還有人把char[]或者byte[]也算進(jìn)去了。
最后我們還需要考慮一個(gè)問(wèn)題,在創(chuàng)建字面量的時(shí)候,JVM會(huì)先從字符串常量池中尋找是否已經(jīng)存在,如果已經(jīng)存在則直接返回引用,不存在就會(huì)先創(chuàng)建一個(gè)字面量,然后再返回引用。所以就會(huì)出現(xiàn)創(chuàng)建了0個(gè)對(duì)象的問(wèn)題

總結(jié)

以上是生活随笔為你收集整理的【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。