zoukankan      html  css  js  c++  java
  • 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,所以造成内存泄露;

  • 相关阅读:
    Android屏幕适配
    设计模式学习心得
    C语言中的作用域、链接属性与存储属性
    二级指针删除单向链表
    C++编程风格
    python中index、slice与slice assignment用法
    lua_pcall与lua_call之间的区别
    lua-C++ userdata使用
    lua中调用C++函数
    C++中为什么有时要使用extern "C"
  • 原文地址:https://www.cnblogs.com/silentdoer/p/12954988.html
Copyright © 2011-2022 走看看