双括号初始化(Double Brace Initialization, DBI)是Java中一种特殊的初始化集合(如HashMap)的方式。这种方式通过使用匿名内部类和实例初始化块,在创建集合的同时对其进行初始化。下面我将详细解释双括号初始化的概念、用途、语法,并提供一个示例代码,同时指出其限制和注意事项。 1. 双括号初始化的概念和用途 双括号...
如上所示,以 Person 作为父类的匿名类通过实例初始化块进行初始化。这不仅仅是为了说明双括号初始化的应用,更因为这是进行匿名类初始化的典型做法。 构造器是与类名同名的函数,而匿名类因为没有名字,所以也就没有构造器,为了达到与构造器实例化对象的效果,可以使用代码块来进行实例初始化操作。
可以看出,双大括号初始化的执行时间明显约为 190 毫秒。 同时,初始化执行时间为 0 毫秒。当然,应该考虑计时器分辨率,但很可能在 15 毫秒以下。ArrayList 因此,这两种方法的执行时间似乎存在明显差异。这两种初始化方法似乎确实存在一些开销。 是的,编译双大括号初始化测试程序生成了 1000 个文件。.classTest1 网友回...
这里利用了内部类语法,这种方式比先new出对象然后再进行依次add要方便、简洁许多。该方法称之为“双括号初始化”(double brace initialization)。 1、语法解读: 显然这是在HashMap的构造器中写了一个匿名内部类,这个匿名内部类含有一个实例初始化块,初始化块的内容是三个add()函数,向被初始化的this指向的HashMap中...
避免像这样,在 Java 中使用双括号初始化: new HashMap() {{put("key", value); 内存泄漏追踪 我最近正在 LeakCanary 看到了以下内存泄漏追踪信息: ┬───│ GC Root: Global variable in native code├─ com.bugsnag.android.AnrPlugin instance│ Leaking: UNKNOWN│ ↓ AnrPlugin.client│ ~~~├─ com...
双括号初始化的影响 简介 我们在开发中偶尔会遇到一些小伙伴使用双括号“{{}}”来进行map或者list的初始化,类似下面示例这样 示例 public class MapTest { Map<String,Object> map = new HashMap<String,Object>(){ { put("1","one"); } };
通过一次双括号的初始化我们其实就已经创建了一个新类型了!通过这种方式所生成的每一个新map,都会隐式地创建了一个无法重复使用的新类型。如果仅用一次的话也无可厚非。但如果在一个大型的应用中到处都充斥着这种代码的话,无形中会给你的类加载器增加了许多负担,你的堆会持有着这些类的引用。不信么?编译下上述...
使用双花括号初始化集合,可别这么干 Double Brace Initialization should not be used 前言 最近在修改sonar问题时,发现有人使用双花括号初始化集合,提示可能发生内存泄漏。这种初始化方式倒是见过,只知道是使用了匿名内部类,但没有意识到这个问题。 实测 A
首先,我们来看使用双花括号初始化的本质是什么?以我们这段代码为例:Map<String, String> map = new HashMap() {{ put("map1", "value1"); put("map2", "value2"); put("map3", "value3");}};这段代码其实是创建了匿名内部类,然后再进行初始化代码块。这一点我们可以使用命令 java...
利用双大括号初始化集合从效率上来说可能不如标准的集合初始化步骤。原因在于使用双大括号初始化会导致内部类文件的产生,而这个过程就会影响代码的执行效率。 首先查看不同初始化方式生成的.class文件 例如以下代码: public class Test1 { public static void main(String[] args) { ...