首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效利用Collections.unmodifiable*()

有效利用Collections.unmodifiable*()
EN

Stack Overflow用户
提问于 2014-05-29 06:13:20
回答 2查看 149关注 0票数 2

在考虑效率、代码可读性和其他标准时,有什么更好的方法来公开集合的只读视图?从效率的角度来看,使用methodA而不是methodB有什么真正的区别吗?请考虑在gui表的数据模型中可能经常访问list的情况。

我假设Collectionss.umodifiebleList()总是创建一个新的对象,这是正确的吗?

代码语言:javascript
复制
class A{
    List<Object> list = new ArrayList<Object>();
    List<Object> listReadOnly = Collections.unmodifiableList(list);

    List<Object> methodA(){
        return listReadOnly;
    }

    List<Object> methodB(){
        return Collections.unmodifiableList(list);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-29 06:17:31

是的,Collections.unmodifiableList每次都会创建一个新对象--但这是一个相当便宜的操作。(它没有太多的工作要做。)

我不确定GUI的数据模型是否会一次又一次地获取集合--它显然会获取集合,然后迭代它,但这是另一回事。

如果它只是在每次数据发生变化的时候获取一个集合,那么这种情况将很少发生,我认为--而不是在“几十万次每秒”的范围内,这将是一个瓶颈。我希望无论代码调用什么,这可能比创建不可修改的列表所做的工作要多得多。

基本上,这就像是一个过了头的微优化,除非你已经有证据证明它引起了问题。一如既往,你应该:

  • 定义性能要求
  • 以最简单的方式编写符合其他要求的代码。
  • 编写测试以检查您是否满足了性能要求
  • 如果您目前没有满足这些要求,请仔细确定瓶颈所在(无论是使用分析器还是其他技术)。
  • 以尽可能少的可读性损失来解决这些瓶颈。
  • 泡沫,冲洗,重复
票数 10
EN

Stack Overflow用户

发布于 2014-05-29 06:21:11

不要执行methodA,因为您必须在列表之间维护状态,这在多线程环境中是很棘手的,即使在单线程环境中也是很痛苦的。

执行methodB,让JDK整理效率(它非常快)。

注意:除非列表中的元素本身是不可变的,否则methodB并不是完全安全的,因为虽然列表可能是不可修改的,但它的元素本身可能是修改的。考虑:

代码语言:javascript
复制
List<Date> list = new ArrayList<Date>();
list.add(new Date());
List<Date> dates = Collections.unmodifiableList(list);
Date date = dates.get(0);
date.setTime(0);  // The date in the original list has now changed!
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23926872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档