Java for/break是否比迭代器()更有效。next()?
众所周知,mapX中只有一个条目。代码度量工具抱怨在循环内部使用“break”,但通常,在这样一个小循环中,我会让它通过。但在这种情况下,由于知道只有一个条目,我不确定哪一个更有效 那么,当您知道映射将只包含一个元素时,以下哪项更有效 可能的替代品:Java for/break是否比迭代器()更有效。next()?,java,foreach,break,Java,Foreach,Break,众所周知,mapX中只有一个条目。代码度量工具抱怨在循环内部使用“break”,但通常,在这样一个小循环中,我会让它通过。但在这种情况下,由于知道只有一个条目,我不确定哪一个更有效 那么,当您知道映射将只包含一个元素时,以下哪项更有效 可能的替代品: Map.Entry<String,String> e = mapX.entrySet().iterator().next(); Y.setMsg(e.getValue()); Y.setMsgKey(e.getKey()); 就我个人
Map.Entry<String,String> e = mapX.entrySet().iterator().next();
Y.setMsg(e.getValue());
Y.setMsgKey(e.getKey());
就我个人而言,我觉得第一个变体更简洁。如果您正在使用,也可以这样写:
Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet());
if (!mapX.isEmpty()) {
Map.Entry<String,String> e = mapX.entrySet().iterator().next();
y.setMsg(e.getValue());
y.setMsgKey(e.getKey());
}
Map.Entry e=Iterables.getOnlyElement(mapX.entrySet());
就我个人而言,我觉得第一个变体更简洁。如果您正在使用,也可以这样写:
Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet());
if (!mapX.isEmpty()) {
Map.Entry<String,String> e = mapX.entrySet().iterator().next();
y.setMsg(e.getValue());
y.setMsgKey(e.getKey());
}
Map.Entry e=Iterables.getOnlyElement(mapX.entrySet());
这个
除了一个例外:循环首先在迭代器上调用hasNext()
前者更强烈地暗示只有一个元素(至少,只有一个您感兴趣)。后者说“我将循环所有元素…除了第一个元素之后我将停止。”如果不循环,为什么要使用循环
似乎非循环版本才是最合适的
除了一个例外:循环首先在迭代器上调用hasNext()
前者更强烈地暗示只有一个元素(至少,只有一个您感兴趣)。后者说“我将循环所有元素…除了第一个元素之后我将停止。”如果不循环,为什么要使用循环
似乎非循环版本是应该使用的版本。第一个版本比第二个版本快(带有“for”循环/“break”):
next()
之前调用hasNext()
中断处有一条额外的分支指令。。。虽然这是次要的,而且可能会被JIT编译器优化掉
当然,另一方面是,如果映射为空,则非循环版本的代码将抛出异常。如果您需要处理“空地图”案例,您应该这样写:
Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet());
if (!mapX.isEmpty()) {
Map.Entry<String,String> e = mapX.entrySet().iterator().next();
y.setMsg(e.getValue());
y.setMsgKey(e.getKey());
}
if(!mapX.isEmpty()){
Map.Entry e=mapX.entrySet().iterator().next();
y、 setMsg(e.getValue());
y、 setMsgKey(e.getKey());
}
第一个版本比第二个版本快(带有“for”循环/“break”):
next()
之前调用hasNext()
中断处有一条额外的分支指令。。。虽然这是次要的,而且可能会被JIT编译器优化掉
当然,另一方面是,如果映射为空,则非循环版本的代码将抛出异常。如果您需要处理“空地图”案例,您应该这样写:
Map.Entry<String,String> e = Iterables.getOnlyElement(mapX.entrySet());
if (!mapX.isEmpty()) {
Map.Entry<String,String> e = mapX.entrySet().iterator().next();
y.setMsg(e.getValue());
y.setMsgKey(e.getKey());
}
if(!mapX.isEmpty()){
Map.Entry e=mapX.entrySet().iterator().next();
y、 setMsg(e.getValue());
y、 setMsgKey(e.getKey());
}
两个都不用怎么样?如果只有一个条目,你为什么还要有地图?@azurefrog你从我嘴里说出了这句话。如果集合为空,替换是否仍然有效?如果你知道for循环无论如何只运行一次,为什么要中断它?为了避免额外的hasNext()
调用的高成本?生成keySet()
可能更昂贵。不使用这两种方法如何?为什么有地图,如果只有一个条目?@azurefrog你从我口中说出了这些话。如果集合是空的,替换是否仍然有效?如果你知道for循环无论如何只运行一次,为什么要中断它?为了避免额外的hasNext()
调用的高成本?生成keySet()
的成本可能更高。此外,循环版本还有一个额外的映射查找。如果它使用entrySet(),您的描述将是准确的。我没有注意到。。。fixedI本人更喜欢迭代器().next()版本,但不确定是否还有其他原因使用for循环。谢谢@EdwinWIterables.get(iterable,0)
优于iterable.iterator().next()
,如果您只需要第一个元素,因为它可以防止创建新的迭代器。不幸的是,Iterables
来自一个库,java没有从标准库提供它。@不幸的是,在这个项目中,除非有很多这样的消息问题,否则添加另一个库是不被接受的。此外,循环版本还有一个额外的映射查找。如果它使用entrySet(),您的描述将是准确的。我没有注意到。。。fixedI本人更喜欢迭代器().next()版本,但不确定是否还有其他原因使用for循环。谢谢@EdwinWIterables.get(iterable,0)
优于iterable.iterator().next()
,如果您只需要第一个元素,因为它可以防止创建新的迭代器。不幸的是,Iterables
来自一个库,而java并没有从标准库提供它