【问题标题】:Java 8 - New objects are not created for lambdas unlike anonymous classes [duplicate]Java 8 - 与匿名类不同,不会为 lambdas 创建新对象 [重复]
【发布时间】:2016-01-28 05:09:54
【问题描述】:

我注意到与匿名类不同,在 lambda 的情况下不会创建新对象。有人可以帮我理解一下吗?

    //case 1: anonymous class
    for (int i = 0; i < 3; i++) {
        Runnable r = new Runnable() { @Override public void run() { System.out.println("blah");}};
        System.out.println("Anonymous: " + r.hashCode());
    }

    //case 2: lambdas
    for (int i = 0; i < 3; i++) {
        Runnable r = () -> System.out.println("blah");
        System.out.println("Lambda: " + r.hashCode());
    }

打印

Lambda: 1915503092
Lambda: 1915503092
Lambda: 1915503092
Anonymous: 1535128843
Anonymous: 1567581361
Anonymous: 849460928

【问题讨论】:

  • 您认为为什么应该返回新对象?
  • @the8472,我是 Lambdas 的新手,我的印象是它只是匿名类的语法糖。因此,我期望它应该创建新对象。显然,JVM 足够聪明,不会为无状态 lambda 创建多个对象。
  • 它们的代码大多类似于匿名内部类,但这并不意味着它们只是语法糖。你应该避免在未来做出这样的假设,还有其他细微的差异。
  • 我现在知道了。谢谢@the8472。

标签: java lambda java-8


【解决方案1】:

未指定优化 lambdas 时 JVM 的确切行为。 HotSpot JVM 通过为它们创建单例来优化无状态 lambda。

请参阅“lambda 表达式是否在每次执行时都会在堆上创建对象?”的答案。详情:https://stackoverflow.com/a/27524543/281469

【讨论】:

  • 谢谢。 Brian Goetz 在提供的链接中的评论回答了这个问题。
  • @bcoughlan 如果此问题与另一个问题重复,您应该投票将其作为重复问题关闭,而不是发布指向原始问题的链接作为答案。
  • 正确的说法应该是,HotSpot JVM 的 当前实现 为无状态 lambdas 创建了单例。未来的版本甚至可能将不同的等效 lambda 表达式折叠到一个实例中,甚至可以重用有状态的 lambda(当它们捕获的值相同时)。我们甚至可能会看到未来的版本不会创建单例,如果未来 JVM 中的值类型优化有望带来更多好处……
猜你喜欢
  • 1970-01-01
  • 2016-01-30
  • 2015-02-21
  • 2016-04-07
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
相关资源
最近更新 更多