为了账号安全,请及时绑定邮箱和手机立即绑定

Java 如何处理在 for 循环中使用 getter 的情况?

Java 如何处理在 for 循环中使用 getter 的情况?

MMTTMM 2021-12-01 17:15:30
例如,如果我有以下 for 循环声明。for(Foo f : fooService.getFooList()){}首先调用getter并将其分配给临时对象是否更有效,List<Foo> fooList = fooService.getFooList();还是可以使用内联getter?
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

在这种特定情况下,使用 foreach 循环,我希望您的代码将编译为如下所示:


Iterator<Foo> it = fooService.getFooList().iterator();

while (it.hasNext()) {

    Foo foo = it.next();

    // ...

}

所以在这种情况下,它没有区别。


但是,如果您要使用不同类型的循环,则可能会有所不同。例如:


for(int i = 0; i < fooService.getFooList().size(); i++){

    Foo foo = fooService.getFooList().get(i);

    // ...

}

如果您的列表暴露于外部修改,那么编译器不太可能证明列表大小不会改变,因此它将调用getFooList().size()每次迭代来与 进行比较i,因此会稍微增加一些开销。


但请注意,如果列表大小发生变化,则会i < fooService.getFooList().size()反映这一点。如果您意识到这一点,这可能很有用,但如果您不知道,则很危险。


如果您知道列表大小不会改变,那么您可以执行以下操作来消除该开销(或者,Iterator如果不需要索引,则只需使用或增强的 for-each 循环):


List<Foo> fooList = fooService.getFooList();

final int fooListSize = fooList.size();

for(int i = 0; i < fooListSize ; i++){

    Foo foo = fooList.get(i);

    // ...

}

尽管如此,与微观优化相比,您可能更喜欢可读性。


但是,如果您的应用程序对运行时敏感,并且您的列表很大并且这些小检查正在累加,那么您可能想要执行上述操作。


查看完整回答
反对 回复 2021-12-01
?
Qyouu

TA贡献1786条经验 获得超11个赞

首先分配给 List 引用并不是更有效,但是根据您要执行的操作,拥有该引用可能很有用。


查看完整回答
反对 回复 2021-12-01
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

如果您担心的是获得每个价值的fooService.getFooList()调用n时间,请f忽略该想法。这将调用getFooList()一次并迭代其结果。


例如在以下代码段中:


class Ideone

{

    private static List<String> list = Arrays.asList("A", "B", "C");


    public static void main (String[] args) throws java.lang.Exception

    {

        for(String f : getFooList()){

           System.out.println(f);

        }

    }


    private static List<String> getFooList() {

        System.out.println("getFooList called");

        return list;

    }

}

getFooList called仅打印一次,这表明该方法getFooList()仅被 for 循环调用一次。之后,打印A, B, C,对从方法调用获得的元素进行迭代。


所以,在效率方面,它是相同的直接调用吸气剂或将其分配给一个变量,并利用该用于执行迭代。


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信