字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗
我們先來(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)題。
- 上一篇: 安卓设置动态锁屏(安卓动态屏锁)
- 下一篇: word一键生成ppt 分页_如何一键把