小编RBS*_*RBS的帖子

什么时候add()方法在集合中添加对象

我有两个问题.首先,请考虑以下代码.

public class Test{
    private static final List<String> var = new ArrayList<String>() {{
        add("A");
        add("B");
        System.out.println("INNER : " + var);
    }};

    public static void main(String... args){
        System.out.println("OUTER : " + var);
    }   
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,它给出了我的输出

INNER : null
OUTER : [A, B]
Run Code Online (Sandbox Code Playgroud)

任何人都可以详细说明为什么INNER在确定"A"和"B"添加到的时候为什么是null和执行collection

其次,我在上面的代码中做了一些修改并修改为一个以下(只是把add方法放在第一个括号内)

public class Test{
    private static final List<String> var = new ArrayList<String>() {
        public boolean add(String e) { 
            add("A");
            add("B");
            System.out.println("INNER : " + var); return true; 
        };
    };

    public static void main(String... args){ …
Run Code Online (Sandbox Code Playgroud)

java collections static arraylist

13
推荐指数
2
解决办法
633
查看次数

Lambda 表达式在运行时创建内部类

为了探索 lambda 及其工作原理,我编写了下面的代码。

public class Foo { // enclose class

public static void main(String[] args) {
    System.out.println(new Foo().new InnerFoo());
    IntSupplier intSupplier = () -> 42;
    System.out.println(intSupplier);
}

class InnerFoo{} // inner class

}
Run Code Online (Sandbox Code Playgroud)

执行代码后,我看到以下输出。

Foo$InnerFoo@3af49f1c
Foo$$Lambda$15/0x0000000840064c40@13221655
Run Code Online (Sandbox Code Playgroud)

我基本上有两个基于输出的问题。

  1. 据我所知,当每个内部类被实例化时,它可以表示为EnendingClass$InnerClass@hashcode as toString()(如果我们不重写 toString())。那么这是否意味着我的Foo$$Lambda$15/0x0000000840064c40@13221655是内部类的定义?如果是这样,那么加载的内部类在 JVM 中保留多长时间?
  2. $$Lambda的含义是什么。JVM将如何解释它?

java lambda java-8

2
推荐指数
1
解决办法
90
查看次数

标签 统计

java ×2

arraylist ×1

collections ×1

java-8 ×1

lambda ×1

static ×1