前言
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说操作的数据类型被指定为一个参数,比如我们要编写一个排序方法,能够接收整数型、字符串等进行排序,我们就需要使用到java泛型。
<? extends T> 表示通配符所代表的类型为T类型的子类
<? super T> 表示该通配符所代表的类型是T类型的父类
泛型类
泛型类的声明和非泛型类的声明类似,只是在类名后面添加了类型参数声明部分,和泛型方法一样的,泛型类的类型参数可以包含一个或多个,参数之间用逗号隔开。
?代替具体的类型参数,是所有的父类
泛型是编译器层面的来实现的,在字节码生成是不好含泛型信息的。
java序列化
保存(持久化)对象以及状态到内存或磁盘中,java允许我们在内存创建可复用的java对象,但一般情况下。只有当JVM处于运行时,这些对象才能存在。序列化对象,可以在重启时重新加载。
序列化对象以字节数组保存--不保存静态成员
序列化保存的是对象的”状态“,即是它的成员变量,由此可知序列化是不关注类的静态变量的
序列化用于远程对象的传输
当使用RMI或者网络中传输对象是,都会使用到对象的序列化。java序列化API为处理对象序列化提供了一个标准的机制,该API简单易用
实现Serializable接口,为了实现序列化 ObjectOutputStream、ObjectInputStream,对对象进行序列化和反序列化
writeObject、ReadObject 方法可以实现自定义序列化策略
序列化ID
虚拟机是否允许反序列化,不仅仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化ID是否是一致的。
要将父类对象也序列化,就需要父类也实现Serializable接口
Transient
该关键字阻止变量被序列化到文件中,反序化时变量的值为初始化值
当一些敏感数据,不希望被序列化时
java 复制
将一个对象的引用复制给另一个对象,共有三种方式。直接赋值、浅拷贝、深拷贝
直接赋值:
A a1 = a2
int a = b;
对象的引用复制和基础类型的赋值
浅拷贝:
创建一个新的对象,然后将当前对象的非静态字段复制到该新的对象上
深拷贝:
不仅仅时复制对象本身,而且复制对象包含了引用指向的所有对象。