Розніца паміж Arrays.asList (масіў) і новы ArrayList <Integer> (Arrays.asList (масіў))

У чым розніца паміж

1.List list1 = new ArrayList(Arrays.asList(ia));  //copy
2.List list2 = Arrays.asList(ia);

дзе IA гэта масіў цэлых лікаў.

Я даведаўся, што некаторыя аперацыі не дапускаюцца ў list2 . Чаму гэта так? як яна захоўваецца ў памяці (спасылкі/копіі)?

Калі я ператасаваць спісы, песни1 не ўплывае на зыходны масіў, але песни2 робіць. Але ўсё-ткі песни2 некалькі збівае з толку.

How ArrayList being upcasted to list differs from creating new ArrayList

list1 differs from (1)
ArrayList list1 = new ArrayList(Arrays.asList(ia));
73
Я прапаную вам паглядзець пасля таго, як Google гуавы-х </опцыя>. <�Код> Lists.newArrayList (Iа) робіць незалежную копію, гэтак жа, як першы варыянт. Гэта проста больш агульны характар ​​і лепш глядзець.
дададзена аўтар qben, крыніца

18 адказы

  1. First, let's see what this does:

    Arrays.asList(ia)
    

    It takes an array ia and creates a wrapper that implements List, which makes the original array available as a list. Nothing is copied and all, only a single wrapper object is created. Operations on the list wrapper are propagated to the original array. This means that if you shuffle the list wrapper, the original array is shuffled as well, if you overwrite an element, it gets overwritten in the original array, etc. Of course, some List operations aren't allowed on the wrapper, like adding or removing elements from the list, you can only read or overwrite the elements.

    Note that the list wrapper doesn't extend ArrayList - it's a different kind of object. ArrayLists have their own, internal array, in which they store their elements, and are able to resize the internal arrays etc. The wrapper doesn't have its own internal array, it only propagates operations to the array given to it.

  2. On the other hand, if you subsequently create a new array as

    new ArrayList(Arrays.asList(ia))
    

    then you create new ArrayList, which is a full, independent copy of the original one. Although here you create the wrapper using Arrays.asList as well, it is used only during the construction of the new ArrayList and is garbage-collected afterwards. The structure of this new ArrayList is completely independent of the original array. It contains the same elements (both the original array and this new ArrayList reference the same integers in memory), but it creates a new, internal array, that holds the references. So when you shuffle it, add, remove elements etc., the original array is unchanged.

157
дададзена
што абгортка?
дададзена аўтар Dineshkumar, крыніца
як наконт розніцы Прывядзенне да базавага тыпу? або выкарыстаць яго непасрэдна ў ArrayList? проста абмежаванні на метады, даступныя або што-небудзь яшчэ?
дададзена аўтар Dineshkumar, крыніца
@Dineshkumar абгорткі ўяўляе сабой шаблон дызайну, які перакладае адзін інтэрфейс для класа ў іншы інтэрфейс. См патэрн абгорткі артыкула. | Дзе вы трэба ператвараць? Я хацеў бы прапанаваць выкарыстоўваць List для тыпаў зменных (або аргументы метаду і г.д.). Гэта робіць код больш універсальным і вы можаце лёгка пераключыцца на іншы List рэалізацыі па меры неабходнасці, без неабходнасці перапісваць шмат кода.
дададзена аўтар Petr Pudlák, крыніца
Вельмі выразна растлумачана, дзякуй.
дададзена аўтар codewarrior, крыніца
Выдатны адказ дзякуй вельмі шмат.
дададзена аўтар Siddhartha, крыніца
Выдатна тлумачэнне !!!
дададзена аўтар Aks, крыніца
  1. First, let's see what this does:

    Arrays.asList(ia)
    

    It takes an array ia and creates a wrapper that implements List, which makes the original array available as a list. Nothing is copied and all, only a single wrapper object is created. Operations on the list wrapper are propagated to the original array. This means that if you shuffle the list wrapper, the original array is shuffled as well, if you overwrite an element, it gets overwritten in the original array, etc. Of course, some List operations aren't allowed on the wrapper, like adding or removing elements from the list, you can only read or overwrite the elements.

    Note that the list wrapper doesn't extend ArrayList - it's a different kind of object. ArrayLists have their own, internal array, in which they store their elements, and are able to resize the internal arrays etc. The wrapper doesn't have its own internal array, it only propagates operations to the array given to it.

  2. On the other hand, if you subsequently create a new array as

    new ArrayList(Arrays.asList(ia))
    

    then you create new ArrayList, which is a full, independent copy of the original one. Although here you create the wrapper using Arrays.asList as well, it is used only during the construction of the new ArrayList and is garbage-collected afterwards. The structure of this new ArrayList is completely independent of the original array. It contains the same elements (both the original array and this new ArrayList reference the same integers in memory), but it creates a new, internal array, that holds the references. So when you shuffle it, add, remove elements etc., the original array is unchanged.

