当前位置: 主页 > 54.hk赛马会 >

54.hk赛马会

无敌猪哥主论坛Java 单例列表对比:Collections::

发布时间:2019-10-10

  如何在Java中获取一个类型为 T 的单个对象,并转换为单元素ListT?

  一种方法实例化List然后添加对象,例如ArrayList或LinkedList,但是这样做有意思吗?机智的开发人员肯定要用一行代码搞定。好消息是JavaSE提供了很多方法,只需要一行代码就能解决这个问题。

  (这里不介绍所谓“双括号”实例化方法,因为即使只用一条赋值语句,实际上也是两行代码:一行实例化匿名List子类型,另一行在初始化代码块中添加对象)

  希望进一步节省代码的开发者能会想到Arrays::asList工厂方法。这个方法从Java 1.2起就一直存在。

  然而这种方案并不可取。asList方法只接收varargs参数,这意味着item参数创建列表之前就已经包装为数组。用这种方法创建的List类型是ArrayList,这并不奇怪。但实际得到的类型可能不是java.util.ArrayList,而是java.util.Arrays$ArrayList私有类,两者有以下区别:

  Java 8中Stream API提供了更多创建单项列表的方法,尽管使用的方法更不直观:

  无论采用哪种collector,这种方法都不可取。因为除了创建List之外还创建了一个StreamCollector和Collector。只有前者才是我们真正唯一关心的事情。

  Java 9中增加了一个很棒的API,List::of。接受一个或多个参数,返回一个包含这些参数的List。乍一看似乎和Arrays::asList没什么区别。但是仔细检查后您会注意到,List::of方法支持不同数量的参数,包括下面讨论中的元素:

  List::of支持从一到十个固定数量的命名参数,所有这些都是为了避免使用varargs数组。如您所料,余下的List::of方法接受varargs参数,处理极少数情况下列表中包含11个甚至个更多item。

  此外,如果需要增加item,只要向List::of中加入参数,无需改用其他方法。

  尽管Collections::singletonList明确表明返回的列表仅包含一个item,但List.of(item)的返回值也很清楚:“返回包含此item的一个列表。”在我看来,这样读起来很自然。

  实际上,结果是一个list这个事实比列表中只有一个item更重要。List::of突出了这个信息,而Collections::singletonList一直看到最后四个字母才解除了我们的疑惑。

  Arrays::asList 返回值类型是可变的;可以修改返回值(同时会更改传给工厂方法的数组值),但不能添加或删除item调整大小。

  ArrayList和LinkedList也有类似问题。List::sort的JavaDocs声称:“如果指定的comparator参数为null,则列表中所有元素都必须实现Comparable接口”。真的是这样吗?那为什么下面这段代码能正常工作呢?

  我不太确定java.util.ImmutableCollections$List12多出来的77个实例来自哪里,但是用字节数除以实例个数会发现,每个类实例恰好占用了24个字节。鉴于每个list都包含对一个item引用,这很有意义。64位JVM上的每个类占用12个字节(禁止压缩OOP),每个引用消耗8个字节,总共20个字节。当填充到接近8的倍数时,会达到24个字节。

  使用JMH创建一个基准测试,检测目前为止使用上述所有方法创建列表的平均时间和吞吐量:

  下一个Arrays::asList,速度大约是它的两倍,吞吐量是它的60%。相比之下,Stream API提供的两种方法测试结果非常糟糕。

  Collections::singletonList和List::of都是创建单元列表的绝佳选择。无敌猪哥主论坛!如果使用的Java版本支持这两种方法(Java 9及更高版本),我建议使用List:of,因为它使用方便、代码可读性强且不可变性更好。返回搜狐,查看更多



友情链接:

静心阁,559955.com,赛马会,赛马会总部,赛马会单双资料,54.hk赛马会,港彩赛马会免费资料,香港赛马会唯一官方网。

正版挂牌| 天线宝宝论坛| 开奖直播| 天空网| www.41ok.com| 诸葛亮心水| www.84498.net| 黄大仙论坛| 九龙彩色图库| 香港六合彩网址| www.21108.com| 现场直播|