在Java ArrayList<E>
实现中基于对象数组。
谁能解释我为什么ArrayList<E>
使用数组Object[]
而不是数据存储的实现E[]
?使用有什么好处Object[]
?
在Java中,创建通用类型的数组并不容易。
简单的方法不能编译:
public class Container<E> {
E[] arr = new E[3]; // ERROR: Cannot create a generic array of E
}
替换E
为Object
,一切都很好(以容器实现中其他地方增加的复杂性为代价)。
有其他方法,但是它们呈现了一组不同的权衡。有关广泛的讨论,请参见如何在Java中创建通用数组?
问题内容: 实现接口。接口没有方法。当我检查它没有实现接口。 那么,在实现的意义何在? 问题答案: 没有方法的接口在Java中称为标记接口。 根据RandomAccess的JavaDoc: List实现使用的标记接口,指示 它们支持快速(通常为恒定时间)随机访问。 有关更多信息,请检查两个JavaDoc页面。 http://docs.oracle.com/javase/6/docs/api/jav
问题内容: 在中,我们具有接口List和类: 并扩展AbstractList和 我的问题:为什么ArrayList有该implements List条款? 如果,我们不能说吗? 问题答案: 是。可以省略。但是,这是一个立即可见List。否则,将需要额外单击代码/文档。我认为这就是原因-清晰。 并补充的评论-这是为了展示该工具。总体而言,这只是为了方便起见,并减少了List实现之间的代码重复。
问题内容: 为什么下面的代码抛出ConcurrentModificationException?JoshBloch可以避免ConcurrentModificationException。 问题答案: 使用“ for each”循环时,不能在列表上使用remove。相反,您可以使用此方法在迭代器上调用remove: 如果您实际上想用“ 200”代替每个值,或用其他值代替,则建立一个新列表可能更有意义
问题内容: 我正在阅读Java的ArrayList的源代码,并且遇到了它的支持数组声明: 为什么这需要是瞬态的?为什么不能对此类进行序列化? 谢谢您的帮助! 问题答案: 它 可以 被序列化; 该班只是需要照顾的事情本身,而不是使用默认的机制。查看该类中的和方法,它们是标准序列化机制的一部分。 如果您查看源代码,则会看到它不保存后备阵列。相反,它一次将元素(包括空值)序列化到最大限制。这避免了序列化
问题内容: 工具的实现以及扩展。但是在Java文档中,您可以看到AbstractList已经实现了List。那么实现List以及扩展AbstractList是否不是多余的? 我的第二个问题, 请看下面的代码: Arrays类的方法包含其自己的ArrayList实现。但这仅扩展AbstractList而未实现List。但是上面的代码可以编译。 但是将代码修改为以下内容时 我收到一个错误: 这是什么原
也许我没有看到什么或者我忘记了在计算运行时考虑的事情,所以请告诉我。