Четыре способа скопировать ArrayList

Java

Четыре способа скопировать ArrayList

Введение

ArrayList — это класс коллекции, который мы часто используем.Иногда нам нужно скопировать ArrayList.Сегодня я расскажу о четырех распространенных способах копирования ArrayList.

использовать конструктор

ArrayList имеет конструктор, который может передавать коллекцию:

    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

Из приведенного выше кода видно, что нижний слой фактически вызывает метод Arrays.copyOf для копирования массива. Эта копия вызывает собственный системный метод arraycopy.Обратите внимание, что копия здесь является копией ссылки, а не копией значения. Это означает, что если значение объекта изменится после копирования, исходный объект также изменится.

Например:

    @Test
    public void withConstructor(){
        List<String> stringList=new ArrayList<>(Arrays.asList("a","b","c"));
        List<String> copyList = new ArrayList<>(stringList);
        copyList.set(0,"e");
        log.info("{}",stringList);
        log.info("{}",copyList);

        List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c")));
        List<CustBook> copyobjectList = new ArrayList<>(objectList);
        copyobjectList.get(0).setName("e");
        log.info("{}",objectList);
        log.info("{}",copyobjectList);
    }

результат операции:

22:58:39.001 [main] INFO com.flydean.CopyList - [a, b, c]
22:58:39.008 [main] INFO com.flydean.CopyList - [e, b, c]
22:58:39.009 [main] INFO com.flydean.CopyList - [CustBook(name=e), CustBook(name=b), CustBook(name=c)]
22:58:39.009 [main] INFO com.flydean.CopyList - [CustBook(name=e), CustBook(name=b), CustBook(name=c)]

Мы видим, что изменения объекта фактически меняют источник копии. И copyList.set(0, "e") фактически создает новый объект String и присваивает его позиции 0 в copyList.

Используйте метод addAll

List имеет метод addAll, который мы можем использовать для копирования:

    @Test
    public void withAddAll(){

        List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c")));
        List<CustBook> copyobjectList = new ArrayList<>();
        copyobjectList.addAll(objectList);
        copyobjectList.get(0).setName("e");
        log.info("{}",objectList);
        log.info("{}",copyobjectList);
    }

Эта же копия является ссылкой на объект.

Использование Collections.copy

Точно так же использование Collections.copy также может дать тот же эффект, посмотрите на код:

    @Test
    public void withCopy(){
        List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c")));
        List<CustBook> copyobjectList = new ArrayList<>(Arrays.asList(new CustBook("d"),new CustBook("e"),new CustBook("f")));
        Collections.copy(copyobjectList, objectList);
        copyobjectList.get(0).setName("e");
        log.info("{}",objectList);
        log.info("{}",copyobjectList);
    }

использовать поток

Мы также можем использовать поток, представленный в java 8, для достижения:

    @Test
    public void withStream(){

        List<CustBook> objectList=new ArrayList<>(Arrays.asList(new CustBook("a"),new CustBook("b"),new CustBook("c")));
        List<CustBook> copyobjectList=objectList.stream().collect(Collectors.toList());
        copyobjectList.get(0).setName("e");
        log.info("{}",objectList);
        log.info("{}",copyobjectList);

    }

Суммировать

Что ж, с четырьмя методами покончено, всем следует обратить внимание на то, что четыре метода являются эталонными копиями, будьте осторожны при их использовании.

Примеры этой статьиGitHub.com/Dadean2009/приходите…

Добро пожаловать, обратите внимание на мой публичный номер: вас ждут самые интересные вещи о программе! Для получения дополнительной информации, пожалуйста, посетитеwww.flydean.com