java面试题整理2020.1.13

拟墨画扇 提交于 2020-01-13 21:39:52

序列化和反序列化

序列化:把对象的状态转换为字节码的过程叫序列化。
transient修饰的属性,不会被序列化。
静态static的属性不会被序列化。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

  1. 什么方式进行序列化
    实现了Serializable接口。
    Hessian 序列化
    Json序列化

  2. 序列化中需要注意的几个点
    transient可以修饰属性,防止属性被序列化
    static属性也不会被序列化。
    子类能够继承父类的序列化功能
    引用类型的属性会随着对象序列化而序列化
    即序列化一个对象a时,对象a的引用属性b不用实现序列化接口也能随着对象a的序列化而序列化;实际不然,对象b的类也需要实现序列化接口才能随着对象a的序列化而序列化。

  3. 序列化的作用
    持久化存储时。
    网络传输时。
    通过RMI传输对象时。

wait和sleep的区别

这两个方法来自不同的类,分别是sleep来自thread类,wait来自object类
最主要的是sleep方法没有释放锁,而wait方法释放了锁,是的其他线程可以同步控制块和方法
使用范围:wait,notify,notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
sleep必须捕获异常,而wait,notfy,notifyAll不需要捕获异常

数组的初始化方式

动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
静态初始化:在定义数组的同时就为数组元素分配空间并赋值;
默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后每个元素也被按照成员变量的规则被隐式初始化

String,StringBuffer,StringBuilder区别

  1. 长度是否可变
    String是被final修饰,底层是final修饰的byte数组。(不完全不可变,可以通过反射的机制强行赋值改变)这里不做说明。
    StringBuffer和StringBuilder类的对象可变。
  2. 执行效率
    Stringbuilder>StringBuffer>String
  3. 应用场景
    如果要操作少量的数据用=String
    单线程操作字符串缓冲区下操作大量数据=StringBuffder
    多线程操作字符串缓冲去下操作大量数据=StringBuffer
  4. 是否线程安全
    StringBuffer是线程安全,线程安全实现方式是将此类下所有的方法都加上了synchronized关键字进行修饰,因此是线程安全的,StringBuilder的方法没有加上修饰所以不安全。

java面向对象的特性

分别是封装,继承和多态。

  1. 封装
    把数据和操作数据的方法绑定起来。并命名,使用时不需要考虑内部实现,只需要调用对应命名的名字。这就是封装
    内部类提供更好的封装,可以把内部类隐藏在外部类之内不允许其他包中的类访问该类
    内部类的方法可以直接访问外部类的所有数据,包括私有数据。
    内部类所实现的功能使用外部类同样可以实现,只是有时候使用内部类更方便。

内部类可分为以下几种:
成员内部类
静态内部类
方法内部类
匿名内部类
暂时不做深刻研究。内部类可以更好的提供封装。

  1. 继承
    继承是类与类的一种关系,是一种is a的关系。比如狗继承动物。java中的继承是单继承,即一个类只有一个父类。
    继承的好处,子类拥有父类的所有属性和方法(被private修饰的属性不能拥有)

  2. 多态
    允许不同子类型堆同一信息状态而进行的不同响应。主要发生在子类和父类之间。主要实现是重写和重载

重写和重载是什么

  1. 重写是子类对父类的允许访问的方法实现过程进行重新编写,返回值和形参都不能改变。
    重写的好处
    在于子类根据需要,定义特定于自己的行为。也就是说子类根据自己的需要重新实现父类的方法
  2. 重载是一个类中,同名的方法有不同的参数列表。重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。

文章随意而作,如有概念错误的地方希望热心网友指出共同学习。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!