第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關(guān)于String的一個疑問

關(guān)于String的一個疑問

繁華開滿天機 2019-03-01 04:39:20
先看一段代碼: public class JavaTest { public static void changeStr(String str){ str="welcome"; } public static void main(String[] args) { String str="1234"; changeStr(str); System.out.println(str); } } String不是引用類型嗎?為什么輸出來的還是1234? 針對 @喵了個咪 的回答,貼段代碼: public static void change(List list){ list.add("welcome"); } public static void main(String[] args) { String str="1234"; List<String >list = new ArrayList<>(); list.add(str); change(list); assert list.size() == 2; }
查看完整描述

7 回答

?
拉莫斯之舞

TA貢獻1820條經(jīng)驗 獲得超10個贊

String 是不可變的,所以你在函數(shù)體內(nèi)部做的改變不可能修改這個變量本身地址的值,而是在另一個地址新建了一個String 類型的變量,而你獲取不到這個新建的變量的地址,函數(shù)執(zhí)行完畢這個變量就可能會被回收。

查看完整回答
反對 回復(fù) 2019-03-01
?
小怪獸愛吃肉

TA貢獻1852條經(jīng)驗 獲得超1個贊

String str = "asd";
public static void change(String data){
    data = "123";
}

可以這樣想,str是一個變量,指向內(nèi)存地址A。
當(dāng)調(diào)用 -change- 方法的時候,str將內(nèi)存地址A傳遞給變量data
在change方法內(nèi),進行賦值的時候,java會重新申請一塊內(nèi)存空間去存放數(shù)值 "123",內(nèi)存地址為B,并將data的內(nèi)存地址修改為B
方法執(zhí)行結(jié)束
注意方法外的變量str的指向的內(nèi)存地址A是沒有改變的,內(nèi)存地址A指向的值還是為"asd"。

下面舉個例子:

public class Main1 {
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.i = 123;
        System.out.println("方法外 : " + demo.hashCode());
        change(demo);
        System.out.println(demo.i);
        change2(demo);
        System.out.println(demo.i);
    }
    
    public static void change(Demo data) {
        System.out.println("方法內(nèi)前 : " + data.hashCode());
        data = new Demo();
        System.out.println("方法內(nèi)后 : " + data.hashCode());
        data.i = 321;
    }

    /*
     * 這樣則是針對內(nèi)存地址的修改
     */
    public static void change2(Demo data) {
        data.i = 321;
        System.out.println("方法內(nèi) : " + data.hashCode());
    }
}

class Demo {
    public int i;
}

結(jié)果:

方法外 : 366712642
方法內(nèi)前 : 366712642
方法內(nèi)后 : 1829164700
123
方法內(nèi) : 366712642
321

表達的不是太清楚。。。希望例子能表達清楚一些

查看完整回答
反對 回復(fù) 2019-03-01
?
墨色風(fēng)雨

TA貢獻1853條經(jīng)驗 獲得超6個贊

java調(diào)用方法時傳遞的是值類型,不是引用類型。話說你也可以把地址打出來瞧一瞧。

查看完整回答
反對 回復(fù) 2019-03-01
?
冉冉說

TA貢獻1877條經(jīng)驗 獲得超1個贊

舉個栗子:
  String str1 = "a";
  String str2 = "a";
  System.out.println(str1==str2); //true
  str1 = "b";
  System.out.println(str1 + "," + str2); //b,a
  System.out.println(str1==str2); //false
現(xiàn)象:
賦值的變化導(dǎo)致了類對象引用的變化,str1指向了另外一個新對象!而str2仍舊指向原來的對象.當(dāng)我們改變str1的值的時候,JVM發(fā)現(xiàn)在棧中沒有存放該值的地址,便開辟了這個地址,并創(chuàng)建了一個新的對象,其字符串的值指向這個地址。
why?

String類被設(shè)計成為不可改變(immutable)的類。如果你要改變其值,那么JVM在運行時就會根據(jù)新值悄悄創(chuàng)建了一個新對象,然后將這個對象的地址返回給原來類的引用,這個創(chuàng)建過程雖說是完全自動進行的.

so:
我推斷,你打印出changeStr 方法中str改變后地址應(yīng)該不等于main中str的地址.

查看完整回答
反對 回復(fù) 2019-03-01
?
紅顏莎娜

TA貢獻1842條經(jīng)驗 獲得超13個贊

可以將 String 理解為 一個特殊的常量噢!

查看完整回答
反對 回復(fù) 2019-03-01
  • 7 回答
  • 0 關(guān)注
  • 583 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號