java intern_java String的intern方法
我們知道再jvm的運(yùn)行時(shí)內(nèi)存可以分為堆、方法區(qū)、程序計(jì)數(shù)器、虛擬機(jī)棧和本地方法棧。而在方法區(qū)中有一個(gè)字符串常量池,用來(lái)保存字符串這個(gè)不可變量。如果我們使用String str=new String("java虛擬機(jī)")來(lái)new一個(gè)string對(duì)象,則該對(duì)象的實(shí)例保存在堆中。如果我們使用String str="java虛擬機(jī)"來(lái)創(chuàng)建一個(gè)字符串,jvm首先會(huì)在字符串常量池中創(chuàng)建該String的實(shí)例,然后將常量池中該實(shí)例的引用返回給str。
new出來(lái)的String保存在堆中,如果我們想讓字符串常量池中也保存該string的實(shí)例呢?可以使用String.intern()這個(gè)方法將字符串復(fù)制到常量池中,返回在常量池中的引用。
但是在jdk1.7以后,使用String.intern()方法和之前有一些不同。如果字符串在字符串常量池中沒(méi)有出現(xiàn)過(guò),就會(huì)在字符串常量池中保存一個(gè)引用,指向堆中該字符串的實(shí)例。如果字符串在常量池中已經(jīng)存在了,就返回常量池中的引用。
我們看一下如下的代碼
public static void main(String[] args) {
String str1=new StringBuilder("java").append("虛擬機(jī)").toString();//執(zhí)行完這行代碼后,常量池中會(huì)有"java"和"虛擬機(jī)",但是不會(huì)有"java虛擬機(jī)"。
System.out.println(str1.intern()==str1);
String str2=new String("我喜歡java"); //執(zhí)行完這行代碼后,常量池中會(huì)有"我喜歡java"
System.out.println(str2==str2.intern());
}
結(jié)果是
image.png
分析
str1指向的實(shí)例是在堆中,是由“java”和"虛擬機(jī)"拼接成的。執(zhí)行完第一句代碼后,執(zhí)行完這句話(huà)后,常量池中會(huì)有"java"和"虛擬機(jī)",但是不會(huì)有"java虛擬機(jī)"。然后使用str1.intern()會(huì)在常量池中保存str1實(shí)例的引用,并且返回引用,因此str1.intern()==str1。
而執(zhí)行完String str2=new String("我喜歡java");后,常量池中會(huì)有"我喜歡java",所以在使用str2.intern()返回的就是字符串常量池中的引用,而str2指向的是堆中的引用,因此str2!=str2.intern()。
總結(jié)
以上是生活随笔為你收集整理的java intern_java String的intern方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql connector pyth
- 下一篇: java程序设计实例教程 刘志成_Jav