Java 数组比ArrayList更可序列化?

Java 数组比ArrayList更可序列化?,java,performance,Java,Performance,不久前,我们的架构师将这笔资金交给了我,当时我无法与他进一步交谈以了解细节,但我无法理解数组如何比ArrayLists更具序列化性/更好的性能 <sample-array-list>reddy1</sample-array-list> <sample-array-list>reddy2</sample-array-list> <sample-array-list>reddy3</sample-array-list>

不久前,我们的架构师将这笔资金交给了我,当时我无法与他进一步交谈以了解细节,但我无法理解数组如何比
ArrayList
s更具序列化性/更好的性能

  <sample-array-list>reddy1</sample-array-list>
  <sample-array-list>reddy2</sample-array-list>
  <sample-array-list>reddy3</sample-array-list>
更新:这在web服务代码中很重要,可能是指性能而不是可序列化性

更新:对
ArrayList
s的XML序列化没有问题

  <sample-array-list>reddy1</sample-array-list>
  <sample-array-list>reddy2</sample-array-list>
  <sample-array-list>reddy3</sample-array-list>
reddy1
红色2
红色3

分布式应用程序中是否存在问题?

它们都序列化相同的数据。因此,我不会说其中一个比另一个好得多。

没有“更可序列化”这回事。类可以序列化,也可以不序列化。数组和ArrayList都是可序列化的

至于性能,这是一个完全不同的话题。数组,尤其是原语数组,使用的内存比ArrayList少很多,但是序列化格式实际上对这两种数组都同样紧凑


最后,唯一能够真正解释这一含糊和误导性陈述的人就是做出这一陈述的人。我建议您问问架构师他到底是什么意思。

也许他指的是Web服务中使用的XML序列化? 在几年前使用过这些之后,我记得返回
列表
对象的Web服务很难连接(至少我无法理解它,可能是因为
ArrayList
s和
LinkedList
s的内部结构),尽管这在返回本机数组时非常简单

为了回应雷迪的评论

但在任何情况下(数组或ArrayList) 将转换为XML,对吗

是的,它们会,但是XML序列化基本上将序列化对象中包含的所有数据转换为XML

对于数组,这是一系列值。 例如,如果您声明并序列化

int[] array = {42, 83};
您可能会得到如下XML结果:

 <array>42</array>
 <array>83</array
<firstIndex>0</firstIndex>
<lastIndex>2</lastIndex>
<E>42</E>
<E>83</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
可能最终看起来像:

 <array>42</array>
 <array>83</array
<firstIndex>0</firstIndex>
<lastIndex>2</lastIndex>
<E>42</E>
<E>83</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
<E>0</E>
0
2.
42
83
0
0
0
0
0
0
0
0

因此,基本上,在Web服务中使用XML序列化时,最好使用数组(如
int[]
)而不是集合(如
ArrayList
)。为此,您可能会发现使用
Collection#toArray()
将集合转换为数组很有用,我假设您正在谈论Java对象序列化

结果表明,数组(对象)和ArrayList具有相似但不完全相同的内容。在数组的情况下,序列化将由对象头、数组长度及其元素组成。在ArrayList情况下,序列化由列表大小、数组长度和数组的第一个“size”元素组成。因此,一个额外的32位int被序列化。各个对象标题中也可能存在差异

因此,是的,串行表示的大小有一个很小的差异(可能是4字节)。而且数组也有可能被序列化/反序列化 稍微快一点。但差异可能会在噪音中消失,不值得担心。。。除非评测等告诉您这是一个瓶颈

编辑


根据@Tom Hawtin的评论,对象头的差异非常显著,特别是当序列化只包含少量ArrayList实例时。

只有在Java中才会产生差异,即使这样也很难注意到


如果他不是指Java,那么是的,你最好的办法可能是问他这到底是什么意思。

据我所知,两者都是可序列化的,但使用数组更好,因为实现ArrayList的主要目的是为了便于内部操作,而不是暴露于外部世界。使用它稍微重一点,因此,在序列化它时在webservices中使用时,可能会在命名空间和标头中产生问题。如果它自动设置它们,则您将无法正确接收或发送数据。因此,最好使用基元数组

只是一个相关的想法:列表接口是不可序列化的,因此如果您想在可序列化的API中包含列表,则必须公开可序列化的实现(如ArrayList)或将列表转换为数组。良好的设计实践不鼓励公开您的实现,这可能是架构师鼓励您将列表转换为数组的原因。将列表转换为数组确实需要花费一点时间,但在另一端,您可以使用java.util.Arrays.asList()的列表接口包装数组,这很快。

我们都“喜欢”所谓的架构师。“数组和ArrayList都是可序列化的。”如果它们包含的类型实现了
Serializable
,即
ArrayList
的第一个序列化对象的开销会稍高。请注意
ArrayList
中的后备数组是瞬态的,它在
writeObject
方法中被序列化。@Reddy需要为
ArrayList
类指定一个描述符,用于命名类、字段、字段类型等。如果数据不多,那么这可能是消息中相对较大的一部分。是的,这在web服务中。但是在任何情况下(数组或arraylist)都会转换为xml…对吗?我在响应中使用了arraylist、HashMap并检查了xml。ArrayList没有额外的字段,HashMap作为空标记出现。红1红2红3哈,好笑。我想从那以后事情可能已经改变了,或者我的记忆不够准确。。。当我有机会使用NetBeans,看看会出现什么样的XML时,我会试一试。。。如果需要,我会编辑我的答案。“它们都序列化了相同的数据”-不完全是。。。看我的答案,我不同意。公开列表而不是数组没有什么错。。。如果那样的话