157
дададзена
што абгортка?
дададзена аўтар Dineshkumar, крыніца
як наконт розніцы Прывядзенне да базавага тыпу? або выкарыстаць яго непасрэдна ў ArrayList? проста абмежаванні на метады, даступныя або што-небудзь яшчэ?
дададзена аўтар Dineshkumar, крыніца
@Dineshkumar абгорткі ўяўляе сабой шаблон дызайну, які перакладае адзін інтэрфейс для класа ў іншы інтэрфейс. См патэрн абгорткі артыкула. | Дзе вы трэба ператвараць? Я хацеў бы прапанаваць выкарыстоўваць List для тыпаў зменных (або аргументы метаду і г.д.). Гэта робіць код больш універсальным і вы можаце лёгка пераключыцца на іншы List рэалізацыі па меры неабходнасці, без неабходнасці перапісваць шмат кода.
дададзена аўтар Petr Pudlák, крыніца
Вельмі выразна растлумачана, дзякуй.
дададзена аўтар codewarrior, крыніца
Выдатны адказ дзякуй вельмі шмат.
дададзена аўтар Siddhartha, крыніца
Выдатна тлумачэнне !!!
дададзена аўтар Aks, крыніца

Well this is because ArrayList resulting from Arrays.asList() is not of the type java.util.ArrayList . Arrays.asList() creates an ArrayList of type java.util.Arrays$ArrayList which does not extend java.util.ArrayList but only extends java.util.AbstractList

17
дададзена
List list1 = new ArrayList(Arrays.asList(ia));  //copy

У гэтым выпадку, песни1 тыпу ArrayList .

List list2 = Arrays.asList(ia);

Тут спіс вяртаецца як Спіс гледжання, гэта значыць ён мае толькі метады, прымацаваныя да гэтага інтэрфейсу. Такім чынам, чаму некаторыя метады не дапускаюцца на list2 .

ArrayList list1 = new ArrayList(Arrays.asList(ia));

Тут вы ствараеце новы ArrayList . Вы проста перадаючы яго значэнне ў канструктару. Гэта не з'яўляецца прыкладам ліцця. У кастынгу, гэта можа выглядаць наступным чынам:

ArrayList list1 = (ArrayList)Arrays.asList(ia);
7
дададзена
<�Код> List інтэрфейс. Тут з'яўляецца адпаведная дакументацыя.
дададзена аўтар christopher, крыніца
толькі метады, прымацаваныя да інтэрфейсу? які інтэрфейс? Вентыляцыйны я меў на ўвазе мы адносім ArrayList ў LIST1 ў заяве 1. [Я пачатковец у калекцыі]
дададзена аўтар Dineshkumar, крыніца

Я даволі позна тут, так ці інакш адчуваў тлумачэнне са спасылкамі DOC будзе лепш для кагосьці шукае адказ.

<�Ол>   
  • This is a utility class with bunch of static methods to operate on given array
  • asList is one such static method that takes input array and returns an object of java.util.Arrays.ArrayList which is a static nested class that extends AbstractList which inturn implements List interface.
  • So Arrays.asList(inarray) returns a List wrapper around the input array but this wrapper is java.util.Arrays.ArrayList and not java.util.ArrayList and it refers to the same array so adding more elements to List wrapped array would affect orignal one too and also we cannot change the length.
<�Ол пачаць = "2">   
  • ArrayList has bunch of overloaded constructors

    public ArrayList() - //returns arraylist with default capacity 10

    public ArrayList(Collection c)

    public ArrayList(int initialCapacity)

  • So when we pass Arrays.asList returned object i.e. List(AbstractList) to second constructor above, it will create a new dynamic array(this array size increases as we add more elements than its capacity and also the new elements will not affect the orignal array) shallow copying the original array(shallow copy means it copies over the references only and does not create a new set of same objects as in orignal array)

