我有一个 Iterable<MyRecord> records . 我遍历下面这样的记录,并将其添加到linkedlist中,如下所示。for (MyRecord record: records){ sortedList.addLast(record); }我的iterable有3条记录,都有不同的值。但最后虽然 sortedList 包含3条记录,三条都一样!!!。怎么会?当我打印出内存位置时,3个都是一样的。我做错什么了?
Iterable<MyRecord> records
for (MyRecord record: records){ sortedList.addLast(record); }
sortedList
z31licg01#
如果sortedlist包含相同的记录,这是原始记录中的最后一个元素,那么迭代器有可能重用tmp引用。你需要检查“记录”的执行情况。
jecbmhm32#
实际上,你的评论揭示了为什么这会出错的缺失环节。您正在hadoopMap器或reducer中使用它。hadoop的诀窍在于,它重用了您正在获取的对象,这样就可以轻松地使用垃圾收集器。因此,您所要做的就是为源iterable(源iterable)中的每个对象创建一个副本 MyRecord s) ,并将其添加到linkedlist中。
MyRecord
t3psigkw3#
将项目添加到列表时,请选中:
if(sortedList.contains(record)) { System.out.println("Record is already available "+record); } else { sortedList.addLast(record); }
您将了解问题是由于相同的记录还是其他原因造成的。
ehxuflar4#
你的问题很清楚,代码也很清楚(同样在阅读评论之后);这可能没有帮助,但您可以在添加之前执行一个包含检查,如: if (sortedList.contains(record)) sortedList.add... 我承认这可能没有真正的帮助(我也不知道是否包含对引擎盖下的元素内存位置的检查,因为我猜它可能只会使用 equals ).
if (sortedList.contains(record)) sortedList.add...
equals
4条答案
按热度按时间z31licg01#
如果sortedlist包含相同的记录,这是原始记录中的最后一个元素,那么迭代器有可能重用tmp引用。你需要检查“记录”的执行情况。
jecbmhm32#
实际上,你的评论揭示了为什么这会出错的缺失环节。您正在hadoopMap器或reducer中使用它。hadoop的诀窍在于,它重用了您正在获取的对象,这样就可以轻松地使用垃圾收集器。因此,您所要做的就是为源iterable(源iterable)中的每个对象创建一个副本
MyRecord
s) ,并将其添加到linkedlist中。t3psigkw3#
将项目添加到列表时,请选中:
您将了解问题是由于相同的记录还是其他原因造成的。
ehxuflar4#
你的问题很清楚,代码也很清楚(同样在阅读评论之后);这可能没有帮助,但您可以在添加之前执行一个包含检查,如:
if (sortedList.contains(record)) sortedList.add...
我承认这可能没有真正的帮助(我也不知道是否包含对引擎盖下的元素内存位置的检查,因为我猜它可能只会使用equals
).