Java序列化 资源销毁 Stream使用介绍
- 2018-10-01 23:21:00
- admin
- 原创 1371
一、Java序列化
Serializable序列化:
1、serialVersionUID标识类的版本,序列化时写入文件,反序列化时读取进行检查;
2、serialVersionUID默认使用包名、类名、方法名、字段名、修饰符根据规则生成;
3、建议显示指定serialVersionUID,因为默认serialVersionUID可能有兼容性问题;
4、Serializable实现类要求所有字段都能够序列化,除非字段标识为transient;
5、Serializable实现类的父类如果不标识序列化,则父类成员不会参与序列化;
6、反序列化通过反射实现,序列化类构造函数不会被调用,不序列化的父类构造函数会被调用;
7、private void writeObject(ObjectOutputStream out),序列化重载函数,按需进行重载;
8、private void readObject(ObjectInputStream in),反序列化重载函数,按需进行重载;
9、private Object readResolve(),生成对象重载函数,readObject之后调用,按需进行重载;
Externalizable序列化:
1、Externalizable需要调用序列化类无参构造函数生成对象;
2、void writeExternal(ObjectOutput out),用于序列化成员变量,必须实现;
3、void readExternal(ObjectInput in),用于反序列化成员变量,必须实现;
4、private Object readResolve(),跟Serializable保持一致;
二、Java资源销毁
1、finalize是Object的方法,用于进行资源释放,子类需要重写该方法,对象被回收时会被虚拟机调用;
2、System.gc建议虚拟机进行垃圾回收,System.runFinalization建议虚拟机调用finalize方法;
3、runFinalization实际依赖gc,所以感觉runFinalization没啥用处;
三、Stream使用介绍
1、流接口包含Stream、IntStream、LongStream、DoubleStream,都继承于BaseStream;
2、BaseStream包含方法iterator(),可以用来迭代流包含的数据,只能使用一次;
3、流接口可以生成数据,比如方法generate、iterate、range、rangeClosed;
4、集合通过自己的stream方法生成流,数组通过Stream的of方法生成流;
5、filter对数据进行过滤,map对数据进行映射,flatMap将二维流转换成一维流;
6、limit取前n个元素,skip跳过前n个元素,sort对数据进行排序,distinct对数据进行去重;
7、forEach处理流数据,并行流无法保证执行顺序,forEachOrdered处理流数据,并行流可以保证执行顺序;
8、collect(collector),数据转存到集合里面,常用Collectors.toList();
9、reduce(accumulator),聚合操作,accumulator满足交换律;
10、reduce(identity,accumulator),聚合操作,accumulator满足交换律,accumulator.apply(identity,x)==x;
并行流:
1、sequential方法生成串行流,parallel方法生成并行流,集合的parallelStream方法生成并行流;
2、BaseStream包含方法spliterator(),返回对象Spliterator,其中trySplit用来拆分流;
3、Spliterator的tryAdvance用来迭代流数据,estimateSize表示流的剩余数据量;