共同学习Java源代码--数据结构--ArrayList类(七)

    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException{
        // Write out element count, and any hidden stuff
        int expectedModCount = modCount;
        s.defaultWriteObject();


        // Write out size as capacity for behavioural compatibility with clone()
        s.writeInt(size);


        // Write out all elements in the proper order.
        for (int i=0; i<size; i++) {
            s.writeObject(elementData[i]);
        }


        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }

    }

这个方法是在序列化本ArrayList时调用的,首先获取modCount,赋值到一个expectedModcount里。

然后调用参数输出流的defaultWriteObject方法,这个方法是将非静态非transient的属性写到流中的方法。

然后将size变量写入流中,为的是和clone方法行为兼容(我也不理解这句注释是什么意思)

然后挨个写每一个元素

最后检查modCount和expectedModcount是否一致,否则抛出并发异常。

private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        elementData = EMPTY_ELEMENTDATA;


        // Read in size, and any hidden stuff
        s.defaultReadObject();


        // Read in capacity
        s.readInt(); // ignored


        if (size > 0) {
            // be like clone(), allocate array based upon size not capacity
            ensureCapacityInternal(size);


            Object[] a = elementData;
            // Read in all elements in the proper order.
            for (int i=0; i<size; i++) {
                a[i] = s.readObject();
            }
        }
    }

这是序列化输入的方法,首先现将底层数组置空。

然后调用输入流的defaultReadObject方法,读取本类非静态非transient的属性。然后读取长度。如果长度大于0,就先扩容,再将底层数组每个元素读入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值