Java SE API know how

流和过滤器实现

Stream 延迟遍历,并行处理(提高性能同时带来线程问题)
流的性能优势是因为被实现为延迟处理数据结构

当没有进行终止操作的流并没有进行数据的处理,
当遇到终止操作然后回溯查找流,从六中找到第一个操作之后
进行操作,最后执行终止操作。

延迟处理和迭代器的性能

java filter不等于 equals_数据

即使处理整个数据集,单个过滤器的性能也要由于迭代器,
多个过滤器会增加留的开销。

对象序列化

一种将对象的二进制状态表示方式,如果需要创建对象则需要二进制进行创建。

瞬时字段

通过transient关键字标记不需要序列化处理的数据

覆盖默认的序列化

writeObject和readObject方法可以完全控制序列化的方式
控制力越强责任越大
正确思考如何使用transit保证序列化方法的最大性能

transient是Java中的关键字,用于修饰类的属性。当一个属性被声明为transient,它将不会被序列化或者反序列化。

transient的底层工作方式如下:

  1. 在序列化对象时,当对象中某个属性被声明为transient时,这个属性不会被序列化。
  2. 在反序列化对象时,当对象中某个属性被声明为transient时,这个属性不会被反序列化。在反序列化时,Java虚拟机会为被反序列化的对象重新分配内存,然后再从输入流中读取对象的数据,将其填充到新分配的内存空间中。在这个过程中,被声明为transient的属性会被忽略,而其他属性会被正常反序列化。
  3. 在使用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();
    }
}

压缩和非压缩下的时间和空间占比

java filter不等于 equals_java_02

如果是在网络上传输,权衡的因素更多的是网速。
不压缩的时间短,空间大,适合网速慢
压缩的时间长,空间小,适合网络慢

跟踪重复的对象

序列化的时候考虑对象的引用破坏问题,避免反序列化的时候对象引用不可用的情况
JDK内部处理数据序列化的方式考虑如何复用对象引用
当序列化和反序列化的时候考虑对象引用复用方法,但是需要处理数据一致性