2
дададзена

Я даволі позна тут, так ці інакш адчуваў тлумачэнне са спасылкамі DOC будзе лепш для кагосьці шукае адказ.

<�Ол>   
  • This is a utility class with bunch of static methods to operate on given array
  • asList is one such static method that takes input array and returns an object of java.util.Arrays.ArrayList which is a static nested class that extends AbstractList which inturn implements List interface.
  • So Arrays.asList(inarray) returns a List wrapper around the input array but this wrapper is java.util.Arrays.ArrayList and not java.util.ArrayList and it refers to the same array so adding more elements to List wrapped array would affect orignal one too and also we cannot change the length.
<�Ол пачаць = "2">   
  • ArrayList has bunch of overloaded constructors

    public ArrayList() - //returns arraylist with default capacity 10

    public ArrayList(Collection c)

    public ArrayList(int initialCapacity)

  • So when we pass Arrays.asList returned object i.e. List(AbstractList) to second constructor above, it will create a new dynamic array(this array size increases as we add more elements than its capacity and also the new elements will not affect the orignal array) shallow copying the original array(shallow copy means it copies over the references only and does not create a new set of same objects as in orignal array)

2
дададзена

Асноўная розніца -

калі спіс ствараецца без выкарыстання новага аператара Arrays.asList() метад гэта вярнуць абгортку, які азначае

1. you can perform add/update Operation.

2. the changes done in original array will be reflected to List as well and vice versa.

1
дададзена
Ваш першы пункт павінен быць выпраўлены, мы не можам дадаць любы элемент у гэтай абгортцы. Мы можам толькі рэдагаваць/абнавіць або проста чытаць элементы з гэтай абалонкі
дададзена аўтар Jyotsana Nandwani, крыніца

У першую чаргу Масівы клас з'яўляецца класам ўтыліта, якая не ўтрымлівае. аб карыснасці метадаў работы на масівах (дзякуючы Масівы класа ў адваротным выпадку давялося б ствараць свае ўласныя метады, каб ўплываць на аб'екты Array)

Метад asList ():

  1. asList method is one of the utility methods of Array class ,it is static method thats why we can call this method by its class name (like Arrays.asList(T...a) )
  2. Now here is the twist, please note that this method doesn't create new ArrayList object, it just returns a List reference to existing Array object(so now after using asList method, two references to existing Array object gets created)
  3. and this is the reason, all methods that operate on List object , may NOT work on this Array object using List reference like for example, Arrays size is fixed in length, hence you obviously can not add or remove elements from Array object using this List reference (like list.add(10) or list.remove(10); else it will throw UnsupportedOperationException)
  4. any change you are doing using list reference will be reflected in exiting Arrays object ( as you are operating on existing Array object by using list reference)

