Java 对给定集合对象执行迭代时迭代器的意外输出
不应该是下面代码012345678的输出吗?当我运行它时,输出是02468。你能帮我理解一下吗Java 对给定集合对象执行迭代时迭代器的意外输出,java,collections,iterator,Java,Collections,Iterator,不应该是下面代码012345678的输出吗?当我运行它时,输出是02468。你能帮我理解一下吗 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class CollectionArray { public static void main(String[] args) { List<Integer> num = n
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionArray {
public static void main(String[] args) {
List<Integer> num = new ArrayList();
for (int i=0; i<10; i++) {
num.add(i);
}
//System.out.println(num);
int int1=9;
Integer in = new Integer(int1);
Iterator itr = num.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
if(itr.next()== in) {
itr.remove();
}
}
}
import java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
公共类CollectionArray{
公共静态void main(字符串[]args){
List num=new ArrayList();
对于(inti=0;i代码中有几个错误,我将在下面列出它们
在打印System.out.println(itr.next());
您正在使用值9
创建新的Integer
对象,并比较它们的引用而不是值,结果返回false
例如:下面的i1
和i2
是两个具有相同值的Integer
对象,但它们是指向不同引用的两个不同对象。因此=
运算符返回false
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1==i2); //false
因此,您可以简单地使用equal
来比较Integers
对象中的值,并且仅在equal
不等于9
时,使用else
块打印值
代码:
int int1=9;
Integer in = new Integer(int1); //don't use like this, it is deprecated and no need of it
Iterator<Integer> itr = num.iterator();
while(itr.hasNext()) {
Integer res = itr.next();
if(res.equal(in)) {
itr.remove();
}else {
System.out.println(res);
}
}
Iterator<Integer> itr = num.iterator();
while(itr.hasNext()) {
Integer res = itr.next();
if(res.equals(int1)) { // or == operator will work for primitive int types
itr.remove();
}else {
System.out.println(res);
}
}
您的代码中有几个错误,我将在下面列出它们
在打印System.out.println(itr.next());
您正在使用值9
创建新的Integer
对象,并比较它们的引用而不是值,结果返回false
例如:下面的i1
和i2
是两个具有相同值的Integer
对象,但它们是指向不同引用的两个不同对象。因此=
运算符返回false
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1==i2); //false
因此,您可以简单地使用equal
来比较Integers
对象中的值,并且仅在equal
不等于9
时,使用else
块打印值
代码:
int int1=9;
Integer in = new Integer(int1); //don't use like this, it is deprecated and no need of it
Iterator<Integer> itr = num.iterator();
while(itr.hasNext()) {
Integer res = itr.next();
if(res.equal(in)) {
itr.remove();
}else {
System.out.println(res);
}
}
Iterator<Integer> itr = num.iterator();
while(itr.hasNext()) {
Integer res = itr.next();
if(res.equals(int1)) { // or == operator will work for primitive int types
itr.remove();
}else {
System.out.println(res);
}
}
这是因为您在循环中调用了两次迭代器,导致跳过元素。您应该重构代码,只调用一次next,以获得预期的输出,如下所示
while(itr.hasNext()) {
int num = itr.next();
System.out.println(num);
if(num == in) {
itr.remove();
}
}
这是因为您在循环中调用了两次迭代器,导致跳过元素。您应该重构代码,只调用一次next,以获得预期的输出,如下所示
while(itr.hasNext()) {
int num = itr.next();
System.out.println(num);
if(num == in) {
itr.remove();
}
}
由于该语句System.out.println(itr.next());
您跳过了元素。
而=用于参考比较,而不是内容比较。因此,您的if块从未执行,并且9从未被删除。您应该执行以下操作:
Iterator<Integer> itr = num.iterator();
while(itr.hasNext()) {
Integer val = (Integer) itr.next();
if(val.equals(in)) {
itr.remove();
}
}
Iterator itr=num.Iterator();
while(itr.hasNext()){
整数val=(整数)itr.next();
如果(值等于(英寸)){
itr.remove();
}
}
因为这条语句System.out.println(itr.next());
您跳过了元素。
而=用于参考比较,而不是内容比较。因此,您的if块从未执行,并且9从未被删除。您应该执行以下操作:
Iterator<Integer> itr = num.iterator();
while(itr.hasNext()) {
Integer val = (Integer) itr.next();
if(val.equals(in)) {
itr.remove();
}
}
Iterator itr=num.Iterator();
while(itr.hasNext()){
整数val=(整数)itr.next();
如果(值等于(英寸)){
itr.remove();
}
}