簡體   English   中英

ArrayList中的set方法實際上是否在內存中發生變化?

[英]does the set method in ArrayList actually change in memory?

我有一個ArrayLists數組。 我正在使用名為“ al”的變量遍歷它們,並更改該arraylist的內容。 但是,我看到ArrayList的原始數組的內容已更改。 為什么是這樣?

我期待着,因為我只更改了一個名為“ al”的新變量的內容,所以ArrayLists的原始數組的內容(即alal)不會改變。

這些是直接在內存上運行的嗎? 如果我想閱讀更多有關此概念的內容,該概念稱為什么。

    package proj;

    import java.util.ArrayList;

    public class Ask
    {
        public static void main(String[] args)
        {
            ArrayList<Integer> myArrayList1 = new ArrayList<Integer>();
            myArrayList1.add(1);
            myArrayList1.add(1);
            myArrayList1.add(1);

            ArrayList<Integer> myArrayList2 = new ArrayList<Integer>();
            myArrayList2.add(2);
            myArrayList2.add(2);
            myArrayList2.add(2);

            ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
            alal.add(myArrayList1);
            alal.add(myArrayList2);

            for(ArrayList<Integer> al : alal)
            {
                al.set(0, 99);
            }

            System.out.println(alal);
        }
    }

編輯:我試圖根據SMA的帖子來編輯我的代碼,以便即使使用set方法,我的內容仍然保持不變。 這是我嘗試過的方法,但是我的輸出仍然反映了更改[[99,1,1],[99,2,2]]

package proj;

import java.util.ArrayList;

public class Ask
{
    public static void main(String[] args)
    {
        ArrayList<Integer> myArrayList1 = new ArrayList<Integer>();
        myArrayList1.add(1);
        myArrayList1.add(1);
        myArrayList1.add(1);

        ArrayList<Integer> myArrayList2 = new ArrayList<Integer>();
        myArrayList2.add(2);
        myArrayList2.add(2);
        myArrayList2.add(2);

        ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
        alal.add(new ArrayList<Integer>(myArrayList1));//creating seperate instance of array list with same content as original list
        alal.add(new ArrayList<Integer>(myArrayList2));
        for(ArrayList<Integer> al : alal)
        {
            al.set(0, 99);
        }
        System.out.println(alal);
    }
}

編輯2:但是,我在普通的ArrayList中看不到相同的行為。 即使在循環內將其編輯為99,這里的內容仍保留為[1、2、3]。 那么,是否在這里創建了這些變量的新實例? 他們不是像以前一樣僅僅是參考嗎?

package proj;

import java.util.ArrayList;

public class Ask
{
    public static void main(String[] args)
    {
        ArrayList<Integer> myArrayList = new ArrayList<Integer>();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);

        for(int element : myArrayList)
        {
            element = 99;
        }

        System.out.println(myArrayList);

    }
}

我期待着,因為我只更改了一個名為“ al”的新變量的內容

alal包含對ArrayList的引用。 當您遍歷那些ArrayList ,您沒有在創建新的ArrayList對象。 因此, al任何變化都反映在alal

當將現有對象的引用分配給新的引用變量時(如在for循環中所做的那樣),就不會創建新的對象。 新變量( al您的情況)僅引用現有對象。

如果要遍歷alal而不更改contains中的ArrayLists,則必須創建包含原始ArrayLists副本的alal副本,或者在創建副本時使用其他循環遍歷alal

for (int i = 0; i < alal.length; i++) {
    ArrayLst<Integer> al = new ArrayList<Integer>(alal.get(i)); // create copy
    al.set(0, 99);
}

當然,此循環沒有多大意義,因為您正在修改ArrayList ,它將永遠不會在任何地方使用。 我假設在您的實際代碼中,您正在使用修改后的ArrayList

您只是使用與alal相同的數組列表引用(在堆中的引用)作為原始的myArrayList1myArrayList2 ,因此它作用於同一列表並修改了第0個索引元素。

如果您不希望循環影響原始列表,則應執行以下操作:

ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>();
alal.add(new ArrayList<Integer>(myArrayList1));//creating seperate instance of array list with same content as original list
alal.add(new ArrayList<Integer>(myArrayList2));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM