Java 面试题精选:深度解析与讨论

需积分: 10 1 下载量 37 浏览量 更新于2024-09-08 收藏 415KB PDF 举报
"Java 全方面面试题,包含基础、高级等多个方面,旨在考察Java开发者的技术深度和广度,无答案,适用于准备Java面试的人员。" 以下是对部分面试题的详细解答: 1. Java中的基本数据类型包括整型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)。它们的字节数分别为:byte占1字节,short占2字节,int占4字节,long占8字节,float占4字节,double占8字节,char占2字节,boolean占1字节。 2. String类在Java中是final的,不能被继承,这是为了保证其不可变性,以及提高字符串操作的安全性和效率。 3. String、StringBuffer和StringBuilder都是用来处理字符串的。String是不可变对象,每次修改都会生成新对象;StringBuffer和StringBuilder是可变对象,但StringBuffer线程安全,StringBuilder非线程安全。在多线程环境下推荐使用StringBuffer,单线程环境下StringBuilder更高效。 4. ArrayList和LinkedList都是集合框架的一部分。ArrayList基于动态数组实现,查询快,插入删除慢;LinkedList基于双向链表,插入删除快,但查询慢。 5. 类实例化顺序:首先加载静态成员(静态数据、静态初始化块),然后是父类的非静态初始化块和构造函数,接着是子类的非静态初始化块和构造函数,最后是实例字段的初始化。 6. 常见的Map类有HashMap、TreeMap、LinkedHashMap等。HashMap是非线程安全的,适合单线程环境。并发下可使用ConcurrentHashMap,它是线程安全的。HashMap使用哈希表存储,TreeMap使用红黑树,LinkedHashMap保持插入顺序或访问顺序。 7. Java 8的ConcurrentHashMap放弃分段锁是因为分段锁的粒度过大,降低了并发性能。采用CAS和Synchronized进行细粒度锁,提高了并发性能。 8. 有序的Map实现类有TreeMap,它使用红黑树保证了元素的排序。 9. 抽象类可以有方法实现,接口只有方法声明。类只能单继承,但可以多实现接口。接口可以多继承。 10. 继承是"is-a"关系,聚合是"has-a"关系。继承强调的是类的层次结构,聚合强调的是组件间的组合关系。 11. IO模型有阻塞IO(BIO)、非阻塞IO(NIO)、异步IO(AIO)。NIO(New IO)提供了选择器和通道,实现了多路复用,解决了BIO中等待I/O时阻塞的问题。 12. 反射是Java运行时动态获取类信息和调用方法的能力。创建类实例的方式有:newInstance()、Constructor的newInstance()和反射获取构造函数后直接调用。 13. Class.forName()是通过类名加载类并返回Class对象,ClassLoader主要负责类的加载工作。两者用途不同,Class.forName()通常用于运行时动态加载类。 14. 动态代理主要有两种实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,CGLIB基于字节码生成类的子类。JDK动态代理简单易用,但需要目标类实现接口;CGLIB无需接口,但可能性能稍差。 15. CGLIB动态代理是通过字节码技术生成目标类的子类来实现,可以对接口和类实现代理。而JDK动态代理只能对实现了接口的类生成代理。 16. CGlib可以对接口实现代理是因为它实际上生成的是目标类的子类,即使目标类没有实现接口,也可以生成子类并添加代理方法。 17. final关键字用于声明常量、变量和方法,确保值不会被改变,或者确保类不能被继承,或者方法不能被重写。 18. 单例模式常见的实现有:饿汉式(静态常量)、懒汉式(线程不安全)、双重检查锁定、静态内部类、枚举等。每种实现方式有其优缺点,如饿汉式线程安全但可能会浪费内存,双重检查锁定兼顾线程安全和延迟加载。 19. 使用`Object.equals()`和`Object.hashCode()`可以自动生成`equals()`和`hashCode()`的实现,但这可能导致意外的相等判断,且未考虑到业务逻辑。手动实现更灵活,但需遵循约定,如`equals()`为true时`hashCode()`必须相同。 20. 访问修饰符的作用:public表示公共访问,任何地方都能访问;private表示私有,只允许本类访问;protected允许同一包及子类访问;default(默认)只允许同包内访问。设计时,需根据需求控制访问权限,平衡封装性、继承性和协作性。 21. 深拷贝和浅拷贝主要区别在于复制的对象是否包含引用。深拷贝会创建完全独立的对象,包括其内部的所有属性,而浅拷贝只复制对象本身,不复制引用对象。 22. 数组的时间复杂度:查找、插入、删除均取决于索引,所以是O(1)。链表的时间复杂度:查找取决于查找位置,平均O(n),插入和删除是O(1)。 23. Error是程序无法处理的错误,如系统级错误、资源耗尽等。Exception是程序可以捕获和处理的异常,分为CheckedException(编译期需要处理)和RuntimeException(运行时异常)。 24. 运行时异常包括空指针异常(NullPointerException)、算术异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)、除以零异常(ZeroDivisionException)等。 25. 自定义的java.lang.String类无法运行,因为String是final的,不能被继承。如果需要自定义字符串类,应使用不同的命名避免冲突,并注意遵循Java的命名规范。 以上仅是部分面试题的详细解答,实际面试中还需要对其他问题进行深入探讨和解答。