java的String构造对象的几种方法以及内存运行过程
String類創(chuàng)建對象的方法可以分為以下三種
1.String a = "123";
2.String b = new String("123");
3.String c = "12" + "3";
?
1程序執(zhí)行時,會先去jvm的常量池(在方法區(qū)中)中尋找有沒有“123” 的String 對象,如果已經(jīng)存在,則無須新建對象,直接把常量池中的對象地址返回給棧中的引用 a (此時沒有建立對象)
如果沒有存在,則在常量池中新建一個“123”的String對象。然后將其地址返回給棧中的引用 a(此時建立了一個對象)。
2.程序執(zhí)行時,首先去jvm的常量池中尋找有沒有“123”的String對象,如果有,則在堆中新建一個String類型的對象“123”,然后將其地址返回給棧中的引用b。(此時只新建了一個對象)。
如果沒有,則先在常量池中新建一個“123”的String對象。然后再去堆中新建一個值為“123”的對象,并將堆中的對象地址返回給棧中的引用b。(此時建立了兩個對象)
那在這里就有一個有趣的問題,那就是常量池中的對象和堆中的對象到底是不是同一個?可以通過比較? a == b 的值可得出結(jié)論。樓主這邊得到false。可知他們并不是一個對象。
3.第三種構(gòu)造方式比較復雜。網(wǎng)上也是眾說紛紜。樓主在這里分為兩種方式
3.1第一種方式是: String a = "123"; String b = "1" + "2" + "3";如果是這樣,由于全是b是由常量拼接起來的。那么,在編譯期間就能確定值,編譯器就會在編譯期間就幫你進行拼接。那么,編譯過后就成為:String b = "123";之后的判斷和1一樣。且 a == b = true
3.2 String a = "123"; String b = "1"; String c = b + "2" + " 3";
由于c中有引用的拼接,而在編譯過程中是無法知道引用的具體值,那么編譯器就不會默認幫你進行拼接。常量池中就要新建一個對象。這時, a == c =false;
?
轉(zhuǎn)載于:https://www.cnblogs.com/exceptionblog/p/7849838.html
總結(jié)
以上是生活随笔為你收集整理的java的String构造对象的几种方法以及内存运行过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: form 中Enctype=multip
- 下一篇: Java getClass() VS i