String str=Hello 与 String str=new String(“Hello”)一样吗?
為什么會(huì)輸出上邊的結(jié)果呢,String x = "Hello" 的方式,Java 虛擬機(jī)會(huì)將其分配到常量池中,而常量池中沒(méi)有重復(fù)的元素,比如當(dāng)執(zhí)行“Hello”時(shí),java虛擬機(jī)會(huì)先在常量池中檢索是否已經(jīng)有“Hello”,如果有那么就將“代理”的地址賦給變量,如果沒(méi)有就創(chuàng)建一個(gè),然后在賦給變量;而 String z = new String(“Hello”) 則會(huì)被分到堆內(nèi)存中,即使內(nèi)容一樣還是會(huì)創(chuàng)建新的對(duì)象。
?
上面程序中的"==“是判斷兩個(gè)對(duì)象引用的地址是否相同,也就是判斷是否為同一個(gè)對(duì)象,a1與a2 返回為true,a1與a3返回則是false。說(shuō)明a1與a2引用的同一個(gè)對(duì)象的地址,a3則與其它兩個(gè)引用不是同一個(gè)對(duì)象地址。
Java為了避免產(chǎn)生大量的String對(duì)象,設(shè)計(jì)了一個(gè)字符串常量池。工作原理是這樣的,創(chuàng)建一個(gè)字符串時(shí),JVM首先為檢查字符串常量池中是否有值相等的字符串,如果有,則不再創(chuàng)建,直接返回該字符串的引用地址,若沒(méi)有,則創(chuàng)建,然后放到字符串常量池中,并返回新創(chuàng)建的字符串的引用地址。所以上面a1與a2引用地址相同。
那為什么a3與a1、a2引用的不是同一個(gè)字符串地址呢? String a3=new String(“代理Hello); JVM首先是在字符串常量池中找"Hello” 字符串,如果沒(méi)有創(chuàng)建字符串常量,然后放到常量池中,若已存在,則不需要?jiǎng)?chuàng)建;當(dāng)遇到 new 時(shí),還會(huì)在內(nèi)存(不是字符串常量池中,而是在堆里面)上創(chuàng)建一個(gè)新的String對(duì)象,存儲(chǔ)"Hello",并將內(nèi)存上的String對(duì)象引用地址返回,所以a3與a1、a2引用的不是同一個(gè)字符串地址。內(nèi)存結(jié)構(gòu)圖如下:
總結(jié)
以上是生活随笔為你收集整理的String str=Hello 与 String str=new String(“Hello”)一样吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据库课程设计——实验报告管理系统(超详
- 下一篇: 抽象类必须要有抽象方法吗?