看到网上特别多的面经,里边很多问题都不会,有必要总结一下,希望自己能坚持下去,猪猪加油
反射
什么是反射?反射有什么好处
反射的原理?
Java语言在编译之后会生成一个class文件,反射就是通过字节码文件找到其类中的方法和属性等;
反射能否调用类的私有属性和方法
可以通过反射调用类的私有属性和方法,Java的private修饰符不是为了绝对安全设计的,而是对用户常规使用Java的一种约束。就好比饭店厨房门口挂着“闲人免进”的牌子,但是你还是能够通过其他方法进去。从外部对对象进行常规调用时,能够看到清晰的类结构
序列化与反序列化
什么是序列化?什么情况下需要使用序列化?
在Java中,序列化是指将Java对象转换为字节序列的过程,而反序列化是指将字节序列转换为Java对象的过程。其中,字节序列即是二进制数据,可以方便地在网络上传输或存储到本地硬盘中。
序列化的主要作用包括两个方面:
实现网络中对象的传送,即在网络进程间传递对象。
实现内存中对象的持久化,即将对象保存到本地磁盘中。##(这点需要格外留意)
如何实现Java中对象的序列化?
请解释一下Serializable接口的作用
第一步:将需要序列化的对象所属类实现java.io.Serializable标记接口(没有任何抽象方法的接口)。
第二步:在Java程序中使用对象输出流(ObjectOutputStream),通过其writeObject()方法来实现序列化操作。
第三步:在Java程序中使用对象输入出流(ObjectInputStream),通过其readObject()方法来实现反序列化操作。
常见问题:
若对象所属类未实现Serializable接口,则在序列化时会报java.io.NotSerializableException运行时异常。
建议对象所属类在实现Serializable接口的同时,添加serialVersionUID常量。
序列化时,仅对对象的状态(属性值)进行保存,而不管对象的方法。
静态成员数据不能被序列化,因为static代表类的状态。
如何实现自定义序列化策略?
方式一:实现Externalizable接口,并重写WriteExternal(ObjectOutput)和readExternal(ObjectInput)方法。
方式二:根据Externalizable接口的思想,可在实现Serializable接口的基础上,直接添加并实现WriteObject(ObjectOutputStream)和readObject(ObjectInputStream)两个方法。
serialVersionUID常量有什么作用?
保证版本号的一致性。若不显式指定该常量值,Java编译器会自动为其生成一个默认值,该默认值会随着类代码的变动而变动。故当修改类代码时,之前已经序列化的对象在进行反序列化时即会因为版本号的不一致而发生异常。显式指定serialVersionUID,可以使得类的不同版本对序列化兼容,故需确保类的不同版本具有相同的serialVersionUID;
深拷贝和浅拷贝
序列化为什么可以实现深拷贝?
若一个对象的属性引用其他对象,则序列化该对象时引用对象也会同时被序列化,这即是序列化能够实现深拷贝的本质。简单来说就是深拷贝的时候对象的属性跟着对象本身一起完成序列化。
为什么要使用拷贝?
引用拷贝:只是复制对象的引用,所有引用在堆上指向同一块空间
对象拷贝:创建对象本身的一个副本,深拷贝和浅拷贝都属于对象拷贝
深拷贝和浅拷贝区别是什么?
对于基本数据类型的成员变量,无论「浅拷贝」还是「深拷贝」都会直接进行值传递,原对象和新对象的该属性值为两份数据,相互独立,且互不影响。
而对于引用类型的成员变量,「浅拷贝」仅复制该属性的引用而不复制引用所指向的对象,即原对象和新对象的该属性指向的是同一个对象;「深拷贝」则会直接复制该属性所指向的对象,即原对象和新对象的该属性指向的是堆空间中内存地址不同的对象。
如何实现浅拷贝?
如何实现深拷贝?
Object类的clone()方法为什么要声明为protected?
如何理解Clonable接口
分布式事务
什么是Http幂等性?
post不具有幂等性
get delete put具有幂等性
2058

被折叠的 条评论
为什么被折叠?



