Java Set.size()不';t匹配迭代器中的元素数

Java Set.size()不';t匹配迭代器中的元素数,java,iterator,size,compiler-errors,Java,Iterator,Size,Compiler Errors,为什么Set.size()与集合迭代器中的元素数不匹配 我使用的是哈希集,我添加了一些重复的值。因为我使用了一套,所以这些重复项被自动消除了。Set.size()返回16。当我实际迭代元素时,得到13 是什么导致了这种差异?我做得对吗 Set set = new HashSet(); ... System.out.println ("Found " + set.size() + " tokens..."); Iterator it = set.iterator(); int i = 0; whi

为什么Set.size()与集合迭代器中的元素数不匹配

我使用的是哈希集,我添加了一些重复的值。因为我使用了一套,所以这些重复项被自动消除了。Set.size()返回16。当我实际迭代元素时,得到13

是什么导致了这种差异?我做得对吗

Set set = new HashSet();
...
System.out.println ("Found " + set.size() + " tokens...");
Iterator it = set.iterator();
int i = 0;
while (it.hasNext()) {
    i++;
    System.out.println(Integer.toString(i) + ": " + (String)it.next());
}
以下是控制台的输出:

Found 16 tokens...
1: 3 Months Free HD Extra Pack
2: Best Buy - $30 for 3 Months (Instant Rebate)
3: Gift Card - Fry's - $100 (HDTV Offer)
4: 6 Months FREE Showtime
5: 3 Months Free HD Access
6: Savings Certificate Booklet
7: 3 months FREE Showtime (rolls off month 4)
8: Free NASCAR Hotpass
9: 3 Months Free DVR Service
10: $0 Delivery & Handling
11: 1 Year Free Showtime
12: $99 Off Advance Equipment (2nd AP)
13: Best Buy - $30 for 12 Months (Instant Rebate)

因为您使用了反射:

Set set = new HashSet();

Field size = HashMap.class.getDeclaredField("size");
size.setAccessible(true);
Field map = HashSet.class.getDeclaredField("map");
map.setAccessible(true);
size.set(map.get(set), 16);

System.out.println("Found " + set.size() + " tokens...");

说真的,如果你使用的是标准哈希集而不是第三方哈希集,那么这是我能想到的得到这些结果的唯一方法。现在我无法想象您会使用反射来完成此操作,但却不理解结果,因此我假设您在告诉我们的某些事情上弄错了(例如,set实际上不是本地的,但可由另一个线程访问)。

因为您使用了反射:

Set set = new HashSet();

Field size = HashMap.class.getDeclaredField("size");
size.setAccessible(true);
Field map = HashSet.class.getDeclaredField("map");
map.setAccessible(true);
size.set(map.get(set), 16);

System.out.println("Found " + set.size() + " tokens...");

说真的,如果你使用的是标准哈希集而不是第三方哈希集,那么这是我能想到的得到这些结果的唯一方法。现在我无法想象你会使用反射来实现这一点,但却不理解你的结果,因此我假设你在告诉我们的某些事情上弄错了(例如,set实际上不是本地的,但可以由另一个线程访问)。

说真的,这是不可能的。HashSet是一个建立良好的类,它不可能存在您描述的bug。以下是实现这一目标的一些方法:

  • 像马克·彼得斯建议的那样,利用反射来摆弄布景
  • 您已导致在终止程序的第13个元素之后引发异常
  • 重写Set的行为以使其不一致
  • 您正在使用不同的集合打印总计和项目

说真的,这是不可能的。HashSet是一个建立良好的类,它不可能存在您描述的bug。以下是实现这一目标的一些方法:

  • 像马克·彼得斯建议的那样,利用反射来摆弄布景
  • 您已导致在终止程序的第13个元素之后引发异常
  • 重写Set的行为以使其不一致
  • 您正在使用不同的集合打印总计和项目

请展示一个简短但完整的程序来演示问题。我刚刚尝试了这个,但未能复制它。换句话说,发布一个,这样我们就可以复制“n”粘贴“n”运行它,而不需要任何代码更改。是否有其他线程可以访问哈希集?您是否重新定义了
hashCode()
equals()
compareTo()
?如果是这样,请显示他们的代码答案是什么?来吧,告诉我们。我们爱你。请展示一个简短但完整的程序来演示这个问题。我刚刚尝试了这个,但未能复制它。换句话说,发布一个,这样我们就可以复制“n”粘贴“n”运行它,而不需要任何代码更改。是否有其他线程可以访问哈希集?您是否重新定义了
hashCode()
equals()
compareTo()
?如果是这样,请显示他们的代码答案是什么?来吧,告诉我们。我们爱你。午饭后,我无法重现同样的问题。我的代码非常简单,我唯一的猜测是,我只是在滚动到输出的底部时遇到了一些问题。正如您从上面的输出片段中所看到的,我从来没有为输出的结尾设置过标记——所以我永远也不能确定——但我支持您的理论,即这是“用户错误”。谢谢。另一种可能性:您的集合可能包含一个“null”元素(哈希集合中最多可以包含一个“null”元素)。一些调试器不显示'null'元素,因此当您比较列表大小和元素时,您会看到特定的listSize,但在检查列表时只会看到listSize-1元素。午饭后,我无法重现相同的问题。我的代码非常简单,我唯一的猜测是,我只是在滚动到输出的底部时遇到了一些问题。正如您从上面的输出片段中所看到的,我从来没有为输出的结尾设置过标记——所以我永远也不能确定——但我支持您的理论,即这是“用户错误”。谢谢。另一种可能性:您的集合可能包含一个“null”元素(哈希集合中最多可以包含一个“null”元素)。有些调试器不显示'null'元素,因此当您比较列表大小和元素时,您会看到特定的listSize,但在检查列表时只会看到listSize-1元素。是的,这本可以做到,但我没有做到。谢谢你教我一种新的方法来搞糟我的程序。我肯定有一天我会不恰当地使用它;)是的,那会成功的,但我不是这么做的。谢谢你教我一种新的方法来搞糟我的程序。我肯定有一天我会不恰当地使用它;)