面试题001-Java-Java基础

发布于:2024-07-02 ⋅ 阅读:(7) ⋅ 点赞:(0)

面试题001-Java-Java基础

题目自测

  • 1. Java 中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?
  • 2. String、StringBuffer 和 StringBuilder的区别是什么?String为什么是不可变的?
  • 3. String s1 = new String(“abc”); 这段代码创建了几个字符串对象?
  • 4. == 与 equals?hashCode 与 equals ?
  • 5. 包装类型的缓存机制了解么?
  • 6. 自动装箱与拆箱了解吗?原理是什么?
  • 7. 深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
  • 8. 谈谈对 Java 注解的理解,解决了什么问题?
  • 9. Exception 和 Error 有什么区别?
  • 10. Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?
  • 11. Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
  • 12. 内部类了解吗?匿名内部类了解吗?
  • 13. BIO,NIO,AIO 有什么区别?

题目答案

1. Java 中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?

答:Java包含8种基本数据类型,分别为字节类型byte占1字节,短整型short占2字节,整型int占4字节,长整型long占8字节,单精度浮点型float占4字节,双精度浮点型double占8字节,字符型char占2字节,布尔型boolean、官方没有明确定义、不同的JVM有不同的实现机制。
其对应的包装类型分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean。

2. String、StringBuffer 和 StringBuilder的区别是什么?String为什么是不可变的?

答:三者的区别主要体现在可变性、线程安全和性能这三方面。
1.String是不可变的,创建后无法修改。StringBuffer和StringBuilder是可变的,可以在原对象上进行修改。
2.String由于它的不变性和StringBuffer中的方法被 ‘synchronized’ (同步)修饰所以他两是线程安全的,StringBuilder中的方法不是同步的、因此在多线程环境中不安全。
3.String在频繁修改字符串时,每次修改都会创建新的对象,因此性能较差。StringBuffer由于有同步开销,性能会比StringBuilder差。
String不可变的原因是因为类中使用final修饰且为私有的字符数组来保存字符串,并且没有提供修改这个字符串的方法。被final修饰导致其不能被继承,进而避免了之类破坏它的不可变性。
扩展内容:
从 JDK 1.5 开始,编译器对字符串拼接进行了优化。当你在代码中使用 + 拼接字符串时,编译器会将这些操作转换为使用 StringBuilder 的 append 方法。在 JDK 9 及以后版本中,编译器进一步优化了字符串拼接,使用了 invokedynamic 字节码指令。这使得在运行时可以根据实际情况选择最优的拼接策略,从而提高性能。对于一般的字符串拼接任务,建议直接使用 +,这样代码更简洁易读。只有在非常高频的字符串拼接操作中,才可能考虑手动使用 StringBuilder 来进一步优化性能。

3. String s1 = new String(“abc”); 这段代码创建了几个字符串对象?

答:会创建1个或2个字符串对象。如果字符串常量池中不存在字符串对象"abc"的引用,会首先在常量池中创建一个"abc"对象(如果存在就不会创建),然后会在堆中创建一个新的字符串"abc"对象。

4. == 与 equals() ? hashCode() 与 equals() ?

答:== 用于比较基本类型的值是否相等,比较引用类型的引用是否相等(对象的地址)。
equals() 用于比较对象的内容是否相等,需要重写方法来比较对象的内容,默认是使用 ==。
hasdCode() 返回对象的哈希码,如果重写equals(),必须重写hashCode(),并确保相同的对象有相同的哈希码。

5. 包装类型的缓存机制了解么?

答:在Java中,为了提高性能,某些包装类型(如Integer、Byte、Short、Character和、Boolean)实现了缓存机制。这种机制对一定范围内如常用值进行了缓存,减少了频繁创建对象的开销。

6. 自动装箱与拆箱了解吗?原理是什么?

答:自动装箱是将基本类型转换为对应的包装类型,自动拆箱是将包装类型转换为对应的基本类型。
自动拆装箱的原理是通过编译器在编译期自动插入相应的方法调用来实现的,自动处理了基本类型和包装类型之间的转换。装箱是调用valueOf(),拆箱是调用xxValue()方法。

7. 深拷贝和浅拷贝区别了解吗?什么是引用拷贝?

答:他们说三种不同的对象复杂策略。
浅拷贝 只复制对象的属性值,如果属性是引用类型则只复制引用的地址。
深拷贝 递归地复制对象及其引用类型所引用的对象,生成一个完全独立的新对象。
引用拷贝 是复制对象的引用,两个变量指向一对象。

8. 谈谈对 Java 注解的理解,解决了什么问题?

答:注解是一种特殊的注释,用于描述代码的属性或行为。它不会直接影响代码的执行,但可以被编译器,开发工具、框架或运行时环境使用来进行某些处理或生成额外的代码。它解决了配置复杂、代码可读性差和缺乏编译时检查等问题,通过注解开发者可以更清晰的表达代码意图,并借助工具和框架进行更高效的开发。

9. Exception 和 Error 有什么区别?

答:在Java中Exception和Error都是继承自Throwable类的子类。他们的用途和处理方式不同。
Excepiton表示可以预期和处理的错误,程序应该通过捕获和处理这些异常来保证系统的稳定性,如空指针异常(NullPointerException)等。
Error表示严重的系统错误,程序一般无法处理这些错误,如内存不足(OutOfMemoryError)等。

10. Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?

答:Java反射是一种在运行时动态的获取类的信息,调用类中的方法和访问类中字段的机制。
它的缺点主要在性能和安全方面,反射需要在运行时查找、解析类的方法、属性等信息,相比直接方法调用会耗费更多的时间。反射可以绕过正常的访问控制,例如访问私有的方法和属性,可能会导致安全漏洞。
反射可以使得框架更加灵活、简洁地处理配置和依赖管理,支持动态代理,实现序列化和反序列化,并支持框架自身的扩展和自动配置。

11. Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?

答:泛型是JDK5中引入的新特性,允许在定义类、接口和方法时使用类型参数(T、E、K、V),在编译的时候进行类型检查,从而实现类型安全和代码重用。
类型擦除是Java泛型的一种实现机制,在编译时会将泛型信息擦除,类型参数会被替换为原始类型。
泛型提供了三种主要的通配符:<?> 无界通配符,表示可以持有任何类型的对象。<? extends T>上界通配符,表示泛型类型必须是T或其子类。<? super T>下界通配符,表示泛型类型必须是T或其超类。

12. 内部类了解吗?匿名内部类了解吗?

答:Java中内部类是定义在一个类内部的类。可以分为成员内部类、静态内部类、局部内部类和匿名内部类。内部类可以访问其外部类的所有方法和变量(包括私有的)。
匿名内部类是一种没有名字的内部类,通常用于实现接口或者继承类一个类,并且只需要使用一次的情况。通常用于事件处理、多线程编程等场景。

13. BIO,NIO,AIO 有什么区别?

答:BIO是同步阻塞I/O,适用于低并发、短连接的场景,每个连接需要一个独立的线程,线程消耗大。例传统的Socket编程。
NIO是同步非阻塞I/O,适用于高并发、长连接的场景,通过多路复用(Selector)实现,编程复杂度高。例聊天服务器、网络游戏等。
AIO是异步非阻塞I/O,适用于超高并发,大数据量大场景,通过异步回调机制处理I/O操作,编程模型相对简洁。例高性能服务器、消息中间件等。

参考资料