关于Java中String类的intern()方法
首先intern()方法的定義:當調用這個方法的時候,如果字符串常量池中有這個對象,就把常量池中的這個對象返回,沒有就把當前對象加入到常量池并且返回當前對象的引用;
jdk1.6之前:將對象存入常量池;
jdk1.7: 將堆中引用存入常量池(字符串常量池位于堆中)
打印結果是
jdk6 下false false
jdk7 下false true
為什么jdk7下s3 ==s4呢不是兩個完全不同的對象嘛
String s3 = new String(“1”) + new String(“1”);,這句會生成字符串常量池中的“1” 和 JAVA Heap 中的 s3引用指向的對象。中間還有2個匿名的new String(“1”)我們不去討論它們。此時s3引用對象內容是”11”,但此時常量池中是沒有 “11”對象的。
接下來s3.intern();這一句代碼,不需要再存儲一份對象了,可以直接存儲堆中的引用。這份引用指向 s3 引用的對象。 也就是說引用地址是相同的。
最后String s4 = “11”; 這句代碼中”11”是顯示聲明的,因此會直接去常量池中創建,創建的時候發現已經有這個對象了,此時也就是指向 s3 引用對象的一個引用。所以 s4 引用就指向和 s3 一樣了。因此最后的比較 s3 == s4 是 true。
再看 s 和 s2 對象。 String s = new String(“1”); 第一句代碼,生成了2個對象。常量池中的“1” 和 JAVA Heap 中的字符串對象。s.intern(); 這一句是 s 對象去常量池中尋找后發現 “1” 已經在常量池里了。
jdk1.7中的intern()實現不會再復制實例,只是在常量池中記錄首次出現的實例引用.
另外兩個字符串new String(“1”) + new String(“1”) 相加其實就等于調用StringBuilder.append進行拼接然后調用其
@Overridepublic String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);}注意這個里面并沒有new String(“11”)的操作,直接調用的是String的另外一個構造方法所以不會在字符串常量池中創建“11”這個字符串;
拓展
關于java字符串相加
很容易發現是str3通過StringBuilder類進行拼接得來的
str4是直接得來的,因此在字符串相加時候如果沒有用到類似于str1之類的變量的話,就是直接拼接而來,否則就是另外一種情況了。
總結
以上是生活随笔為你收集整理的关于Java中String类的intern()方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Linux系统下防火墙开放所需要访问的
- 下一篇: java美元兑换,(Java实现) 美元