请帮助我下面的代码,我得到相同的输出,即使改变值
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
值9未更新。
你说你要改变第一个元素的值;
x = Integer.valueOf(9);
您将x
更改为指向一个全新的整数,但不再使用它。你不会以任何方式改变收藏。
由于您正在使用ArrayList,如果您想要一个允许您更改元素的迭代器,您可以使用ListIterator,这是需要更改的代码片段;
//初始化迭代器
listIterator
//如果(i.hasNext()){
//新建迭代器,并打印所有元素
iterator iter=a.iterator()
while(iter.hasNext())
可悲的是,同样的情况不能扩展到其他集合,如Set
使用set方法将旧值替换为新值。
list.set( 2, "New" );
列表维护的是对存储在列表中的原始值的对象引用。因此,当您执行这一行时:
Integer x = i.next();
x
和列表都存储了对同一对象的引用。但是,当您执行:
x = Integer.valueOf(9);
列表中没有任何变化,但是x
现在正在存储对不同对象的引用。列表没有变化。您需要使用一些列表操作方法,例如
list.set(index, Integer.valueof(9))
注意:正如其他人所建议的,这与intger
的不可变性无关。这只是基本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);
}
}
}
这将打印:
[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]
问题内容: 我有10 秒之一。如何用另一个值更新索引? 问题答案: 让是和新的,那么就这样做: 可以在此处的Java api参考中找到。
问题内容: 我对Java编程还是很陌生,我正在尝试使用以下代码来更新an的现有值: 我想打印而不是打印,但得到的结果仍然是。我要打印。我怎样才能做到这一点?谢谢。 问题答案: 使用该方法将旧值替换为新值。
问题内容: 我想动态更新元素的文本: 我是jQuery的新手,因此对我来说,这项任务似乎非常具有挑战性。有人可以指出我要使用的功能/选择器吗? 如果可能的话,我想在不为需要更改的文本添加新容器的情况下执行此操作。 问题答案: 在Javascript中,该属性为您提供元素的所有子节点,包括文本节点。 因此,如果您知道要更改的文本始终是元素中的第一件事,那么请给出以下HTML: 您可以这样做: 当然,
问题内容: 如果我有跨度,请说: 如何使用JavaScript将“ hereismytext”更改为“ newtext”? 问题答案: 对于现代浏览器,您应该使用: 尽管较旧的浏览器可能不知道,但不建议使用,因为当用户输入新文本时,它会引入XSS漏洞(有关更多详细讨论,请参见下面的其他答案):
问题内容: 我有一个键为数字值的形式的关联数组,但是它不是顺序的数字值。密钥实际上是一个ID号,而值是一个计数。这在大多数情况下都很好,但是我想要一个函数,该函数获取数组的可读名称并将其用于键,而不更改值。 我没有看到执行此操作的函数,但是我假设我需要提供旧键和新键(我都拥有)并转换数组。有有效的方法吗? 问题答案:
此外,我尝试以以下方式使用对象标记: 但是,同样,如果我用CSS指令或将类应用到对象标记,则不会发生任何变化。有什么想法可以实现我想要的吗?