Java String類的intern()方法


該方法的作用是把字符串加載到常量池中(jdk1.6常量池位於方法區,jdk1.7以后常量池位於堆)

在jdk1.6中,該方法把字符串的值復制到常量區,然后返回常量區里這個字符串的值;
在jdk1.7里,該方法在常量區記錄該字符串首次出現的實例引用,然后返回該地址,常量區可以保存字面量也可以保存字符串對象在堆中的引用

        String s3 = new String("123") + new String("123");
        s3.intern();
        String s4 = "123123";
        System.out.println(s3 == s4);

在jdk6中,輸出false,因為intern方法將字符串復制到常量區,然后返回一個該字符串在常量區中的引用。但是s3並沒有接收這個引用,因此s3指向的還是堆,但是s4指向的是常量區,因此這兩個地址不一樣。

在jdk7 中,輸出true,因為jdk7中intern方法是(在常量區找不到該字符串時)將該字符串對象在堆里的引用注冊到常量區,以后使用相同字面量(雙引號形式)聲明的字符串對象都指向該地址,也就是該字符串在堆中的地址。所以,調用s3的intern方法后返回的引用就是s3本身的引用,而使用字面量聲明的s4也是指向這個引用的,所以這兩個地址相同。

總結:

  • 使用雙引號聲明的字符串總是放在常量區,必須顯式使用雙引號,例如String s1="abc",s2="123"+"abc";,兩個字面量連接只會在常量區保存連接后的一個字面;如果賦值摻雜了String對象的引用,則不符合本條
  • 使用new String("字符串")形式生命的String對象是分配在堆里的,例如String s3="hhh"+s1;,但是"hhh"這個字面量會放到常量池
  • new String會生成兩個對象,一個是分配在堆里的String對象,另一個是放在常量區的字面量
  • jdk6總是將字面值放在常量區(將其字面值復制到常量區),常量區位於方法區
  • jdk7常量區還能保存String對象在堆里的引用(將其在堆中的引用復制到常量區),常量區位於堆

感謝 https://blog.csdn.net/shanksqian/article/details/78330294


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM