TreeMap源码分析八

来源:互联网 发布:热血江湖网络不稳定 编辑:程序博客网 时间:2024/05/20 06:07

转自:http://www.fengfly.com/plus/view-213898-9.html

克隆与序列化


TreeMap实现了Cloneable接口,即实现了clone()方法。
clone()方法的作用很简单,就是克隆一个TreeMap对象并返回。

  1. // 克隆一个TreeMap,并返回Object对象  
  2. public Object clone() {  
  3.     TreeMap<K,V> clone = null;  
  4.     try {  
  5.         clone = (TreeMap<K,V>) super.clone();  
  6.     } catch (CloneNotSupportedException e) {  
  7.         throw new InternalError();  
  8.     }  
  9.     // Put clone into "virgin" state (except for comparator)  
  10.     clone.root = null;  
  11.     clone.size = 0;  
  12.     clone.modCount = 0;  
  13.     clone.entrySet = null;  
  14.     clone.navigableKeySet = null;  
  15.     clone.descendingMap = null;  
  16.     // Initialize clone with our mappings  
  17.     try {  
  18.         clone.buildFromSorted(size, entrySet().iterator(), nullnull);  
  19.     } catch (java.io.IOException cannotHappen) {  
  20.     } catch (ClassNotFoundException cannotHappen) {  
  21.     }  
  22.  
  23.     return clone;  

 TreeMap实现的Serializable接口

TreeMap实现java.io.Serializable,分别实现了串行读取、写入功能。
串行写入函数是writeObject(),它的作用是将TreeMap的“容量,所有的Entry”都写入到输出流中。
而串行读取函数是readObject(),它的作用是将TreeMap的“容量、所有的Entry”依次读出。
readObject() 和 writeObject() 正好是一对,通过它们,我能实现TreeMap的串行传输。

  1. // java.io.Serializable的写入函数  
  2. // 将TreeMap的“容量,所有的Entry”都写入到输出流中  
  3. private void writeObject(java.io.ObjectOutputStream s)  
  4.     throws java.io.IOException {  
  5.     // Write out the Comparator and any hidden stuff  
  6.     s.defaultWriteObject();  
  7.     // Write out size (number of Mappings)  
  8.     s.writeInt(size);  
  9.     // Write out keys and values (alternating)  
  10.     for (Iterator<Map.Entry<K,V>> i = entrySet().iterator(); i.hasNext(); ) {  
  11.         Map.Entry<K,V> e = i.next();  
  12.         s.writeObject(e.getKey());  
  13.         s.writeObject(e.getValue());  
  14.     }  
  15. }  
  16. // java.io.Serializable的读取函数:根据写入方式读出  
  17. // 先将TreeMap的“容量、所有的Entry”依次读出  
  18. private void readObject(final java.io.ObjectInputStream s)  
  19.     throws java.io.IOException, ClassNotFoundException {  
  20.     // Read in the Comparator and any hidden stuff  
  21.     s.defaultReadObject();  
  22.     // Read in size  
  23.     int size = s.readInt();  
  24.     buildFromSorted(size, null, s, null);  

说到这里,就顺便说一下“关键字transient”的作用

transient是Java语言的关键字,它被用来表示一个域不是该对象串行化的一部分。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。 
当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。


0 0
原创粉丝点击