番石榴ImmutableList ......究竟是什么支持它?

时间:2014-12-15 01:12:27

标签: java collections guava

我出于好奇而下载了Google Guava的源代码,以了解支持不可变集合的内容。

我正在浏览ImmutableList,我注意到它仍然由一个老式数组支持,如Object[]

所以我只是好奇,Object[]数组本质上可能是可变的,并且它不是线程安全的。我已经知道ArrayList和CopyOnWriteArrayList由Object[]数组支持,但它们是可变的。

因此,ImmutableList只能是不可变的和线程安全的,因为它的内部属性被很好地封装和保护了吗?它是不可变的还是线程安全的,因为封装确保在构造之后什么都不会修改它?是否有一天像这样的低级别数组将被更换为更好的而不是遗留的东西,并且本质上是不可改变的最终而不是通过仔细的封装而不可变?

1 个答案:

答案 0 :(得分:10)

是的,ImmutableList只是"只有"不可变的,因为它不允许修改其内部后备数组。

这与java.lang.String的情况完全相同,char[]也包含私有{{1}}。同样,非常有用的并发库主要是作为常规Java类实现的,仅依赖于极少数(和非常基本的)JVM同步原语。

所以这应该足够好了。显然,编写这些库类的人必须要小心并且知识渊博,但是这个要求并没有因为更多地移动代码而神奇地消失了#34;低级"到JVM原语。 (同意,你现在可以使用像伏眼般的反射来射击自己的脚,但这种情况很难发生,而且在常规使用中,用户土地"实施也同样有效。)

  

会不会有一天

这是纯粹的猜测。但显然有关于"值类型"的工作,这是一个相关的主题。