ArrayList - 如何修改对象的成员?

use*_*796 34 java collections pojo

我有一些Customer存储在ArrayList中的对象.我的Customer班级有2个数据成员:NameEmail.现在我想修改Emailfor Customer"Doe".

现在,如果"Doe"位于列表中的索引3,我知道我可以写下这一行:

myList.set( 3, new Customer( "Doe", "j.doe@supermail.com" ) );
Run Code Online (Sandbox Code Playgroud)

但这意味着要创建一个新对象.如果我有一个非常大的列表,我想这个过程会很慢.有没有其他方法直接访问存储在ArrayList中的Object的数据成员,可能使用另一种Collection而不是ArrayList?

m3t*_*man 39

你可以这样做:

myList.get(3).setEmail("new email");
Run Code Online (Sandbox Code Playgroud)


Axe*_*ini 8

固定.我错了:这只适用于元素重新分配.我以为返回的对象没有引用新的对象.

可以办到.

:为什么?
:get()方法返回引用原始对象的对象.

因此,如果您编写myArrayList.get(15).itsVariable = 7
或者
myArrayList.get(15).myMethod("My Value"),
您实际上是从返回的对象引用对象中使用方法分配值(这意味着,更改将应用​​于原始对象)

你唯一不能做的就是myArrayList.get(15) = myNewElement.要做到这一点,你必须使用list.set()方法.

  • 这是不正确的.确实[ArrayList.get()](https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#get(int))返回元素的副本但是在元素是一个对象的情况下(就像问题作者的List <Customer>那样),它返回对象的引用的副本.您对此引用所做的任何修改都将反映在列表中,因为引用指向内存中与列表中的对象完全相同的位置.所以这个:`myList.get(3).setEmail("j.doe@new.com");`会修改列表电子邮件中pos 3的客户. (6认同)

Pet*_*hev 6

假设Customer有一个电子邮件设置器 -myList.get(3).setEmail("j.doe@supermail.com")


Mah*_*dra 5

您可以遍历arraylist来标识索引以及最终需要修改的对象。您可以使用for-each进行以下操作:

for(Customer customer : myList) {
    if(customer!=null && "Doe".equals(customer.getName())) {
        customer.setEmail("abc@xyz.com");
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的customer是对Arraylist中存在的对象的引用,如果更改此客户引用的任何属性,这些更改将反映在存储在Arraylist中的对象中。