关于Java基础最易错的十道面试题

发布时间:2024年01月20日

面试题一:为什么Java不支持多继承


避免出现C++那种菱形继承问题,类B、C继承于A类,并且重写了A中的a()方法,而类D继承于B、C类,此时如果D类中调用a方法就会出现二义性问题。
虽然说Java中不支持多继承但是Java中具有接口,通过接口的设定就可以实现多继承问题

面试题二:==和equals有什么区别


==对于int,char,boolean是比较他们的值是否相同,对于对象是比较二者的是否指向同一个地址
equals方法是在Object类中定义的方法,默认是使用==来进行比较,但是很多类中会重写equals方法,来根据对象内容进行比较

面试题三:返回值不同算方法重载吗?为什么?


首先来说一下什么是方法的重载,方法的重载就是同一个类中定一个多个方法,他们具有相同的名称但参数列表不同。如果只是单纯的返回值不同,参数列表都相同,那么编译器无法区分它们,所以不能算方法的重载

面试题四:String 为什么被设计成不可变的?


线程安全:不可变的字符串是线程安全的,多个线程可以访问同一个字符串对象而不用担心修改冲突,更加适用于并发的环境中
性能:字符串常量池中可以用重用相同的字符串,从而减少内存的占用提高性能
字符串常量池:
String str1 = "Hello"; // 字符串字面量
String str2 = "Hello"; // 字符串字面量,由于值相同,与str1共享同一个对象
System.out.println(str1 == str2); // true,因为它们引用同一个字符串对象
缓存:由于字符串是不可变的,可以安全的将他们缓存起来,避免多次使用重复创建

面试题五:String str=new String("hello")创建了几个对象?


创建两个对象,字符串常量池中的对象,对于“hello”这个字符串在编译的时候就会存储在字符串常量池中;
堆中的对象,使用new String("hello")创建了一个新的字符串对象在堆中

面试题六:包装类的实际应用场景有哪些?


处理null值:基本数据类型不可以表示null值,但是包装类可以
集合类:Java中的集合类ArrayList、LinkList、HashMap等自能存储对象,无法存储基本数据类型
泛型:如:st<Double> doubles = new ArrayList<>();
字符串转换:将字符串转换成基本数据类型的时候:
int intValue = Integer.parseInt("123");

面试题七:说一下 Integer 高速缓存?


Integer的高速缓存是为了优化整数对象创建,类似于字符串常量池,但是这个缓存的范围是-128到127,通常是在自动装箱和拆箱的时候,性能会更好
如:
Integer a = 100; // 自动装箱,返回缓存中的对象
Integer b = 100; // 返回缓存中的相同对象
System.out.println(a == b); // true,引用同一个对象

Integer x = 200; // 超过缓存范围,新对象被创建
Integer y = 200; // 返回新创建的对象
System.out.println(x == y); // false,引用不同的对象

面试题八:为什么重写 equals 时,一定要重写 hashCode?


为了保证一致性,如果两个对象根据equals方法比较是相同的,那么相同的对象经过hashCode计算出的哈希值一定相同。

面试题九:什么是类型檫除?它有什么好处?

类型擦除是发生在Java泛型中的,Java泛型实现是在编译层,由于编译后生成的字节码不包含泛型中的类型信息,所以使用泛型的时候,加上类型参数会在编译器编译的时候去掉,这个过程就是类型擦除,在代码中定义List<Object>和List<String>等类型,在编译后都会变成List,JVM看到的只是List,而由泛型附加的类型信息对JVM是看不到的。
如:

public class Main {
? ? public static void main(String[] args) {
? ? ? ? List<String> list1 = new ArrayList();
? ? ? ? list1.add("String");
? ? ? ? List<Integer> list2 = new ArrayList<>();
? ? ? ? list2.add(10);
? ? ? ? System.out.println("两者相同吗?:"+(list1.getClass()==list2.getClass()));
? ? ? ? System.out.println("list1集合:"+list1.getClass());
? ? ? ? System.out.println("list2集合:"+list2.getClass());
? ? }
}


结果:
两者相同吗?:true
list1集合:class java.util.ArrayList
list2集合:class java.util.ArrayList
好处:
具有更好的扩展性,允许程序在许多情况下,不必关心具体类型
消除耦合:类型擦除可以有助于消除当代码中的类型依赖,降低代码之间的耦合,是因为欸类型擦除可以将所有类型都转换成Object类型
如:
ArrayList list = new ArrayList();
list.add("Hello");
list.add(123);
创建了一个ArrayList,并在其中添加了一个String和一个Integer。尽管这两个对象的类型不同,但由于类型擦除,我们可以将它们都视为Object,并将它们存储在同一个ArrayList中。

面试题十:什么是克隆?深克隆和浅克隆有什么区别?


克隆指的是创建一个与原始对象相同的新对象,他们具有相同的方法和属性,但是是两个不同的对象,在Java中通过clone()方法和实现Cloneable接口来实现对象的克隆
在Java中可以分为1深克隆和浅克隆
浅克隆:克隆出来的对象与原始对象共享引用类型的属性,新对象中引用类型属性指向是原始对象中的相同引用属性,如果修改新的对象中的引用类型属性,原始对象中的相应属性也会被修改通过clone()和Cloneable接口来实现浅克隆
深克隆:克隆出来的新对象与原始对象不共享引用类型和属性,也就是说新对象中的引用类型指向的是新对象。


?

文章来源:https://blog.csdn.net/loss_rose777/article/details/135720973
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。