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