本文讲述的是Java中transient关键字的作用

前言

在阅读ArrayList和Vector源码的学习过程中,我发现存储ArrayList的元素的数组缓冲区用到了transient关键字来进行存储优化,而Vector却没有,这是为什么呢?


一、transient

transient关键字是开发中用的比较少的一个关键字,它在序列化和反序列化中比较重要,通常面试时会考察它的作用和它的使用场景,还有它在什么情况下会失效。transient的作用是用来防止属性被序列化

二、ArrayList中transient的作用

ArrayList

    /*** The array buffer into which the elements of the ArrayList are stored.* The capacity of the ArrayList is the length of this array buffer. Any* empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA* will be expanded to DEFAULT_CAPACITY when the first element is added.*/transient Object[] elementData; // non-private to simplify nested class access

ArrayList中writeObject的实现

    /*** Save the state of the <tt>ArrayList</tt> instance to a stream (that* 将 ArrayList 实例的状态保存到流中(即序列化它)。* is, serialize it).** @serialData The length of the array backing the <tt>ArrayList</tt>*             instance is emitted (int), followed by all of its elements*             (each an <tt>Object</tt>) in the proper order.*/private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{// Write out element count, and any hidden stuffint 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实现了writeObject方法,可以看到只会保存List的实际size个数的elementData,也就是说保存非空数组位置上的数据,并且提供了fast-fail快速失败机制,可以提供弱一致性。

Vector

    /*** The array buffer into which the components of the vector are* stored. The capacity of the vector is the length of this array buffer,* and is at least large enough to contain all the vector's elements.** <p>Any array elements following the last element in the Vector are null.** @serial*/protected Object[] elementData;

Vectort中writeObject的实现

    /*** Save the state of the {@code Vector} instance to a stream (that* is, serialize it).* This method performs synchronization to ensure the consistency* of the serialized data.*/private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {final java.io.ObjectOutputStream.PutField fields = s.putFields();final Object[] data;synchronized (this) {fields.put("capacityIncrement", capacityIncrement);fields.put("elementCount", elementCount);data = elementData.clone();}fields.put("elementData", data);s.writeFields();}

Vector 也实现了 writeObject 方法,但方法并没有像 ArrayList 一样进行优化存储
data = elementData.clone();
clone()的时候会把 null 值也拷贝。所以保存相同内容的 Vector 与 ArrayList, Vector 的占用的字节比 ArrayList 要多


三、区别

  • ArrayList 是非同步实现的一个单线程下较为高效的数据结构(相比 Vector 来说)。 ArrayList 只通过一个修改记录字段提供弱一致性,主要用在迭代器里。没有同步方法。 即上面提到的 Fast-fail 机制.ArrayList 的存储结构定义为 transient,重写 writeObject 来实现自定义的序列化,优化了存储。
  • 同步处理:Vector 同步,ArrayList 非同步 Vector 缺省情况下增长原来一倍的数组 长度,ArrayList 是 0.5 倍. ArrayList: int newCapacity = oldCapacity + (oldCapacity >> 1); ArrayList 自动扩大容量为原来的 1.5 倍(实现的时候,方法会传入一个期望的最小容量,若扩容后容量仍然小于最小容量,那么容量就为传入的最小容量。扩 容的时候使用的 Arrays.copyOf 方法最终调用 native 方法进行新数组创建和数据拷贝)。
  • Vector: int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
  • Vector 指定了initialCapacity,capacityIncrement 来初始化的时候,每次增长 capacityIncrement

浅析transient关键字相关推荐

  1. java transient关键字_小伙子,你真的搞懂 transient 关键字了吗?

    先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将 ...

  2. Transient关键字的使用

    一个对象只要实现了Serilizable接口,这个对象就可以被序列化,然而在实际开发过程中有些属性需要序列化,而其他属性不需要被序列化,这时对应的变量就可以加上 transient关键字. 示例: i ...

  3. Java transient关键字使用小记

    哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...

  4. java transient关键字

    transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只 ...

  5. Java transient关键字使用详解

    1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...

  6. mfc从文件中读取数据_Java中Transient关键字,一点课堂(多岸学院)

    Java中Transient关键字 虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的 ...

  7. 序列化的高阶认识-Transient 关键字

    Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的 ...

  8. java父类序列化_父类的序列化与 Transient 关键字

    情境:一个子类实现了 Serializable 接口, 它的父类都没有实现 Serializable 接口, 序列化该子类对象, 然后反序列化后输出父类定义的某变量的数值,该变量数值与序列化时的数值不 ...

  9. java 中 transient关键字

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需 ...

最新文章

  1. 【运维】阿里云宝塔面板部署JavaWeb项目
  2. 作业 3 利用分支和循环结构解决问题
  3. KMP POJ 3461 Oulipo
  4. Linux有关Shell中if用法笔记
  5. webrender 查看是否开启_想要体验极致顺滑的网页加载体验?手动开启Firefox WebRender渲染引擎...
  6. 缓冲池java_了解Java缓冲池
  7. ​【文末有福利】连续型随机变量及实例详解
  8. 带你走进和声搜索算法(Harmony search )的世界!
  9. live linux 密码,Linux_如何使你的Linux系统省略输入用户名密码,在做Livecd的时候总是要输入用 - phpStudy...
  10. Excel导入导出帮助类
  11. is_callable_Python callable()和__call __()
  12. java如何通过拼音搜索功能_如何实现拼音搜索
  13. android httpclient 设置超时
  14. android exoplayer 直播流,android – Exoplayer自适应hls流媒体
  15. “跨综服”——跨境电商综合服务合规化走向台前
  16. 浅谈大数据和人工智能
  17. Mixly制作的MP3播放和七彩灯、台灯控制例子
  18. 关于PEM, DER, CRT, CER,KEY等各类证书与密钥文件后缀的解释
  19. python 抓包秒杀_Python 爬虫,推荐一款简单的抓包工具(续)
  20. php 打开ppt,怎么播放ppt

热门文章

  1. 创建人物特写视频flash教程(五)
  2. 单例模式——网站计数器实例
  3. 计算机的网络配置的方法是什么,怎么配置计算机网络
  4. 不是吧,还有人不知道计算机以及Linux基础知识?
  5. java调用第三方接口_java调用第三方接口,获取接口返回的数据。
  6. 电压,电流,电阻的关系就是欧姆定律
  7. 面试题笔试题总结——数据库题库
  8. ulimit 命令详解
  9. 《谁说菜鸟不会数据分析》学习笔记
  10. 高端操作!实现RecyclerView的上下拖拽