У першым выпадку вы ствараеце новы Список_массивов аб'ект (у 2-ім выпадку толькі спасылкі на існуючы створаны аб'ект масіва, але не новы ArrayList аб'ект), так што зараз ёсць два розных аб'екты адзін Масіў <�код /> аб'ект і іншае ArrayList аб'ект, і ніякай сувязі паміж імі (так што змены ў адным аб'екце не будуць адлюстраваныя/закрануты ў іншым аб'екце (гэта значыць у выпадку 2 Масіў і Список_массивов два розных аб'екта)

Выпадак 1:

Integer [] ia = {1,2,3,4};
System.out.println("Array : "+Arrays.toString(ia));
List list1 = new ArrayList(Arrays.asList(ia)); //new ArrayList object is created , no connection between existing Array Object
list1.add(5);
list1.add(6);
list1.remove(0);
list1.remove(0);
System.out.println("list1 : "+list1);
System.out.println("Array : "+Arrays.toString(ia));

Выпадак 2:

Integer [] ia = {1,2,3,4};
System.out.println("Array : "+Arrays.toString(ia));
List list2 = Arrays.asList(ia);//creates only a (new ) List reference to existing Array object (and NOT a new ArrayList Object)
//  list2.add(5);// it will throw java.lang.UnsupportedOperationException - invalid operation (as Array size is fixed)
list2.set(0,10); //making changes in existing Array object using List reference - valid 
list2.set(1,11); 
ia[2]=12;    //making changes in existing Array object using Array reference - valid
System.out.println("list2 : "+list2);
System.out.println("Array : "+Arrays.toString(ia));
1
дададзена

У першую чаргу Масівы клас з'яўляецца класам ўтыліта, якая не ўтрымлівае. аб карыснасці метадаў работы на масівах (дзякуючы Масівы класа ў адваротным выпадку давялося б ствараць свае ўласныя метады, каб ўплываць на аб'екты Array)

Метад asList ():

  1. asList method is one of the utility methods of Array class ,it is static method thats why we can call this method by its class name (like Arrays.asList(T...a) )
  2. Now here is the twist, please note that this method doesn't create new ArrayList object, it just returns a List reference to existing Array object(so now after using asList method, two references to existing Array object gets created)
  3. and this is the reason, all methods that operate on List object , may NOT work on this Array object using List reference like for example, Arrays size is fixed in length, hence you obviously can not add or remove elements from Array object using this List reference (like list.add(10) or list.remove(10); else it will throw UnsupportedOperationException)
  4. any change you are doing using list reference will be reflected in exiting Arrays object ( as you are operating on existing Array object by using list reference)

У першым выпадку вы ствараеце новы Список_массивов аб'ект (у 2-ім выпадку толькі спасылкі на існуючы створаны аб'ект масіва, але не новы ArrayList аб'ект), так што зараз ёсць два розных аб'екты адзін Масіў <�код /> аб'ект і іншае ArrayList аб'ект, і ніякай сувязі паміж імі (так што змены ў адным аб'екце не будуць адлюстраваныя/закрануты ў іншым аб'екце (гэта значыць у выпадку 2 Масіў і Список_массивов два розных аб'екта)

Выпадак 1:

Integer [] ia = {1,2,3,4};
System.out.println("Array : "+Arrays.toString(ia));
List list1 = new ArrayList(Arrays.asList(ia)); //new ArrayList object is created , no connection between existing Array Object
list1.add(5);
list1.add(6);
list1.remove(0);
list1.remove(0);
System.out.println("list1 : "+list1);
System.out.println("Array : "+Arrays.toString(ia));

Выпадак 2:

Integer [] ia = {1,2,3,4};
System.out.println("Array : "+Arrays.toString(ia));
List list2 = Arrays.asList(ia);//creates only a (new ) List reference to existing Array object (and NOT a new ArrayList Object)
//  list2.add(5);// it will throw java.lang.UnsupportedOperationException - invalid operation (as Array size is fixed)
list2.set(0,10); //making changes in existing Array object using List reference - valid 
list2.set(1,11); 
ia[2]=12;    //making changes in existing Array object using Array reference - valid
System.out.println("list2 : "+list2);
System.out.println("Array : "+Arrays.toString(ia));
1
дададзена
    String names[] = new String[]{"Avinash","Amol","John","Peter"};
    java.util.List namesList = Arrays.asList(names);
    or
    String names[] = new String[]{"Avinash","Amol","John","Peter"};
    java.util.List temp = Arrays.asList(names);         

Above Statement adds the wrapper on the input array. So the methods like add & remove will not be applicable on list reference object 'namesList'.

If you try to add an element in the existing array/list then you will get "Exception in thread "main" java.lang.UnsupportedOperationException".

The above operation is readonly or viewonly. 
We can not perform add or remove operation in list object. But String names[] = new String[]{"Avinash","Amol","John","Peter"}; java.util.ArrayList list1 = new ArrayList<>(Arrays.asList(names)); or String names[] = new String[]{"Avinash","Amol","John","Peter"}; java.util.List listObject = Arrays.asList(names); java.util.ArrayList list1 = new ArrayList<>(listObject); In above statement you have created a concrete instance of an ArrayList class and passed a list as a parameter. In this case method add & remove will work properly as both methods are from ArrayList class so here we won't get any UnSupportedOperationException. Changes made in Arraylist object (method add or remove an element in/from an arraylist) will get not reflect in to original java.util.List object. String names[] = new String[] { "Avinash", "Amol", "John", "Peter" }; java.util.List < String > listObject = Arrays.asList(names); java.util.ArrayList < String > list1 = new ArrayList < > (listObject); for (String string: list1) { System.out.print(" " + string); } list1.add("Alex"); //Added without any exception list1.remove("Avinash"); //Added without any exception will not make any changes in original list in this case temp object. for (String string: list1) { System.out.print(" " + string); } String existingNames[] = new String[] { "Avinash", "Amol", "John", "Peter" }; java.util.List < String > namesList = Arrays.asList(names); namesList.add("Bob");//UnsupportedOperationException occur namesList.remove("Avinash"); //UnsupportedOperationException
1
дададзена
    String names[] = new String[]{"Avinash","Amol","John","Peter"};
    java.util.List namesList = Arrays.asList(names);
    or
    String names[] = new String[]{"Avinash","Amol","John","Peter"};
    java.util.List temp = Arrays.asList(names);         

Above Statement adds the wrapper on the input array. So the methods like add & remove will not be applicable on list reference object 'namesList'.

If you try to add an element in the existing array/list then you will get "Exception in thread "main" java.lang.UnsupportedOperationException".

The above operation is readonly or viewonly. 
We can not perform add or remove operation in list object. But String names[] = new String[]{"Avinash","Amol","John","Peter"}; java.util.ArrayList list1 = new ArrayList<>(Arrays.asList(names)); or String names[] = new String[]{"Avinash","Amol","John","Peter"}; java.util.List listObject = Arrays.asList(names); java.util.ArrayList list1 = new ArrayList<>(listObject); In above statement you have created a concrete instance of an ArrayList class and passed a list as a parameter. In this case method add & remove will work properly as both methods are from ArrayList class so here we won't get any UnSupportedOperationException. Changes made in Arraylist object (method add or remove an element in/from an arraylist) will get not reflect in to original java.util.List object. String names[] = new String[] { "Avinash", "Amol", "John", "Peter" }; java.util.List < String > listObject = Arrays.asList(names); java.util.ArrayList < String > list1 = new ArrayList < > (listObject); for (String string: list1) { System.out.print(" " + string); } list1.add("Alex"); //Added without any exception list1.remove("Avinash"); //Added without any exception will not make any changes in original list in this case temp object. for (String string: list1) { System.out.print(" " + string); } String existingNames[] = new String[] { "Avinash", "Amol", "John", "Peter" }; java.util.List < String > namesList = Arrays.asList(names); namesList.add("Bob");//UnsupportedOperationException occur namesList.remove("Avinash"); //UnsupportedOperationException
1
дададзена

Варта адзначыць, што ў Java 8, 'IA' вышэй павінна быць Integer [], а не INT []. Arrays.asList() з масіва Int вяртае спіс з адным элементам. Пры выкарыстанні фрагмента кода OP, у кампілятар зловіць праблему, але некаторыя метады (напрыклад, Collections.shuffle ()) будзе моўчкі не рабіць тое, што вы чакаеце.

1
дададзена
Я сутыкнуўся з гэтай праблемай кампілятара, калі я зрабіў ArrayList алы = новы ArrayList (Arrays.asList (а)); дзе быў INT []. Мой аль атрымаў толькі адзін элемент, які таксама пры друку глядзеў смецце. Што гэты элемент? І як жа гэта здарылася прыйсці туды? Я сутыкнуўся з гэтай праблемай у Java-
дададзена аўтар Jyotsana Nandwani, крыніца

<�Код> Arrays.asList()

this method returns its own implementation of List.It takes an array as an argument and builds methods and attributes on top of it, since it is not copying any data from an array but using the original array this causes alteration in original array when you modify list returned by the <�Код> Arrays.asList() method.

on the other hand.
ArrayList(Arrays.asList()); is a constructor of ArrayList class which takes a list as argument and returns an ArrayList that is independent of list ie. <�Код> Arrays.asList() in this case passed as an argument. that is why you see these results;

1
дададзена

<�Код> Arrays.asList()

this method returns its own implementation of List.It takes an array as an argument and builds methods and attributes on top of it, since it is not copying any data from an array but using the original array this causes alteration in original array when you modify list returned by the <�Код> Arrays.asList() method.

on the other hand.
ArrayList(Arrays.asList()); is a constructor of ArrayList class which takes a list as argument and returns an ArrayList that is independent of list ie. <�Код> Arrays.asList() in this case passed as an argument. that is why you see these results;

1
дададзена
package com.copy;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class CopyArray {

    public static void main(String[] args) {
        List list1, list2 = null;
        Integer[] intarr = { 3, 4, 2, 1 };
        list1 = new ArrayList(Arrays.asList(intarr));
        list1.add(30);
        list2 = Arrays.asList(intarr);
       //list2.add(40); Here, we can't modify the existing list,because it's a wrapper
        System.out.println("List1");
        Iterator itr1 = list1.iterator();
        while (itr1.hasNext()) {
            System.out.println(itr1.next());
        }
        System.out.println("List2");
        Iterator itr2 = list2.iterator();
        while (itr2.hasNext()) {
            System.out.println(itr2.next());
        }
    }
}
0
дададзена

Многія людзі адказалі на механічныя дэталі ўжо, але варта адзначыць: Гэта дрэнны выбар дызайну, з дапамогай Java.

У Java asList метад дакументавана як "Вяртае фіксаванага памеру спіс ...". Калі ўзяць яго вынік і выклік (скажам) кнопку .add метад, ён выдае UnsupportedOperationException . Гэта неинтуитивное паводзіны! Калі метад кажа, што ён вяртае List , стандартнае чаканне, што ён вяртае аб'ект, які падтрымлівае метады інтэрфейсу Спіс . Распрацоўшчык не павінен запамінаць , які з шматлікі util.List метады стварэння List S, якія фактычна не падтрымліваюць усе <�код > Спіс метады.

Калі б яны назвалі метад asImmutableList , гэта будзе мець сэнс. Ці, калі яны толькі што метад вяртае рэальны List (і скапіяваць масіў подкладочный), гэта мела б сэнс. Яны вырашылі на карысць як падчас выканання прадукцыйнасць і кароткія імёны, за кошт парушэння як прынцып найменшага здзіўлення і добразычлівасць o.o. практыка пазбягання UnsupportedOperationException с.

(Акрамя таго, распрацоўнікі маглі бы зрабіў інтэрфейс ImmutableList , каб пазбегнуць мноства UnsupportedOperationException с.)

0
дададзена

Многія людзі адказалі на механічныя дэталі ўжо, але варта адзначыць: Гэта дрэнны выбар дызайну, з дапамогай Java.

У Java asList метад дакументавана як "Вяртае фіксаванага памеру спіс ...". Калі ўзяць яго вынік і выклік (скажам) кнопку .add метад, ён выдае UnsupportedOperationException . Гэта неинтуитивное паводзіны! Калі метад кажа, што ён вяртае List , стандартнае чаканне, што ён вяртае аб'ект, які падтрымлівае метады інтэрфейсу Спіс . Распрацоўшчык не павінен запамінаць , які з шматлікі util.List метады стварэння List S, якія фактычна не падтрымліваюць усе <�код > Спіс метады.

Калі б яны назвалі метад asImmutableList , гэта будзе мець сэнс. Ці, калі яны толькі што метад вяртае рэальны List (і скапіяваць масіў подкладочный), гэта мела б сэнс. Яны вырашылі на карысць як падчас выканання прадукцыйнасць і кароткія імёны, за кошт парушэння як прынцып найменшага здзіўлення і добразычлівасць o.o. практыка пазбягання UnsupportedOperationException с.

(Акрамя таго, распрацоўнікі маглі бы зрабіў інтэрфейс ImmutableList , каб пазбегнуць мноства UnsupportedOperationException с.)

0
дададзена
1.List list1 = new ArrayList(Arrays.asList(ia));  //copy
2.List list2 = Arrays.asList(ia);

In line 2, Arrays.asList(ia) returns a List reference of inner class object defined within Arrays, which is also called ArrayList but is private and only extends AbstractList. This means what returned from Arrays.asList(ia) is a class object different from what you get from new ArrayList.

Вы не можаце выкарыстоўваць некаторыя аперацыі на лінію 2, так як унутраны прыватны клас ўнутры Масівы не забяспечвае гэтыя метады.

Take a look at this link and see what you can do with the private inner class: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Arrays.java#Arrays.ArrayList

Радок 1 стварае новы ArrayList аб'ект капіявання элементаў з таго, што вы атрымліваеце ад лініі 2. Такім чынам, вы можаце рабіць усё, што вы хочаце, так як java.util.ArrayList прадастаўляе ўсе гэтыя метады.

0
дададзена