vlambda博客
学习文章列表

每日10道Java热门八股文面试题--基础篇(1)



从今天开始,将不间断更新Java面试中考察最为频繁的八股文,上个厕所,坐个公交,无聊时看看。每个问题的的答案将尽量简单简短,方便碎片化时间时学习。


这种碎片化的掌握的知识,只能达到扫盲的目的,想要更加系统深入的掌握,需要找相应文章进行学习。



1、深克隆和浅克隆的区别?



(2)深克隆:拷⻉对象和原始对象的引⽤类型引⽤不同对象。深拷⻉是将对象及值复制过来,两个对象修改其中 任意的值另⼀个值不会改变,这就是深拷⻉(例:JSON.parse() 和 JSON.stringify(),但是此⽅法⽆法复制函数类 型)。 


补充:深克隆的实现就是在引⽤类型所在的类实现 Cloneable 接⼝,并使⽤ public 访问修饰符重写 clone ⽅法。Java 中定义的 clone 没有深浅之分,都是统⼀的调⽤ Object 的 clone ⽅法。为什么会有深克隆的概念?是由于我 们在实现的过程中刻意的嵌套了 clone ⽅法的调⽤。也就是说深克隆就是在需要克隆的对象类型的类中重新实现克 隆⽅法 clone()


2、Java 中的参数传递时传值呢?还是传引⽤?


Java 的参数是以值传递的形式传⼊⽅法中,⽽不是引⽤传递。


当传递⽅法参数类型为基本数据类型(数字以及布尔值)时,⼀个⽅法是不可能修改⼀个基本数据类型的参数。 


当传递⽅法参数类型为引⽤数据类型时,⼀个⽅法将修改⼀个引⽤数据类型的参数所指向对象的值。即使 Java 函 数在传递引⽤数据类型时,也只是拷⻉了引⽤的值罢了,之所以能修改引⽤数据是因为它们同时指向了⼀个对象, 但这仍然是按值调⽤⽽不是引⽤调⽤。


3、抽象类和接⼝有什么区别?


(1)抽象类中可以定义构造函数,接⼝不能定义构造函数;

 

(2)抽象类中可以有抽象⽅法和具体⽅法,⽽接⼝中只能有抽象⽅法(public abstract)


(3)抽象类中的成员权限可以是 public、默认、protected(抽象类中抽象⽅法就是为了重写,所以不能被 private 修饰),⽽接⼝中的成员只可以是 public(⽅法默认:public abstrat、成员变量默认:public static final)


 (4)抽象类中可以包含静态⽅法,⽽接⼝中不可以包含静态⽅法;


JDK 8 中的改变:1、在 JDK1.8中,允许在接⼝中包含带有具体实现的⽅法,使⽤ default 修饰,这类⽅法就是默认⽅法。2、抽象类中可以包含静态⽅法,在 JDK1.8 之前接⼝中不能包含静态⽅法,JDK1.8 以后可以包含。之前不能包含 是因为,接⼝不可以实现⽅法,只可以定义⽅法,所以不能使⽤静态⽅法(因为静态⽅法必须实现)。现在可以包 含了,只能直接⽤接⼝调⽤静态⽅法。JDK1.8 仍然不可以包含静态代码块。


4、Java 中创建对象的⼏种⽅式?


1、使⽤ new 关键字;

2、使⽤ Class 类的 newInstance ⽅法,该⽅法调⽤⽆参的构造器创建对象(反射):Class.forName.newInstance(); 

3、使⽤ clone() ⽅法;

4、反序列化,⽐如调⽤ ObjectInputStream 类的 readObject() ⽅法。


5、重载和重写的区别?


(1)重载:编译时多态、同⼀个类中同名的⽅法具有不同的参数列表、不能根据返回类型进⾏区分【因为:函数 调⽤时不能指定类型信息,编译器不知道你要调哪个函数】; 


(2)重写(⼜名覆盖):运⾏时多态、⼦类与⽗类之间、⼦类重写⽗类的⽅法具有相同的返回类型、更好的访问 权限


6、静态变量和实例变量的区别?


(1)静态变量:是被 static 修饰的变量,也称为类变量,它属于类,因此不管创建多少个对象,静态变量在内存中有且 仅有⼀个拷⻉;静态变量可以实现让多个对象共享内存。 


(2)实例变量:属于某⼀实例,需要先创建对象,然后通过对象才能访问到它。


7、什么是 Java 的序列化,如何实现 Java 的序列化?


对象序列化是⼀个⽤于将对象状态转换为字节流的过程,可以将其保存到磁盘⽂件中或通过⽹络发送到任何其他程序(RPC传输)。从字节流创建对象的相反的过程称为反序列化。⽽创建的字节流是与平台⽆关的,在⼀个平台上序列化的对象 可以在不同的平台上反序列化。序列化是为了解决在对象流进⾏读写操作时所引发的问题。 


序列化的实现:将需要被序列化的类实现 Serializable 接⼝,该接⼝没有需要实现的⽅法,只是⽤于标注该对象是 可被序列化的,然后使⽤⼀个输出流(如:FileOutputStream)来构造⼀个 ObjectOutputStream 对象,接着使 ⽤ ObjectOutputStream 对象的 writeObject(Object obj) ⽅法可以将参数为 obj 的对象写出,要恢复的话则使⽤ 输⼊流。


8、两个对象的 hashCode() 相同,则 equals() 也⼀定为 true 吗?


两个对象的 hashCode() 相同,equals() 不⼀定为 true。因为在散列表中,hashCode() 相等即两个键值对的哈希 值相等,然⽽哈希值相等,并不⼀定能得出键值对相等【散列冲突】(可以看看HashMap的的实现理解为更深刻)。


9、== 和 equals 的区别?




10、装箱和拆箱的区别?含义?


⾃动装箱是 Java 编译器在基本数据类型和对应得包装类之间做的⼀个转化。⽐如:把 int 转化成 Integer,double 转化成 Double 等等。反之就是⾃动拆箱。装箱就是把数据放到堆中,拆箱就是放到栈中,可以结合JVM中的运行时数据区的堆栈进行理解。


原始类型:boolean、char、byte、short、int、long、float、double 封装类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double


每日10道Java热门八股文面试题--基础篇(1)

往  期  精  选



"微  信  关  注 、 查  看  往  期  文  章 "



"加  我  聊  聊 "