有没有办法在java中重用arraylist?

时间:2017-08-26 05:11:57

标签: java arraylist

我有两个ArrayLists。我想重用第二个arraylist(temporaryArrayList)。请注意我的代码。希望你当然能理解我想让你知道的事情。

System.out.println(arrayListContainer.get(0).get(0));

代码给出了arrayListContainer的预期大小,但没有给出

的预期结果
new ArrayAdapter

我怎样才能做到这一点。谢天谢地,我们会接受任何形式的回复或建议。

6 个答案:

答案 0 :(得分:3)

您正在添加相同的对象并将其删除。 要将不同的临时列表添加到IntSequence,您应该创建一个副本:

更改以下行:

arrayListContainer

为:

arrayListContainer.add(temporaryArrayList);

Thilo在下面的评论中建议的另一种选择是每次都创建一个新的ArrayList<String> copy = new ArrayList<>(temporaryArrayList) arrayListContainer.add(copy); ,这样您就可以确保将不同的临时列表添加到{{ 1}}。

答案 1 :(得分:2)

添加时需要创建ArrayList的克隆,否则当您删除内容时,您正在删除刚刚添加的实际列表的内容。克隆它将添加ArrayList的副本而不是原始。

编辑:实际上 - 基于Thilo对另一个答案的评论 - 更好的解决方案是将临时ArrayList代码提取到方法并调用它:

 public static void main(String[] args){

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

    String[] a = {"I","you","he"};
    arrayListContainer.add(createArrayList(a));
    String[] b = {"Bob","Rahim","Betty"};
    arrayListContainer.add(createArrayList(b));

    System.out.println(arrayListContainer.size());
    System.out.println(arrayListContainer.get(0).get(0));
 }

 private static ArrayList<String> createArrayList(String[] arr) {
     ArrayList<String> temporaryArrayList= new ArrayList<>();
     for(String str : arr) {
         temporaryArrayList.add(str);
     }
     return temporaryArrayList;
 }

答案 2 :(得分:2)

其他答案是正确的。你正在重用你的第二个ArrayList,而不是你想要的方式。

您需要了解(a)对象的引用,以及(b)ArrayList是一个对象,它是对其他对象的引用的容器。

让我们看一下代码执行过程中的状态。

首先实例化ArrayList,默认为10个广告位。将保留对引用ArrayList个对象的其他String实例的引用。

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

enter image description here

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

enter image description here

实例化String个对象,在第二个列表的插槽中添加对每个对象的引用。请记住,列表包含String对象的引用,而不是对象本身。

temporaryArrayList.add( "I" ) ;
temporaryArrayList.add( "you" ) ;
temporaryArrayList.add( "he" ) ;
temporaryArrayList.add( "she" ) ;
temporaryArrayList.add( "we" ) ;

enter image description here

将第二个列表的引用添加到第一个列表的第一个插槽中。

arrayListContainer.add(temporaryArrayList) ;

enter image description here

通过调用String删除代词clear()对象的所有引用。那些String对象实际上存在于内存中一段时间​​,因为它们没有被任何其他对象引用,因此成为垃圾收集的候选对象。所以我们在这个图中显示它们已经消失了,但实际上它们可能会在内存中浮动一段时间。

temporaryArrayList.clear() ;

enter image description here

实例化一些新的String个对象。在第二个列表的插槽中引用每个引用。

temporaryArrayList.add( "Rahim" ) ;
temporaryArrayList.add( "jon" ) ;
temporaryArrayList.add( "don" ) ;
temporaryArrayList.add( "shaila" ) ;

enter image description here

这是您误解的地方。你显然想要保留代词并在它们旁边添加一些专有名称。但是第一个列表不包含对String个对象的引用,它包含对ArrayListString个对象的引用。因此,我们最终得到两个对同一ArrayList对象的引用,该对象包含对正确名称字符串的引用。旧代词串可能会或可能不会在记忆中漂浮,但我们无法再接触它们,所以我们认为它们已经消失了。

arrayListContainer.add( temporaryArrayList ) ;

enter image description here

接下来,清除唯一的字符串列表。所以现在第一个ArrayList持有对同一个现在为空的第二个ArrayList的两个引用。

temporaryArrayList.clear() ;

enter image description here

最终得到一个包含两个元素的列表,其中每个元素都指向相同的空“temp”列表。

如果您想在第一个列表中累积字符串,请将第一个列表重新定义为ArrayList String而不是ArrayList<String>。所以,而不是:

ArrayList< ArrayList< String > > arrayListContainer = new ArrayList<>() ;
ArrayList< String > temporaryArrayList = new ArrayList<>() ;
…
arrayListContainer.add( temporaryArrayList ) ;

...这样,将add更改为addAll

ArrayList< String > arrayListContainer = new ArrayList<>() ;
ArrayList< String > temporaryArrayList = new ArrayList<>() ;
…
arrayListContainer.addAll( temporaryArrayList ) ;  // Call `addAll` to add the elements of one collection to another collection.

提示:尽可能使用接口。

通常最好指定更多通用接口而不是具体类,这样您就可以更轻松地切换出具体类;所以你可以使用ListList< List<String> >

List<List<String>> listContainer = new ArrayList<>();

答案 3 :(得分:1)

您无法以您想要的方式重复使用它。您的ArrayList<ArrayList<String>>包含引用到对象(在本例中为对ArrayList<String>的引用)。如果你说

arrayListContainer.add(temporaryArrayList);

以后,

arrayListContainer.add(temporaryArrayList);

如果不在temporaryArrayList之间分配新值,则arrayListContainer将对同一个对象进行两次引用。 temporaryArrayList是对象的引用,即使对象的内容发生更改,它也不会更改(除非您将整个新对象重新分配给它)。

您需要创建一个新对象。

答案 4 :(得分:1)

在您的情况下,您不需要数组列表的数组列表,只需将其作为字符串数组的数组列表:

ArrayList<String[]> arrayContainer = new ArrayList<>();

完成添加字符串后,请调用:

arrayContainer.add(temporaryArrayList.toArray(new String[temporaryArrayList.size()]));

这样你就可以安全地重用临时数组列表。

答案 5 :(得分:1)

    ArrayList<ArrayList<String>> arrayListContainer = new ArrayList<>();
    ArrayList<String> temporaryArrayList = new ArrayList<>();

    temporaryArrayList.add("I");
    temporaryArrayList.add("you");
    temporaryArrayList.add("he");
    temporaryArrayList.add("she");
    temporaryArrayList.add("we");

    arrayListContainer.add(new ArrayList<>(temporaryArrayList));

   temporaryArrayList.clear();

    temporaryArrayList.add("Rahim");
    temporaryArrayList.add("jon");
    temporaryArrayList.add("don");
    temporaryArrayList.add("shaila");

    arrayListContainer.add(new ArrayList<>(temporaryArrayList));
    temporaryArrayList.clear();


    System.out.println(arrayListContainer.get(0).get(0));

这只是克隆对象的另一种自然方式:)