Java面试必备知识点:核心问题与解析

需积分: 5 1 下载量 17 浏览量 更新于2024-06-27 收藏 2.29MB DOCX 举报
"这是一份全面的Java面试题集,涵盖了从基础知识到高级概念的各种问题,包括JDK和JRE的区别、数据类型的使用、字符串操作、面向对象编程、异常处理、集合框架、输入输出流、多线程以及反射等关键知识点。这份资料适合准备Java面试的开发者使用,通过解答这些问题,可以深入理解Java编程的核心概念和技术应用。" 1. JDK(Java Development Kit)是Java开发工具集,包含了JRE(Java Runtime Environment)以及编译器、调试器和其他开发工具,用于编写、测试和运行Java程序。 2. `==`比较的是两个变量的引用是否相同,而`equals()`方法用于比较对象的内容是否相等。对于基本类型,两者行为类似;对于对象,`equals()`需要重写以实现有意义的比较。 3. `final`关键字用于声明不可变的变量、方法或类。在类中,final方法不能被子类重写;在变量前使用,表示该变量一旦赋值后不能改变;在类前使用,表示该类不能被继承。 4. `Math.round(-1.5)`会返回-1,因为`round`方法会四舍五入到最接近的整数。 5. String在Java中不是基础数据类型,而是对象,属于引用类型。 6. `String str="i"`创建了一个字符串常量,`new String("i")`则创建了新的String对象,两者不完全相同。 7. 字符串反转可以通过StringBuilder或StringBuffer的reverse()方法实现。 8. String类的常用方法包括:length()、charAt()、substring()、indexOf()、replace()、concat()等。 9. `newString("a")+newString("b")`会创建三个对象:两个临时的String对象和一个组合后的新的String对象。 10. 反转字符串可以使用StringBuilder或StringBuffer的reverse()方法,或者使用字符数组操作。 11. String类的常用方法包括:length()、charAt()、substring()、indexOf()、replace()、concat()等。 12. 普通类可以有实例方法和变量,可以被实例化;抽象类不能被实例化,通常包含抽象方法。 13. 接口是完全抽象的,只能定义方法和常量,不能有实现;抽象类可以有方法实现,可以包含字段和构造器。 14. Java的IO流分为字节流(Byte Stream)和字符流(Character Stream),按流向分为输入流和输出流。 15. BIO是 Blocking IO,同步并阻塞;NIO是 Non-blocking IO,非阻塞;AIO是 Asynchronous IO,异步IO。 16. Files类提供了一系列与文件和目录操作相关的方法,如read(), write(), copy(), move()等。 17. 反射是Java动态性的一个体现,可以在运行时获取类的信息并调用其方法、访问其字段。 18. Java序列化是将对象转换为字节序列的过程,用于持久化对象或在网络间传输。当对象需要存储或在网络上传输时,可能需要序列化。 19. 克隆用于复制一个对象,保持原有对象的状态。浅拷贝只复制对象本身,深拷贝还复制引用的对象。实现克隆可以通过实现Cloneable接口和覆盖clone()方法。 20. `throw`用于抛出一个异常,`throws`用于声明方法可能会抛出的异常。 21. `final`声明不可变的变量,`finally`在异常处理中确保代码块总是被执行,`finalize`是对象被垃圾回收前调用的方法。 22. try-catch-finally中,即使catch块中有return,finally块依然会执行。 23. 常见的异常类包括IOException、NullPointerException、ArrayIndexOutOfBoundsException等,都继承自Exception类。 24. hashCode()方法返回对象的哈希码,用于哈希表如HashMap的快速查找。不同的对象应有不同的哈希码,相等的对象应有相同的哈希码。 25. Java中操作字符串的主要类有String、StringBuilder和StringBuffer。String是不可变的,StringBuilder和StringBuffer是可变的,后者在多线程环境中更安全。 26. Java的引用类型包括强引用、软引用、弱引用和虚引用,分别对应不同级别的垃圾回收策略。 27. 静态方法属于类,不能直接访问非静态成员,因为非静态成员依赖于对象实例。 28. JavaBean的命名规范通常是首字母小写的驼峰式命名,属性与get/set方法匹配。 29. JavaBean属性命名通常遵循驼峰命名法,get和set方法分别对应属性名的首字母大写形式。 30. Java内存模型规定了线程之间的共享变量的读写规则,包括主内存和工作内存的概念,确保并发编程的正确性。 31. 重载(Overloading)发生在同一类中,方法名相同但参数列表不同;重写(Overriding)发生在子类对父类已有的方法进行重新定义。 32. 当需要扩展已有类的功能,但又不能直接修改源码时,更倾向于使用抽象类;而接口用于定义行为规范,更适合多实现的情况。 33. 实例化对象的方式包括:通过`new`关键字构造器、工厂方法、反射、克隆、序列化等。 34. byte类型的范围是-128到127,所以127+1会溢出,结果是-128。 35. Java容器主要包括List、Set、Map三大家族,如ArrayList、LinkedList、HashSet、TreeSet、HashMap、LinkedHashMap等。 36. Collection是所有单列集合的父接口,Collections是工具类,提供了集合操作的相关静态方法。 37. List是有序的、允许重复元素的集合,Set是无序的、不允许重复元素的集合。 38. HashMap和Hashtable都是键值对存储的映射,但HashMap是非线程安全的,性能更高;Hashtable是线程安全的,但效率较低。 39. HashMap的实现基于哈希表,通过键的hashCode进行快速定位,然后通过equals()比较键是否相等来完成存取。 40. Set的实现类包括HashSet、LinkedHashSet、TreeSet等,它们分别基于哈希表、链表+哈希表、红黑树实现。 41. HashSet基于哈希表实现,插入和查找的平均时间复杂度为O(1),但无顺序性。 42. ArrayList基于动态数组实现,适合随机访问,插入和删除元素性能相对较低;LinkedList基于双向链表,插入和删除快,但随机访问慢。 43. 数组与List之间的转换可以通过ArrayList的构造函数实现,或使用Arrays.asList()将数组转换成List,再通过toArray()将List转换回数组。 44. Queue中的poll()移除并返回队头元素,remove()则抛出并移除队头元素,两者主要区别在于异常处理方式。