【问题标题】:Java Collections.unmodifiableList() time complexityJava Collections.unmodifiableList() 时间复杂度
【发布时间】:2014-08-12 17:38:40
【问题描述】:

我想知道Collections.unmodifiableList 的时间复杂度是多少?

如果我想让传入的Collection 不可变,最便宜的方法是什么?

【问题讨论】:

  • 可能是O(n)O(1)。您可以使用基准来找出它是哪一个。
  • O(1)。 Collections.unmodifiableList() 不会更改您的集合,只需将您的对象包装在一个类上,该类会在修改方法时引发异常
  • 是的,O(1),如果你对这些东西的实现方式感兴趣,可以看源码grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…

标签: java performance collections time-complexity


【解决方案1】:

我想知道Collections.unmodifiableList的时间复杂度是多少?

Collections.unmodifiableList 返回其参数列表的视图,而不是副本,因此它是 O(1)。这通常是您创建不可变列表的方式,但请确保不要更改原始可变列表,因为这些更改将反映在新创建的不可变列表中。如果您将原始列表保密,这应该不是问题。这就是我所说的情况:

List<String> modifiableList = new ArrayList<>();
List<String> unmodifiableList = Collections.unmodifiableList(modifiableList);

System.out.println(unmodifiableList);
modifiableList.add("hello");
System.out.println(unmodifiableList);
[] [你好]

这是因为unmodifiableListmodifiableList 的视图(而不是副本)。

【讨论】:

    【解决方案2】:

    哪些操作的时间复杂度?

    对于所有非修改操作,它将采用与底层数据结构相同的 O 表示法。

    对于所有修改操作,它可能会快一点(早期错误退出)。

    【讨论】:

      【解决方案3】:

      Collections.unmodifiableList 是使Collection&lt;&gt; 不可变的好方法。它还返回一个不可修改的包装器;它不会复制输入列表的内容。

      所以它不会减慢进程并且对于大型对象也很有效。

      【讨论】:

        【解决方案4】:

        Collections.unmodifiableList 是最便宜的不可变方式。

        它只是返回一个包装列表实现。

        它不会复制列表。

        它们会覆盖下面的方法,如下所示。

        public void add(int index, E element) {
            throw new UnsupportedOperationException();
            }
        public E remove(int index) {
            throw new UnsupportedOperationException();
            }
        

        所以如果有人尝试添加/删除,它会抛出异常。

        他们像下面这样覆盖 get 方法

        public E get(int index) {return list.get(index);}
        

        所以它只是委托实际的列表来获取。

        但它有一个缺点。

        List unmodifiable= Collections.unmodifiableList(list);
        

        unmodifiable.remove(0);

        它抛出异常。

        如果你改变了原来的列表,它也会反映在不可修改的地方。

        list.remove(0);

        它也会反映不可修改的列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-04
          • 2015-05-03
          • 2011-09-26
          • 2017-11-13
          • 1970-01-01
          • 1970-01-01
          • 2016-02-13
          相关资源
          最近更新 更多