Java中通过迭代器的对象分配

Java中通过迭代器的对象分配,java,Java,我有一段代码如下: HashSet<Object> Set = new HashSet<Object>(); //add elements to set 'Set' Object o = null; for (Iterator<Object> itr=Set.iterator();itr.hasNext();) { o = itr.next(); //doing some processing on o } 在Java中,在内存级别会发生什么

我有一段代码如下:

HashSet<Object> Set = new HashSet<Object>();
//add elements to set 'Set'
Object o = null;
for (Iterator<Object> itr=Set.iterator();itr.hasNext();) {
    o = itr.next();
    //doing some processing on o
}
在Java中,在内存级别会发生什么

下面是我的实际代码:

我正在做的是:我已经创建了一组类型为.AdjList的元素集,现在我想处理类型为.AdjList的每一个连续元素对,并在每次迭代期间将迭代器值分配给两个类型.AdjList变量T1和T2。但是T1和T2属性与迭代器的属性不匹配

p.S.Types.AdjList是一个HashMap

for (int i=0; i<numT; i++) {
        size = generator.nextInt(10)+1;
        T[i] = new Types().new AdjList(size);
}
HashSet<Types.AdjList> TSet = new HashSet<Types.AdjList>(); 
    for (int i=0; i<T.length; i++) {
        TSet.add(T[i]);
    }
Types.AdjList T1 = null, T2 = null;

for (Iterator<Types.AdjList> itr = TSet.iterator(); itr.hasNext();) {
        T1 = itr.next();
        if (T2 != null) {
            size1 = T1.adj.size();
            //size1 is returning 0, though T1.adj has some elements
            size2 = T2.adj.size();
            //do some processing on T1, T2 based on size1 and size2         
        }
        T2 = T1;
}

for(int i=0;i您的迭代不正确

你需要做什么


HashSet set = ...
Iterator _i = set.iterator();
while(_i.hasNext()) {
   Object o = _i.next();
}
从那里开始

还有,关于你的问题

o1=o2


内存没有任何变化。在java中,一切都是原语或类。所有类都驻留在堆中,因此o1=o2只是将指向o2的指针复制到变量o1上。如果o2是原语,它会将值(而不是指针)复制到o1中。java中不再使用迭代器:

我们用in

ArrayList<String> stringList = new ArrayList<String>();
// initialize it with code (not shown)
for (String s: stringList) {
   System.out.println("the current element is:" + s);
}
ArrayList stringList=新建ArrayList();
//用代码初始化它(未显示)
用于(字符串s:stringList){
System.out.println(“当前元素为:”+s);
}

您的代码没有问题,但可能需要一些清理

如果应用这些“最佳实践”编码标准:

  • 始终声明抽象类型(即Set而不是HashSet)
  • 为变量使用前导小写名称(设置未设置)
  • 尽可能使用“foreach”语法(无需直接使用迭代器)
  • 声明变量,使其具有尽可能小的作用域(o已过期)
您可以将代码重构为:

for (Object o : new HashSet<Object>(someSet)) {
    // doing some processing on o
}

t2是从哪里设置的?我觉得它总是空的,因此if语句永远不会执行。在那里放一个断点,看看会发生什么。

我需要创建对象o=new Object();在复制之前?请发布一个具体的例子,说明它出错了。这是一个通用方法还是您愿意分享您的对象定义?您对o对象做了什么处理?对我来说似乎很好。您如何确定属性不匹配?但在我在原始版本中编辑的实际代码中,大小返回0question@user1291492 &波希米亚人:我想问题不在于我的迭代方式。回答这个问题,这种迭代方式和你写的一样。一切都不是一个原语或类。都有对象和引用。嗨,SunKing2,欢迎使用stackoverflow!请在你的回答中尽量清楚,提问者可能不知道这一点“in”是foreach构造的一部分,“in”也不在代码中(因为它是
s
stringList
之间的冒号)。此外,即使是迭代器也有其用途,例如用于删除实例,因此说它们不再被使用是完全错误的。答案中的想法很好,但请尽量简洁。我在迭代器循环中指定了T2=T1。我想在通过TSet处理时使用两个连续的Types.AdjList。我假设赋值应该有效。不是第一次通过循环。第一次通过循环T2为空。
for (Object o : new HashSet<Object>(someSet)) {
    // doing some processing on o
}
for (Object o : someSet) { // Not sure why you wanted to make a new Set
    // doing some processing on o
}