国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

java的string存放位置的疑惑
僅有的幸福
僅有的幸福 2017-05-17 10:00:54
0
6
780

有一道題是這樣的:

new String("aaa")創(chuàng)建了幾個對象? 答案是創(chuàng)建一個或2個,理由是如果常量區(qū)中存在了aaa變量,則只在堆中創(chuàng)建一個;如果常量區(qū)不存在aaa變量,則分別在常量區(qū)和堆中各創(chuàng)建一個。

但我實際測試的結(jié)果卻不符:

String s1 = new String("aaa");
String s2 = "aaa";
System.out.println(s1 == s2); //false

如果說new String("aaa")在堆中和常量區(qū)中都創(chuàng)建了對象,那么為什么s2不直接復(fù)用s1的常量池的引用呢?

補(bǔ)充:
發(fā)現(xiàn)自己想錯了,s1應(yīng)該指向的堆中的元素,而s2指向的是常量池中的,所以兩者不相等是對的,那有沒有辦法測試測試出new String("aaa")也同時在常量池中創(chuàng)建對象了呢?

又或者String s3 = "aa".concat("a"); 請問這個s3是指向堆中還是指向常量池的,它能否復(fù)用常量池中的變量呢?

僅有的幸福
僅有的幸福

全部回復(fù)(6)
過去多啦不再A夢
    String s1 = new String("aaa");
    String s2 = "aaa";
    System.out.println(s1 == s2); //false
    System.out.println(s1.intern() == s2); //true

當(dāng)一個String實例調(diào)用intern()方法時,會查找常量池中是否有相同的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個等于str的字符串并返回它的引用,由于s2已經(jīng)在常量池中,所以s1.intern()不會再創(chuàng)建,而是直接引用同一個"aaa"。

如果這個還不夠明顯,那么我們就來試驗,

public class Cons {
    public static void main(String[] args) throws InterruptedException {
        String s1 = new String("vv");
    }
}

然后命令行

注意常量池有 VV

PHPzhong

問題一:

String a = “aaa”,會在常量池中創(chuàng)建對象,如果常量池中存在同樣的對象,那a就直接指向該對象。而 String a = new String("aaa"),若常量池中存在,則不在常量池中創(chuàng)建,只在堆中創(chuàng)建。

String a = new String("aaa");
String b = new String("aaa");
System.out.println(a == b);//比較兩者堆中的引用返回false
System.out.println(a.intern() == b.intern());//比較兩者常量池中的引用,返回true

問題二:

從源碼中找答案String s3 = "aa".concat("a"); 其實就相當(dāng)于 String s3 = new String("aaa"),會在堆中創(chuàng)建對象。

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

伊謝爾倫

String不是每次賦值都重新創(chuàng)建一個String對象實例嗎?所以才會有StringBuilder呀。

左手右手慢動作

按照面向?qū)ο蟮乃枷?,有沒有同時在常量池創(chuàng)建對象,可能String自己最清楚,嗯,他有一個intern()方法。

漂亮男人

前面幾位的回答已經(jīng)非常好了,我補(bǔ)充一句,我們經(jīng)常說的“把字符串放到常量池”是指把字符串的引用放到字符串常量池(String Pool,本質(zhì)是一個哈希表)中,字符串本身還是放在堆上的。

過去多啦不再A夢

雷雷

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板