日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

关于Java中String类的intern()方法

發布時間:2024/10/5 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Java中String类的intern()方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先intern()方法的定義:當調用這個方法的時候,如果字符串常量池中有這個對象,就把常量池中的這個對象返回,沒有就把當前對象加入到常量池并且返回當前對象的引用;
jdk1.6之前:將對象存入常量池;
jdk1.7: 將堆中引用存入常量池(字符串常量池位于堆中)

public static void main(String[] args) {String s = new String("1");s.intern();String s2 = "1";System.out.println(s == s2);String s3 = new String("1") + new String("1");s3.intern();String s4 = "11";System.out.println(s3 == s4); }

打印結果是

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字符串相加

String str1 ="a"; String str2 ="b"; String str3 = str1 + str2; String str4 = "a" + "b"; //這兩者實現過程不一樣

很容易發現是str3通過StringBuilder類進行拼接得來的
str4是直接得來的,因此在字符串相加時候如果沒有用到類似于str1之類的變量的話,就是直接拼接而來,否則就是另外一種情況了。

總結

以上是生活随笔為你收集整理的关于Java中String类的intern()方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。