ArrayList集合中的elementData为什么不参与序列化?

在ArrayList中有这么一段代码 

  /**
     * 存储ArrayList元素的数组缓冲区。ArrayList的容量是此数组缓冲区的长度。     * 添加第一个元素时,任何带有elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA的空ArrayList都将扩展为DEFAULT_CAPACITY。
     */
    transient Object[] elementData; // non-private to simplify nested class access

elementData是存放当前集合中所有的元素的一个数组,但是却被transient关键字修饰,transient表示该数组不参与序列化.

那这样的话,序列化之后ArrayList中存放的元素不就丢失了吗?

带着这样的疑问接着往下看,最后发现在ArrayList中有这样两个方法 writeObject() 和 readObject()

  /**
     * 将 ArrayList 实例的状态保存到流(即序列化它)。*/
    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException{
        // 写出元素计数和任何隐藏的东西
        int expectedModCount = modCount;
        s.defaultWriteObject(); // 写出当前类的所有非静态字段(non-static)和非瞬态字段(non-transient)到ObjectOutputStream

        // 将size写出到ObjectOutputStream
        s.writeInt(size);

        // 因为ArrayList是可扩容的,在添加元素时,可能会扩容,这个时候会存在一些没有使用的空间,所以采用这种方式,来节约空间和减少序列化的时间
        for (int i=0; i<size; i++) {  // size代表数组中储存的元素的个数
            s.writeObject(elementData[i]); // 有序的将elementData中已使用的元素读出到流中
        }

        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }
  /**
     * 从流中重构 ArrayList 实例(即,对其进行反序列化)。
     */
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        elementData = EMPTY_ELEMENTDATA;

        // 读入size, 和所有隐藏的东西
        s.defaultReadObject();

        // 读入容量
        s.readInt(); // ignored

        if (size > 0) {
            // 就像clone()一样,根据大小而不是容量来分配数组
            ensureCapacityInternal(size);

            Object[] a = elementData;
            // 按正确的顺序读入所有元素。
            for (int i=0; i<size; i++) {
                a[i] = s.readObject();
            }
        }
    }

原文地址:https://www.cnblogs.com/Deters/p/11287766.html

时间: 2024-10-20 13:48:26

ArrayList集合中的elementData为什么不参与序列化?的相关文章

Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素

1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5)拿着个元素到新集合中去找,看有没有   有:不搭理它 没有:添加到新集合      (6)遍历新集合 2. 案例代码: 1 package cn.itcast_04; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6

java集合 collection-list-ArrayList 去除ArrayList集合中的重复元素。

import java.util.*; /* 去除ArrayList集合中的重复元素. */ class ArrayListTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { ArrayList al = new ArrayList(); al.add("java01"); al.add("java02&q

java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据封装进人对象. 2,定义容器,将人存入. 3,取出. List集合判断元素是否相同,依据是元素的equals方法. */ class Person { private String name; private int age; Person(String name,int age) { this.n

把ArrayList集合的字符串存储到文本文件/把文本文件的数据存储到ArrayList集合中

把ArrayList集合的字符串存储到文本文件 分析: 1.ArrayList集合存储的是字符串 2.遍历ArrayList,获取数据 3.把数据存储到文本文件 4.由文本文件可知要用字符流 代码 package cn.idcast4; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; public class Day1

Java 去除 ArrayList 集合中的重复元素

// One practice package Collection; import java.util.ArrayList; import java.util.Iterator; // 去除 ArrayList 集合中的重复元素 public class ArrayListTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) {

去除ArrayList集合中重复字符串元素方式_思路:创建新集合方式

import java.util.ArrayList; import java.util.Iterator; public class jh_01_去除ArrayList集合中重复字符串元素方式 { /* * /** * * A:案例演示 * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) * 思路:创建新集合方式 */ public static void main(String[] args) { ArrayList list = new ArrayList(); li

集合框架(去除ArrayList集合中的重复字符串元素案例2)

package cn.itcast_04; import java.util.ArrayList; import java.util.Iterator; /* * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) * 要求:不能创建新的集合,就在以前的集合上做. */ public class ArrayListDemo2 { public static void main(String[] args) { // 创建集合对象 ArrayList array = new Ar

集合框架(去除ArrayList集合中的重复自定义对象元素案例)

学生类 package cn.itcast_04; public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public v

Java基础知识强化之集合框架笔记28:ArrayList集合练习之去除ArrayList集合中的重复字符串元素(升级)

1. 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)     要求:不能创建新的集合,就在以前的集合上做. 2. 代码示例: 1 package cn.itcast_04; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 /* 7 * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) 8 * 要求:不能创建新的集合,就在以前的集合上做. 9 */ 10 public cla