Java SE API know how
流和过滤器实现
Stream 延迟遍历,并行处理(提高性能同时带来线程问题)
流的性能优势是因为被实现为延迟处理数据结构
当没有进行终止操作的流并没有进行数据的处理,
当遇到终止操作然后回溯查找流,从六中找到第一个操作之后
进行操作,最后执行终止操作。
延迟处理和迭代器的性能即使处理整个数据集,单个过滤器的性能也要由于迭代器,
多个过滤器会增加留的开销。
对象序列化
一种将对象的二进制状态表示方式,如果需要创建对象则需要二进制进行创建。
瞬时字段
通过transient关键字标记不需要序列化处理的数据
覆盖默认的序列化
writeObject和readObject方法可以完全控制序列化的方式
控制力越强责任越大
正确思考如何使用transit保证序列化方法的最大性能
transient是Java中的关键字,用于修饰类的属性。当一个属性被声明为transient,它将不会被序列化或者反序列化。
transient的底层工作方式如下:
- 在序列化对象时,当对象中某个属性被声明为transient时,这个属性不会被序列化。
- 在反序列化对象时,当对象中某个属性被声明为transient时,这个属性不会被反序列化。在反序列化时,Java虚拟机会为被反序列化的对象重新分配内存,然后再从输入流中读取对象的数据,将其填充到新分配的内存空间中。在这个过程中,被声明为transient的属性会被忽略,而其他属性会被正常反序列化。
- 在使用transient时需要注意的是,被声明为transient的属性将不会被序列化和反序列化,因此在反序列化后,这些属性的值将会被初始化为默认值(如null、0等)。如果需要在反序列化后保留这些属性的值,可以通过在对象中实现自定义的readObject()和writeObject()方法来实现。
总的来说,transient的底层工作方式是通过在序列化和反序列化时忽略被声明为transient的属性,从而实现对对象的序列化和反序列化的控制。
压缩序列化数据
对数据的优化总是可以使用压缩技术
public class StockPriceHistoryCompress
implements StockPriceHistory, Serializable {
private byte[] zippedPrices;
private transient SortedMap<Date, StockPrice> prices;
private void writeObject(ObjectOutputStream out)
throws IOException {
if (zippedPrices == null) {
makeZippedPrices();
}
out.defaultWriteObject();
}
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject();
unzipPrices();
}
protected void makeZippedPrices() throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream zip = new GZIPOutputStream(baos);
ObjectOutputStream oos = new ObjectOutputStream(
new BufferedOutputStream(zip));
oos.writeObject(prices);
oos.close();
zip.close();
zippedPrices = baos.toByteArray();
}
protected void unzipPrices()
throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(zippedPrices);
GZIPInputStream zip = new GZIPInputStream(bais);
ObjectInputStream ois = new ObjectInputStream(
new BufferedInputStream(zip));
prices = (SortedMap<Date, StockPrice>) ois.readObject();
ois.close();
zip.close();
}
}
压缩和非压缩下的时间和空间占比
如果是在网络上传输,权衡的因素更多的是网速。
不压缩的时间短,空间大,适合网速慢
压缩的时间长,空间小,适合网络慢
跟踪重复的对象
序列化的时候考虑对象的引用破坏问题,避免反序列化的时候对象引用不可用的情况
JDK内部处理数据序列化的方式考虑如何复用对象引用
当序列化和反序列化的时候考虑对象引用复用方法,但是需要处理数据一致性