在Java中怎么修改ArrayList()中元素的值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Java中怎么修改ArrayList()中元素的值?相关的知识,希望对你有一定的参考价值。
比如在ArrayList()中放了一个对象A,A对象中有属性a和b,那么怎么修改A对象中a和b的值? 请路过的大侠们帮个忙
1、什么是ArrayList :
ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:
(1)动态的增加和减少元素
(2)实现了ICollection和IList接口
(3)灵活的设置数组的大小
2、ArrayLis的创建以及增删改查方法:
(1)ArrayList的创建以及元素的添加:
ArrayList <变量名> = new ArrayList(); //()中也可传参。注释:上面是创建一个空的ArrayList列表。当我们想往列表中传递元素的时候是通过.add()的方法来进行赋值的。看一下下面的案例。另外要想输出出列表中的元素的话要通过for循环遍历:
public class testpublic static void main(String[] args)
ArrayList lis = new ArrayList();
lis.add("tony");
lis.add("tom");
lis.add("jack");
lis.add("mary");
lis.add("even");
for(int i=0;i<lis.size();i++)
String result = (String)lis.get(i);
System.out.println(result);
输出结果如下:
tony
tom
jack
mary
even
(2)ArrayList中元素的删除:
注释:变量名.remove(int Index); //通过.remove(int Index)方法来进行删除。
这里直接传入要删除元素的下标即可。当然也可以直接传入值进行删除。如果你觉得用下边的方式比较麻烦那可以直接输入要删除项的值。
package com.java.demo_9;import java.util.ArrayList;
public class Arraylist
public static void main(String[] args)
ArrayList lis = new ArrayList();
lis.add("tony");
lis.add("tom");
lis.add("jack");
lis.add("mary");
lis.add("even");
System.out.println("---------------------------------");
System.out.println("<ArrayList原列表元素>:");
for (int i = 0; i < lis.size(); i++)
String result = (String) lis.get(i);
System.out.println(result);
System.out.println("---------------------------------");
System.out.println("<删除元素后的ArrayList列表>:");
lis.remove(1);
for (int i = 0; i < lis.size(); i++)
String result = (String) lis.get(i);
System.out.println(result);
System.out.println("---------------------------------");
结果:
因为我指定的是lis.remove(1);
index是从0开始起始的因此1代表第2个元素。因此删除的是tom这个元素。
<ArrayList原列表元素>:
tony
tom
jack
mary
even
---------------------------------
<删除元素后的ArrayList列表>:
tony
jack
mary
even
---------------------------------
(3)ArrayList中元素的修改注释:
ArrayList方法中有一个.set方法(变量.set(index, element);)。
通过这个方法可以修改列表中的值。(index指定下标,element指定要修改后元素的值)。一起来看一下下面的示例:
import java.util.ArrayList;
public class Arraylist
public static void main(String[] args)
ArrayList lis = new ArrayList();
lis.add("tony");
lis.add("tom");
lis.add("jack");
lis.add("mary");
lis.add("even");
System.out.println("---------------------------------");
System.out.println("<ArrayList原列表元素>:");
for (int i = 0; i < lis.size(); i++)
String result = (String) lis.get(i);
System.out.println(result);
System.out.println("---------------------------------");
System.out.println("<修改后的ArrayList列表>:");
//lis.remove("tom");
lis.set(2, "lucy");
for (int i = 0; i < lis.size(); i++)
String result = (String) lis.get(i);
System.out.println(result);
System.out.println("---------------------------------");
结果:
通过下面的结果可以看出第3个下标中的值已经被改变了。本来是jack现在更改成了lucy。
<ArrayList原列表元素>:
tony
tom
jack
mary
even
---------------------------------
<修改后的ArrayList列表>:
tony
tom
lucy
mary
even
---------------------------------
(4)ArrayList中元素的查找:
注释:.contains()是用来判断一个元素是否包含在另一个元素中的。
所以这里是判断查找的元素是否包含在列表中。返回值方面我直接用的是打印的方法。也可以通过boolean,return的方式返回。
案例1:
import java.util.ArrayList;public class tes
public static void main(String[] args)
ArrayList lis = new ArrayList();
lis.add("tony");
lis.add("tom");
lis.add("jack");
lis.add("mary");
lis.add("even");
if(lis.contains("vivian"))
System.out.println("包含此元素!");
else
System.out.println("该元素不存在!");
结果:
返回结果参照代码。找到了就打印“包含此元素,没找到就显示元素不存在。
案例2:
package com.java.demo_9;import java.util.ArrayList;
public class ArrLis
public static void main(String[] args)
ArrayList list =new ArrayList();
list.add("tony");
list.add("tom");
list.add("jack");
list.add("kevin");
for(int i=0;i<list.size();i++)
String result =(String )list.get(i);
System.out.println(result);
System.out.println("+++++++++++++++++++++++++++++++++++++");
ArrayList list1 = new ArrayList();
for(int i=0;i<list.size();i++)
String res = (String)list.get(i);
if(list.contains("kevin"))
list1.add("kevin");
System.out.println(list1);
break;
else
System.out.println("没找到该元素!");
break;
结果:
因为列表中中包含"kevin"这个元素所以返回值为该元素。如果列表中没有该元素返回值为“没有找到该元素!”。
注意事项:我是重新设定了一个新空ArrayList(list1)。目的就是为了如果找到该值把这个值直接放到新的ArrayList中。另外if,else用了2次break。就是只要找到或者没找到就退出的意思。如果不这么写那么for循环每找一次结果就会打印一次,这显然是不必要的。
set(int index, E element)
用指定元素替换列表中指定位置的元素(可选操作)。 参考技术C A test = new A();
test.a = 1;
test.b = 1;
List list = new ArrayList();
list.add(test);//加到List里
A test2 = (A) list.get(0);// 取出
test2.a = 2;
test2.b = 2;// 这样就行了 参考技术D ArrayList()中存放的只是对象的引用,如果你将A存到ArrayList(),然后修改A的值,ArrayList()中存放的值就会自动转变。
如果有A的引用可以直接这么写 A.a=你需要的值
如果不知道 可以通过ArrayList().get(indexof(A))取得A的引用,然后修改属性
Java:没有来自外部类的 ArrayList 修改
【中文标题】Java:没有来自外部类的 ArrayList 修改【英文标题】:Java: No ArrayList modifications from outside classes 【发布时间】:2015-02-22 11:55:57 【问题描述】:我在我的 Java 项目的一个类中使用了 ArrayList。该类跟踪列表是否已更改,并提供公共方法来添加和删除自动将变量设置为“已更改”的列表中的元素。
到目前为止,该列表是公开的,因为我希望我的列表在任何地方都可以公开阅读。但我只希望拥有列表的类能够修改它。所以没有来自外部类的修改。那可能吗?如果有,怎么做?
通常对于访问控制,您可能会使用 getter 和 setter 方法。但即使使用 getter 方法并将列表设置为私有,另一个类仍然可以执行getList().remove(element)
,从而从外部修改列表,而不会注意到列表已更改。
【问题讨论】:
只通过公共函数提供所有需要的功能,完全封装内部数据结构。所以写你自己的删除函数。 【参考方案1】:将您的 ArrayList 字段设为私有,但让您的 getter 返回 Collections.unmodifiableList(list)
,这会提供不可修改的视图。
这将允许外部代码将其视为普通列表,使用 for each 循环等,但将禁用修改操作。此外,unmodifiableList 会在恒定时间内返回一个视图。
这实际上就是它设计的确切用例。 Javadoc:
此方法允许模块为用户提供对内部列表的“只读”访问权限。对返回列表的查询操作“通读”到指定列表,并尝试修改返回列表,无论是直接还是通过其迭代器,都会导致 UnsupportedOperationException。
【讨论】:
【参考方案2】:将您的 List 设为私有并添加 getter 方法:
public List getList()
return new ArrayList(yourPrivateList);
【讨论】:
【参考方案3】:您可以将ArrayList
成员设为私有,而不是返回ArrayList
的getter,而是使用一个接受索引i
并返回ArrayList
的第i
'th 元素的getter。
public class Test
private List<String> list = new ArrayList<String>();
public getString (int i)
// you might want to add some validation of i here
return list.get(i);
getString
允许您的类的用户访问列表中的任何元素,而无需对其进行修改。
如果您想让您的用户在不修改列表的情况下迭代列表,您可以添加一个 getSize()
方法来返回列表的大小(这将允许用户使用常规 for 循环),或者你的类可以实现Iterable
(不支持删除操作)。
【讨论】:
【参考方案4】:你有几个选择:
返回 ArrayList 的 getter 可以在返回对象之前进行克隆。这样,即使外部实体修改了对象,他们最终也会修改克隆 - 而不是您的原始对象。注意:克隆操作可能代价高昂。我建议使用以下选项。 使用Collections.unmodifiableList(..)
。 Check the documentation here.
或者正如其他答案所建议的那样:推出自己的访问和迭代方法。
【讨论】:
【参考方案5】:我认为您最好的选择是保留您的 List
private 并添加一个 getter 方法,该方法返回 List
的副本,而不是 List
本身。例如:
public class EncapsulationTest
private List<Object> privateList = new ArrayList<Object>();
// Your constructors and methods to track list
// modification here ...
public List<Object> getList()
// Maybe you need a null check here
return new ArrayList<Object>(privateList);
public void addElement(Object newElement)
this.privateList.add(newElement);
// Set your 'changed' variable to true
public void removeElement(Object element)
this.privateList.remove(element);
// Set your 'changed' variable to true
如果您这样做,您仍然可以阅读List
的精确副本,但不能修改List
本身。嗯,其实你可以修改返回的List
,但是因为是不同的对象,所以修改不会影响你对象的List
。
希望对你有帮助。
【讨论】:
Thrustmaster 在他的回答中提到归还克隆的成本很高。我在启发式中使用列表,其中运行时是最重要的,并且对这些(大)列表的迭代很频繁。以上是关于在Java中怎么修改ArrayList()中元素的值?的主要内容,如果未能解决你的问题,请参考以下文章