Silentdoer

导航

Java闭包和双花括号初始化等总结

一、Java闭包并不是说只能通过lambda表达式或者匿名类对象来产生,比如() -> {print(outVar);}或new Runnable() {@Override public void run() {print(outVar);}},通过静态块也是能产生闭包的,如new HashMap<String, String>() {{put(outVar, "sf");}}

【闭包的概念不同人有不同理解,不同编程语言也有不同的说法,但是在Java里是存在多种闭包形式的,闭包是一个捕获了外部变量的一个代码块(非赋值属性的方式)】

二、用双花括号创建的对象是可能造成内存泄露(一些内存得不到释放),比如:

public class UTest {
private Map<String, String> map = new HashMap<String, String>() {
    {
    put("sfd", "sfjkl");
    }
}
}

上面的代码会产生一个UTest$1这样一个非static匿名内部类,是HashMap的子类(如果将创建匿名内部类UTest$1的代码弄到UTest的方法里,这个方法如果是static的则UTest$1是static匿名内部类,是实例方法则UTest$1是普通匿名内部类)

这个代码之所以会造成内存泄露是因为普通匿名内部类拥有外部类的引用,因此UTest对象t引用了map,而map又引用了t,所以造成内存泄露;

posted on 2020-05-25 09:28  Silentdoer  阅读(463)  评论(0编辑  收藏  举报