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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗

發(fā)布時(shí)間:2023/12/2 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們先來(lái)看個(gè)例子:

public class StringTest { public static void main(String[] args) { String a = "A"; String b = new String("A"); System.out.println(a == b); // false String c = b.intern(); System.out.println(a == c); // true String d = new String("A"); System.out.println(b == d); // false System.out.println(b.intern() == d.intern()); // true }}

出現(xiàn)上述的結(jié)果,我們需要了解下,intern的作用:

(1)? 當(dāng)常量池中不存在"A"這個(gè)字符串的引用,將這個(gè)對(duì)象的引用加入常量池,返回這個(gè)對(duì)象的引用。
(2)? 當(dāng)常量池中存在"A"這個(gè)字符串的引用,返回這個(gè)對(duì)象的引用。如下圖

字符串常量池

  • 字符串常量池的位置

字符串常量池大家可以認(rèn)為獨(dú)立在運(yùn)行時(shí)常量池之外,不要和運(yùn)行時(shí)常量池混淆。字符串常量池應(yīng)該是在堆中。

  • 字符串常量池里放的是什么

字符串常量池里放的實(shí)際上是字符串對(duì)象的引用,而不是字符串對(duì)象,這個(gè)也是十分容易混淆的地方,字符串常量池里的引用指向堆中的字符串對(duì)象,但是堆中的字符串對(duì)象,只有一部分是被字符串常量池所引用的,還有一部分,我們稱為不在常量池中,例如:

String b = new String("A");

因此,常見(jiàn)的一些面試題,我們就有了答案:

(1)現(xiàn)在當(dāng)有人問(wèn) String str = new String(“abc”);創(chuàng)建了幾個(gè)對(duì)象,常量池有abc字段是1個(gè),常量池沒(méi)有"abc"字段則是2個(gè)。
(2)String str=“abc”;創(chuàng)建了幾個(gè)對(duì)象(如果常量池里面已經(jīng)有對(duì)象了就是0個(gè)。如果沒(méi)有就是1個(gè));
(3)new String(“abc”).intern();創(chuàng)建了幾個(gè)對(duì)象(如果常量池里面已經(jīng)有該字符串對(duì)象了就是1個(gè),如果沒(méi)有就是兩個(gè))

了解了作用,那intern有什么用途呢?

1)使用==比較String對(duì)象

有人說(shuō),比較String用equals方法就行了,為什么使用intern后使用==來(lái)操作呢?

真的是這樣嗎,我們先看下equals方法:

public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }

我們發(fā)現(xiàn)equals方法中對(duì)字符串比較真的是暴力,直接從頭到尾挨個(gè)字符比較,如果字符串長(zhǎng)度很大,前面字符相差不大,效率就會(huì)很低下,在性能要求很高的場(chǎng)景下,這種比較是不能容忍的。

那么我們?cè)趧?chuàng)建字符串的時(shí)候都是以intern()方法,那使用==比較就會(huì)效率高的多。

2)使用intern()方法,減少堆中創(chuàng)建過(guò)多的字符串對(duì)象,減少內(nèi)存消耗

我們?cè)賮?lái)討論下不同版本jdk中的intern()方法:

JDK1.6 和 JDK1.7及以上 在 intern() 方法的實(shí)現(xiàn)上,有相同,也有不同。

相同點(diǎn):都先去查看字符串常量池是否有該字符串,如果有,則返回字符串常量池中的引用。不同點(diǎn):JDK1.7+,當(dāng)字符串常量池中找不到對(duì)應(yīng)的字符串時(shí),不會(huì)將字符串拷貝到字符串常量池,而只是生成一個(gè)對(duì)該字符串的引用在字符串常量池。而 JDK1.6 會(huì)拷貝字符串至字符串常量池

總結(jié)

以上是生活随笔為你收集整理的字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。