亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術文章
文章詳情頁

java的string存放位置的疑惑

瀏覽:95日期:2023-12-12 11:40:08

問題描述

有一道題是這樣的:

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

但我實際測試的結果卻不符:

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

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

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

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

問題解答

回答1:

String s1 = new String('aaa'); String s2 = 'aaa'; System.out.println(s1 == s2); //false System.out.println(s1.intern() == s2); //true

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

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

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

然后命令行

java的string存放位置的疑惑

注意常量池有 VV

回答2:問題一:

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

String a = new String('aaa');String b = new String('aaa');System.out.println(a == b);//比較兩者堆中的引用返回falseSystem.out.println(a.intern() == b.intern());//比較兩者常量池中的引用,返回true問題二:

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

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);}回答3:

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

回答4:

按照面向對象的思想,有沒有同時在常量池創建對象,可能String自己最清楚,嗯,他有一個intern()方法。

回答5:

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

回答6:

// new一次就是在堆中創建一個新的對象。不new的話aaa直接在字符串常量中取值;// String s2 = 'aaa'; 先在內存中尋找aaa,如果有,則將aaa的內存首地址指向了s1, 如果沒有則在堆中中創建一個新的對象。// String s1 = new String('aaa');// // 不管'aaa'在內存中是否存在,都會在堆中開辟新空間,將字符串'aaa'的內存首地址指向s1。String a = 'aaa';// aaa在常量池中創建一個對象,將內存首地址指向了aString b = 'aaa';// 直接aaa已經存在的內存首地址指向b。String c = new String('aaa');// 不管存在與否,在堆中創建1個空間,內存首地址與常量池中的地址完全不同System.out.println(a==b);// trueSystem.out.println(a==c);// false

標簽: java
相關文章:
主站蜘蛛池模板: 91精品国产乱码久久久久久 | 奇米888四色在线精品 | 99精品高清不卡在线观看 | 国产中文字幕视频 | 俄罗斯黄色毛片 | 国产成人精品免费午夜 | 亚洲高清无在码在线无弹窗 | 狼人久久尹人香蕉尹人 | 国产成人精品日本亚洲专 | 久久精品男人的天堂 | 男人天堂中文字幕 | 亚洲成人第一页 | 久久99久久成人免费播放 | 久久视屏这里只有精品6国产 | 国产女女视屏免费 | 国产成人亚洲综合欧美一部 | 亚洲一级毛片免费观看 | chinese性老妇中国 | 免费看黄色片的网站 | 成人午夜视频在线播放 | 美国一级毛片片aa久久综合 | 99视频免费 | 香蕉久久久| 免费一级欧美在线观看视频片 | 日韩一区二区三区四区 | 欧美日韩国产人成在线观看 | 免费视频网站一级人爱视频 | 农村寡妇一级毛片免费看视频 | 手机在线色 | 久久久久久a亚洲欧洲aⅴ | 99精品免费视频 | 亚洲国产成a人v在线 | 日本一区二区三区四区不卡 | 欧洲欧美成人免费大片 | 欧美国一级毛片片aa | 能在线观看的一区二区三区 | 久久国产精品久久久 | 手机看片手机在线看片 | 亚洲三级视频 | 亚洲欧美日本韩国综合在线观看 | 国产韩国精品一区二区三区久久 |