如何在java中更改ArrayList元素的值

pra*_*rda 66 java arraylist

请帮我下面的代码,即使更改了值,我也会获得相同的输出

import java.util.*;

class Test {
    public static void main(String[] args) {
        ArrayList<Integer> a = new ArrayList<Integer>();

       // added 0-9 to ArrayList        
          for(int i=0;i<9;i++)
            a.add(new Integer(i));

        // initialize the Iterator
        Iterator<Integer> i = a.iterator();

        // changed the value of first element in List
        if(i.hasNext()) {
            Integer x = i.next();
            x = Integer.valueOf(9);
        }

        // initialized the iterator again and print all the elements
        i = a.iterator();
        while(i.hasNext())
            System.out.print(i.next());
    }
}    

//Output : 012345678
Run Code Online (Sandbox Code Playgroud)

值9未更新.

Dun*_*nes 87

该列表维护对列表中存储的原始值的对象引用.所以当你执行这一行时:

Integer x = i.next();
Run Code Online (Sandbox Code Playgroud)

两者x和列表都存储对同一对象的引用.但是,当您执行时:

x = Integer.valueOf(9);
Run Code Online (Sandbox Code Playgroud)

列表中没有任何更改,但x现在存储对不同对象的引用.该列表没有改变.您需要使用一些列表操作方法,例如

list.set(index, Integer.valueof(9))
Run Code Online (Sandbox Code Playgroud)

注意:这与其他人建议的不变性无关Integer.这只是基本的Java对象引用行为.


这是一个完整的例子,以帮助解释这一点.请注意,这使用了ListIterator类,它支持在迭代中删除/设置项:

import java.util.*;

public class ListExample {

  public static void main(String[] args) {

    List<Foo> fooList = new ArrayList<Foo>();
    for (int i = 0; i < 9; i++)
      fooList.add(new Foo(i, i));

    // Standard iterator sufficient for altering elements
    Iterator<Foo> iterator = fooList.iterator();

    if (iterator.hasNext()) {
      Foo foo = iterator.next();
      foo.x = 99;
      foo.y = 42;
    }

    printList(fooList);    

    // List iterator needed for replacing elements
    ListIterator<Foo> listIterator = fooList.listIterator();

    if (listIterator.hasNext()) {
      // Need to call next, before set.
      listIterator.next();
      // Replace item returned from next()
      listIterator.set(new Foo(99,99));
    }

    printList(fooList);
  }

  private static void printList(List<?> list) {
    Iterator<?> iterator = list.iterator();
    while (iterator.hasNext()) {
      System.out.print(iterator.next());
    }
    System.out.println();
  }

  private static class Foo {
    int x;
    int y;

    Foo(int x, int y) {
      this.x = x;
      this.y = y;
    }

    @Override
    public String toString() {
      return String.format("[%d, %d]", x, y);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将打印:

[99, 42][1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8]
[99, 99][1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8]
Run Code Online (Sandbox Code Playgroud)


pan*_*kaj 13

使用set方法将旧值替换为新值.

list.set( 2, "New" );
Run Code Online (Sandbox Code Playgroud)


Joa*_*son 11

你说你在改变第一个元素的价值;

x = Integer.valueOf(9);
Run Code Online (Sandbox Code Playgroud)

你正在改变x指向一个全新的整数,但从不再使用它.你不是以任何方式改变收藏品.

由于您正在使用ArrayList,因此如果您想要一个允许您更改元素的迭代器,则可以使用ListIterator ,这是您需要更改的代码片段;

//初始化Iterator
ListIterator <Integer> i = a.listIterator() ;

//在List
if(i.hasNext()){
    i.next();中更改了frist 元素的值
    i.set(Integer.valueOf(9));     //更改元素的迭代器是目前
}

//新的迭代器,并打印所有元素
Iterator iter = a.iterator();
while(iter.hasNext())
    System.out.print(iter.next());

>> 912345678

遗憾的是,同样不能扩展到Set <T>等其他集合.实现细节(例如,哈希集实现为哈希表并更改对象可以更改哈希值,因此更改迭代顺序)使Set <T>成为"仅添加新/删除"类型的数据结构,并更改内容在迭代它时根本不安全.