【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?
String str = “a” + “b” + “c"到底創(chuàng)建了幾個對象?這是我們在討論中最經(jīng)常遇到的一個問題同時也是面試題。我們都知道在Java中從”.java"文件編譯成".class"文件的過程,會有一個優(yōu)化器去優(yōu)化我們的代碼。這個問題需要分成三種情況去考慮,下面我們就來分析這三種情況!!
前言
在JVM(JDK8)的內(nèi)存結(jié)構(gòu)中有一塊區(qū)域叫作字符串常量池,這塊區(qū)域存儲了兩樣?xùn)|西,分別是“字面量”和“符號引用”。字面量也就是一串字,例如String str = “abc” 這里的"abc"就是字面量。符號引用是用于定位引用指向的問題。(JDK8完完全全把字符串常量池從方法區(qū)搬到堆中了)
一、第一種情況(常量相加)
String str = “a” + “b” + "c
因為這種情況是常量之間相加,經(jīng)過編譯器優(yōu)化成了String str = “abc”,所以答案是創(chuàng)建了一個對象。“a”、“b”、"c"這些都是常量,因為它們是final修飾放在字符串常量池中的對象(注意:字面量也是對象)
我們通過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;
因為這種情況是變量之間相加,已經(jīng)不是之前的常量相加了,經(jīng)過編譯器優(yōu)化成了StringBuilder,所以答案是創(chuàng)建了三個對象。new StringBuilder()、new String()、“abc”,因為最終會通過StringBuilder()里面的toString()方法進行new String(“abc”)類型轉(zhuǎn)換。
我們通過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();} }
三、第三種情況(無優(yōu)化)
String str = “a” + “b” + "c
如果不考慮優(yōu)化的情況下,這一共是創(chuàng)建了5個對象的,因為一個雙引號就是一個字面量(對象),這里創(chuàng)建了5個對象,分別是"a"、“b”、“c”、“ab”、“abc”。
下面是內(nèi)存分配情況
總結(jié)
在沒有明確的題目的情況下,我們討論這個問題,有時候沒有正確的答案,大家的想法和說法都不一樣,需要分情況去討論,這是一個爭議題,比如還有人把char[]或者byte[]也算進去了。
最后我們還需要考慮一個問題,在創(chuàng)建字面量的時候,JVM會先從字符串常量池中尋找是否已經(jīng)存在,如果已經(jīng)存在則直接返回引用,不存在就會先創(chuàng)建一個字面量,然后再返回引用。所以就會出現(xiàn)創(chuàng)建了0個對象的問題
總結(jié)
以上是生活随笔為你收集整理的【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于pygame的射击小游戏制作(一)让
- 下一篇: 基于pygame的射击小游戏制作(二)射