当前位置: 首页 > 网络应用技术

不要创建这样的集合!非常容易记忆泄漏!

时间:2023-03-07 00:22:36 网络应用技术

  因为Java语言收集框架(诸如列表,地图,集合等)没有提供任何简单的语法结构,这使得在构建恒定集合时使工作非常串连。我们必须确定它,我们必须做:

  1.定义一个空集变量2. 2.将元素一一添加到此绑定类3.将集合作为参数传递给方法

  例如,将设定变量传递给方法:

  这种写作方式有些复杂。有一种简单的方法吗?

  实际上,有一种相对简洁的方式,即两个括号语法()建立并初始化了一个新集合:

  同样,创建和初始化哈希图的语法如下:

  不仅可以以这种方式创建和初始化JDK中的集合类。

  当我们使用此双括号语法来初始化集合类时,在编译Java文件时,我们可以找到一个奇怪的现象,并使用Javac来编译Doublebracetest:

  我们会发现获得两个类文件:

  经验丰富的朋友可能会在看到这两个文件时就知道,并且必须在其中使用匿名的内部类。

  是的,使用此双括号的效果是创建匿名的内部类。创建的类具有隐藏的指向外部类的指针。

  首先,以此形式创建和初始化一个集合会导致创建许多内部类。因为每次使用双括号初始化时,都会生成一个新类。就像以下示例:

  这将导致创建许多内部类:

  这些内部类是由类加载程序创建和需要加载的,这带来了一些其他开销。

  如果您使用上述代码在方法中创建和初始化映射,并从方法返回地图,则该方法的呼叫者可以容纳无法在垃圾中收集的资源。

  我们试图通过调用getMap来获取通过双括号初始化的地图

  返回映射现在将包含对DoubleBraceTest实例的引用。阅读器可以尝试通过调试或以下方式确认这一事实。

  许多人使用双括号来初始化该系列,这主要是因为他更方便,并且可以在定义该系列的同时初始化他。

  但是实际上,已经有很多解决方案可以这样做,而且无需使用这种风险解决方案。

  在我们要初始化列表时,使用数组工具类,可以使用数组类。阵列提供了向列表转换为列表的ASLIST:

  但是,应该注意的是,Aslist只是一个内部类数组,即原始数组的视图列表,因此,如果将其添加和删除,它将报告错误。

  StreamStream的使用是Java提供的新功能。他可以在流中刻录,排序和汇总中间操作(中间操作),最后通过最终操作获得上一处理的结果。

  我们可以使用流来初始化集合:

  许多带有第三方工具的第三方收集工具类可以实现此功能,例如Guava等:

  关于番石榴中定义的不变集合,我们将稍后详细介绍

  实际上,Java 9的构建方法实际上,在Java 9中,初始化方法是在集合类中构建的,例如列表和地图。例如,列表包含12个已退休的方法,这就是这样做的:

  作者:霍利斯(Hollis)是一个独特追求编码的人,阿里巴巴技术专家,“三类程序员”联合作者,“ Java Engineer's to God的道路”系列文章。