亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

請問要對對a進行一些賦值,那list中的i會有這個賦值嗎?

請問要對對a進行一些賦值,那list中的i會有這個賦值嗎?

米脂 2022-05-06 17:07:17
List<Object[]> rlist = new ArrayList<Object[]>();對a進行一些賦值,那list中的i會有這個賦值嗎?我記得有種情況下list存的是地址,然后取出來的做了操作會影響list中的數據。因為都是指向同一個地址,麻煩解釋下這個
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

這個問題要分具體的情況的,我下面列舉了三種情況,基本上就都包括了,剩下都可以通過這三種情況類似,先看一下我寫了一段測試結果用的代碼,先看結果,之后我再解釋原因


public class Student {    private String name;    private int age;    public Student() {        super();    }    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Student [name=" + name + ", age=" + age + "]";    }     }public class TestRef {    public static void main(String[] args) {        List<Student> list = new ArrayList<>();        list.add(new Student("zhang",12));        list.add(new Student("liu",13));        System.out.println("list中是普通對象時,修改前");        System.out.println(list);        Student stu = list.get(0);        stu.setAge(22);        System.out.println("list中是普通對象時,修改后");        System.out.println(list);                 List<Integer> list1 = new ArrayList<>();        list1.add(1);        list1.add(2);        System.out.println("list1中裝入基本類型時,修改前");        System.out.println(list1);        Integer a = list1.get(0);        a = new Integer(11);        System.out.println("list1中裝入基本類型時,修改后");        System.out.println(list1);                 List<String> list2 = new ArrayList<>();        list2.add("abc");        list2.add("def");        System.out.println("list2中裝入String時,修改前");        System.out.println(list2);        String s = list2.get(0);        s = new String("abc_abc");        System.out.println("list2中裝入String時,修改后");        System.out.println(list2);    }}

下面是運行的結果:


list中是普通對象時,修改前[Student [name=zhang, age=12], Student [name=liu, age=13]]list中是普通對象時,修改后[Student [name=zhang, age=22], Student [name=liu, age=13]]list1中裝入基本類型時,修改前[1, 2]list1中裝入基本類型時,修改后[1, 2]list2中裝入String時,修改前[abc, def]list2中裝入String時,修改后[abc, def]

通過上面的例子我們就會發現,我們在修改Student實例中的年齡是可以修改的,但是在修改基本類型(int,long,short,byte,char,float,double,boolean)和String的時候是不變的。這個是直觀的感受,真是是后面這一半是正確的。

我寫Student這個類的目的就是為了來描述我們自己定義的類會不會變,通過上面的例子我們發現變了,那么什么情況下不變呢,看下面這段代碼:


                List<Student> list = new ArrayList<>();        list.add(new Student("zhang",12));        list.add(new Student("liu",13));        System.out.println("list中是普通對象時,修改前");        System.out.println(list);        Student stu = list.get(0);        //stu.setAge(22);        stu = new Student("song",24);        System.out.println("list中是普通對象時,修改后");        System.out.println(list);

這段代碼是沒有修改list中的內容,其實到這里所有的情況就都包括了,很簡單,在Java中傳遞引用,大家經常會把它理解為傳遞C語言中的指針,其實不然,你更應該把他理解為C語言中的傳遞值,這樣就容易解釋一些現象。

以Student這段代碼為例,list.get(0)拿到的是第一個Student實例的值,當我們直接修改這個實例的時候,是不會影響到list中的內容的,如


Student stu = list.get(0);stu = new Student("song",24);

這種是沒有影響的,但是我們修改返回的這個實例中的屬性的時候的,也就是修改Student中的年齡,姓名等的時候,這個時候是會改變list中的內容的(list中Student的引用的值沒變,但是引用所指向堆中對象具體的屬性改變了)。

也就是下面這種形式會改變的:


Student stu = list.get(0);stu.setAge(22);

通過這種方式,我們就可以理解基本類型和String的時候為什么不會變了。



查看完整回答
反對 回復 2022-05-10
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號