gpt4 book ai didi

java - 传递 Collections.unmodifiable* 一个已经用 Collections.unmodifiable* 包装的实例是多么低效?

转载 作者:搜寻专家 更新时间:2023-11-01 01:11:37 25 4
gpt4 key购买 nike

我有一些计件工作是由不同的自定义(源代码不可用)框架完成的,这些框架返回 Map 实例。不幸的是,这些框架在返回用 Collections.unmodifiableMap 包装的 Map 实例时并不一致。为了确保我的代码具有更高程度的不变性(以便更轻松地使用多线程),我刚刚对这些框架返回的任何内容统一调用了 Collections.unmodifiableMap。

Map<String, Record> immutableMap = framework.getRecordsByName();
//does this created a nested set of unmodifiableMap wrapper instances?
this.immutableField = Collections.unmodifiableMap(immutableMap);
.
.
.
Map<String, Record> maybeImmutableMap = framework.getRecordsByName();
//is there some means to get instanceof to work?
if (!(maybeImmutableMap instanceof Collections.UnmodifiableMap))
{
this.immutableField = Collections.unmodifiableMap(maybeImmutableMap);
}

我意识到我的这部分设计可能存在性能问题。在某些情况下,我正在调用 Collections.unmodifiableMap 向它传递一个实例,该实例已通过同一调用由框架包装。而且我的重新包装可能会导致在整个实例中进行额外的方法调用。

似乎使用“instanceof Collections.UnmodifiableMap”不起作用。如果我当前引用的 Map 实例是否需要包装,我找不到任何方法来检测(不包括使用反射,在这种情况下这不是一个选项 - 太慢了)。

问题:

    A) Collections.unmodifiableMap() 方法是否检查它是否传递了一个 UnmodifiableMap 的实例,如果是,则返回相同的引用(从而避免在调用该方法之前进行检查)?
    B) 为了主动避免收到修改异常,有没有办法查询一个 Map 实例(除了使用反射)来检测它是否可变(或不可变)?
    C) 如果 A 的答案是否定的,那么 JVM/HotSpot 是否有一些效率可以消除通过多个方法跳转调用以到达核心实例的开销?

最佳答案

据我所知:

  • A) 否
  • B) 否
  • C) 否

GuavaImmutable* 集合没有这个问题。如果使用本身就是 ImmutableListlist 调用 ImmutableList.copyOf(list),则返回参数本身。此外,您可以将它们称为(并使用 instanceof 检查)Immutable* 类型而不是接口(interface),从而很容易知道您是否拥有不可变实例或不是。因此,一种选择是将框架的结果复制到这些不可变集合中,并在您自己的代码中使用它们。 (它们还具有真正不可变的优势......不可修改的包装器允许它们包装的原始可变实例在某些东西引用它时自行发生变异。)

总而言之,我不会太担心通过 1 或 2 个不可修改的包装层传递方法调用可能产生的开销,只要您不打算以某种方式一次又一次地包装它们。正如其他人指出的那样,您不太可能会因此注意到性能问题。

关于java - 传递 Collections.unmodifiable* 一个已经用 Collections.unmodifiable* 包装的实例是多么低效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4127921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com