it-roy-ru.com

Передача ArrayList в качестве параметра

Позвольте мне начать с того, что я не могу поместить здесь какой-либо код, потому что интернет на моем ноутбуке не работает, поэтому я публикую это через свой телефон. Хорошо, проблема в том, что, скажем, у меня есть два класса: первый и второй. Класс один имеет ArrayList в качестве одного из своих атрибутов, и он вызывает метод void из класса два и передает этот ArrayList в качестве параметра. Теперь этот метод инициализирует другую ArrayList и делает ее равной параметру, переданному мной, и вносит изменения в эту новую ArrayList. Забавно, что даже мой оригинальный ArrayList, который был передан в качестве параметра, также изменяется. В чем может быть причина?

9
Sahil Chaudhary

Проблема в том, что когда вы используете =, чтобы сделать новый ArrayList копией оригинала, вы просто создаете новую ссылку на тот же ArrayList. Думайте об этом как о двух переменных, указывающих на один и тот же объект.

Проверьте это, это может помочь вам понять, что происходит: Является ли Java «передачей по ссылке» или «передачей по значению»?

Чтобы решить вашу проблему, вам нужно создать новый ArrayList с помощью ключевого слова «new» и затем добавить все объекты или использовать метод clone ().

6
mauro.dec

Причина в том, что когда вы передаете ArrayList в качестве аргумента, вызываемый метод может изменить содержимое массива. ArrayList содержит ссылки на Objects . Если вы хотите избежать того, чтобы какой-то класс изменил содержимое вашего ArrayList, который у вас есть , Чтобы вернуть копию вашего ArrayList, где все объекты внутри являются clone () объектов в твой список.

Используйте object.clone () 

ArrayList clonedCopy = new ArrayList(list1.size());
for (Object obj : list1) {
  clonedCopy.add(obj.clone());
}

Теперь верните эту клонированную копию. Но убедитесь, что объект oblable!

3
AlexWien

Образец кода:

public class MethodArguments {

public static void main(String args[]) {

    ArrayList<String> a = new ArrayList<String>();

    a.add("Steve");

    a.add("Daniel");
    a.add("John");
    a.add("Maxi");
    a.add("Jeni");

    System.out.println(a);

    display(a);

    getSize(a);

}

static void display(ArrayList<String> arrayList1) {

    arrayList1.add("Pollard");

    System.out.println(arrayList1); // passing the arraylist values and
                                    // adding the element

}

static void getSize(ArrayList<String> arrayList1) {

    System.out.println(arrayList1.size()); // getting the size of arraylist
                                            // by passing arguments to
                                            // method
 }

}

Результат:

[Стив, Дэниел, Джон, Макси, Джени]

[Стив, Дэниел, Джон, Макси, Джени, Поллард]

6

1
Stephen

Оператор = в Java просто скопирует ссылку ArrayList (то же самое для всех объектов). Смотрите этот ответ для создания глубокой копии ArrayList.

1
Chris Dargis

Потому что они указывают на одну и ту же ссылку. 

1
DarthVader

Это связано с тем, что новый список массивов указывает на тот же старый массив, когда вы делаете его равным.

Этот небольшой пример должен прояснить это.

import Java.util.ArrayList;
import Java.util.List;


public class JavaApplication1 {


    public static void main(String[] args) {

        List <String> origList = new ArrayList<>();
        origList.add("a");
        origList.add("b");

        JavaApplication1 app = new JavaApplication1();
        app.addToList(origList);

        for(String str:origList){            
            System.out.println(str);
        }

    }

    private void addToList(List<String> strList){
        System.out.println("inside addToList");
        List <String> newList = new ArrayList<>();
        // newList = strList; //This is how you are doing it
        newList.addAll(strList); //This is how you should do it.

        newList.add("x");
    }
}
0
PCM