Java面试八股文整理

一、Java 基础

 1. **JDK 和 JRE 有什么区别?**

    - **JDK(Java Development Kit)**是Java开发工具包,包含了开发Java应用所需的工具和库,包括编译器(javac)、JVM(Java Virtual Machine)等。
    - **JRE(Java Runtime Environment)**是Java运行时环境,它包含JVM以及运行Java程序所需的基本库,但不包括开发工具。JDK包含JRE,而JRE不包含JDK。

 2. **== 和 equals 的区别是什么?**

    - `==` 用于比较基本数据类型的值或对象引用是否相同。对于对象,它比较的是内存地址。
    - `equals()` 是 `Object` 类的方法,用于比较两个对象的内容是否相等。对于自定义对象,通常需要重写该方法来比较内容。

 3. **两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?**

    - **不对**。虽然根据 `hashCode()` 值相同的两个对象可能会相等,但它们不一定是相等的对象。`equals()` 方法可以根据业务逻辑判断两个对象是否相等。

 4. **final 在 Java 中有什么作用?**

    - `final` 可以用于修饰类、方法和变量:
      - **修饰类**:表示该类不能被继承。
      - **修饰方法**:表示该方法不能被重写。
      - **修饰变量**:表示该变量是常量,值不能修改。

 5. **java 中的 Math.round(-1.5) 等于多少?**

    - `Math.round()` 方法返回的是四舍五入后的整数值。`Math.round(-1.5)` 返回 `-1`,因为四舍五入规则会将 `-1.5` 向零舍入。

 6. **String 属于基础的数据类型吗?**

    - **不**,`String` 是一个对象类型,它属于 Java 的类库中的 `String` 类,不是基本数据类型。

 7. **java 中操作字符串都有哪些类?它们之间有什么区别?**

    - 常用的类有:
      - `String`:不可变的字符序列。
      - `StringBuilder` 和 `StringBuffer`:可变的字符序列,`StringBuffer` 是线程安全的,`StringBuilder` 不是。

 8. **String str="i" 与 String str=new String("i") 一样吗?**

    - **不一样**。`str="i"` 会从常量池中获取 `"i"` 字符串;`new String("i")` 会在堆内存中创建一个新的 `String` 对象。

 9. **如何将字符串反转?**

    - 可以通过 `StringBuilder` 或 `StringBuffer` 来实现:

      ```Java
      String str = "hello";
      String reversed = new StringBuilder(str).reverse().toString();
      ```

 10. **String 类的常用方法都有哪些?**

     - 常用方法包括:`length()`、`charAt()`、`substring()`、`indexOf()`、`equals()`、`toLowerCase()`、`toUpperCase()`、`replace()` 等。

 11. **抽象类必须要有抽象方法吗?**

     - **不**,抽象类不一定要有抽象方法。它可以有实现的方法和成员变量。

 12. **普通类和抽象类有哪些区别?**

     - 抽象类不能实例化,普通类可以;抽象类可以有抽象方法,普通类没有。

 13. **抽象类能使用 final 修饰吗?**

     - **可以**,但如果抽象类被 `final` 修饰,那么它不能被继承。

 14. **接口和抽象类有什么区别?**

     - 接口只能包含抽象方法,不能有方法实现(Java 8 之后可以有默认方法)。抽象类可以包含抽象方法和已实现的方法。接口用于定义行为规范,抽象类用于共享代码。

 15. **java 中 IO 流分为几种?**

     - Java 中的 IO 流主要分为:
       - **字节流**(InputStream 和 OutputStream)
       - **字符流**(Reader 和 Writer)

 16. **BIO、NIO、AIO 有什么区别?**

     - **BIO(阻塞 IO)**:传统的 IO 模型,每个请求都需要一个线程来处理。
     - **NIO(非阻塞 IO)**:基于缓冲区和通道,支持异步操作,能通过一个线程处理多个请求。
     - **AIO(异步 IO)**:操作系统级别的异步 IO,完全由操作系统进行管理,不需要线程轮询。

 17. **Files 的常用方法都有哪些?**

     - 常用方法有:`createFile()`、`delete()`、`exists()`、`copy()`、`move()`、`readAllLines()`、`write()` 等。

 18. **String s = "a" + "b" + "c" 创建了几个对象?为什么? String s = new String("a") 创建了几个对象?**

     - 第一个例子中,创建了 3 个对象:两个 `String` 对象(`"a"` 和 `"b"`)和一个新的字符串拼接结果(`"abc"`),其中 `"a"` 和 `"b"` 可能是从常量池中获取。
     - 第二个例子中,创建了两个对象:一个常量池中的 `"a"` 字符串和一个 `new String("a")` 对象。

 19. **String 中 equals 和 == 的区别?**

     - `==` 比较的是两个对象的内存地址,是否是同一个对象。
     - `equals()` 比较的是两个对象的内容是否相等。

 20. **Java 的元注解有哪些?**

     - Java 中的元注解有:`@Retention`、`@Target`、`@Documented`、`@Inherited`。

 21. **父类和子类中静态方法、构造代码块、构造方法他们的执行顺序?**

     - 执行顺序为:
       1. 父类静态代码块
       2. 子类静态代码块
       3. 父类构造代码块
       4. 父类构造方法
       5. 子类构造代码块
       6. 子类构造方法

 22. **面向对象七大原则和三大特性?**

     - **三大特性**:封装、继承、多态。
     - **七大原则**:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、最少知道原则、合成聚合复用原则。

二、容器

 1. **java 容器都有哪些?**

    - Java 容器类分为两大类:
      - **Collection**:用于存储一组数据的对象,如 `List`、`Set`、`Queue`。
      - **Map**:用于存储键值对的对象,如 `HashMap`、`TreeMap`、`Hashtable`。

 2. **Collection 和 Collections 有什么区别?**

    - **Collection** 是一个接口,表示所有集合类的通用父类。
    - **Collections** 是一个工具类,包含操作集合的静态方法,如排序、查找、同步等。

 3. **List、Set、Map 之间的区别是什么?**

    - **List**:有序且允许重复元素,例如 `ArrayList`、`LinkedList`。
    - **Set**:无序且不允许重复元素,例如 `HashSet`、`LinkedHashSet`。
    - **Map**:存储键值对,键不可重复,值可以重复,例如 `HashMap`、`TreeMap`。

 4. **HashMap 和 Hashtable 有什么区别?**

    - **HashMap**:线程不安全,允许一个 `null` 键和多个 `null` 值。
    - **Hashtable**:线程安全,不允许 `null` 键或值。

 5. **如何决定使用 HashMap 还是 TreeMap?**

    - **HashMap**:如果不需要排序,使用 `HashMap`,它的查找和插入效率更高。
    - **TreeMap**:如果需要按键排序,使用 `TreeMap`。

 6. **说一下 HashMap 的实现原理?**

    - `HashMap` 是基于哈希表(数组 + 链表/红黑树)实现的。键的 `hashCode()` 值决定了元素存储的位置,当发生哈希冲突时,采用链表或红黑树解决。

 7. **说一下 HashSet 的实现原理?**

    - `HashSet` 底层是使用 `HashMap` 实现的,唯一性是通过 `HashMap` 中的键来保证的。

 8. **ArrayList 和 LinkedList 的区别是什么?**

    - **ArrayList**:基于数组实现,支持快速随机访问,但在插入和删除元素时效率较低。
    - **LinkedList**:基于链表实现,支持高效的插入和删除操作,但随机访问较慢。

 9. **如何实现数组和 List 之间的转换?**

    - 数组转 `List`:`Arrays.asList(array)`
    - `List` 转数组:`list.toArray(new Type[0])`

 10. **ArrayList 和 Vector 的区别是什么?**

     - **ArrayList**:线程不安全,性能较好。
     - **Vector**:线程安全,但性能较差。

 11. **Array 和 ArrayList 有何区别?**

     - **Array**:大小固定,可以存储基本数据类型和对象。
     - **ArrayList**:大小可变,只能存储对象。

 12. **在 Queue 中 poll() 和 remove() 有什么区别?**

     - **poll()**:如果队列为空,返回 `null`。
     - **remove()**:如果队列为空,抛出 `NoSuchElementException`。

 13. **哪些集合类是线程安全的?**

     - `Vector`、`Hashtable`、`CopyOnWriteArrayList`、`CopyOnWriteArraySet`、`ConcurrentHashMap`。

 14. **迭代器 Iterator 是什么?**

     - `Iterator` 是一个接口,用于遍历集合中的元素。

 15. **Iterator 怎么使用?有什么特点?**

     - 使用方法:

       ```java
       Iterator it = collection.iterator();
       while (it.hasNext()) {
           Object obj = it.next();
       }
       ```

     - 特点:`Iterator` 可以避免 `ConcurrentModificationException`,且不支持修改集合内容。

 16. **Iterator 和 ListIterator 有什么区别?**

     - `Iterator` 只能向前遍历集合。
     - `ListIterator` 支持双向遍历,可以同时修改集合。

 17. **怎么确保一个集合不能被修改?**

     - 可以使用 `Collections.unmodifiableList()`、`Collections.unmodifiableSet()` 等方法,返回不可修改的集合。

 18. **HashSet 如何检查重复?**

     - `HashSet` 使用 `hashCode()` 和 `equals()` 方法来检查元素是否重复。

 19. **线程安全的 Map 有哪些?**

     - `Hashtable`、`ConcurrentHashMap`、`Collections.synchronizedMap()`。

 20. **HashMap 的负载因子为什么是 0.75?**

     - 负载因子 0.75 是一个折衷选择,它在内存使用和性能之间取得了较好的平衡。当 `HashMap` 的大小达到容量的 75% 时,进行扩容。

三、多线程

  1. 并行和并发有什么区别?
    • 并发:多个任务在同一时间段内交替进行,但不一定是同时执行。
    • 并行:多个任务在同一时刻同
Java面试八股文是指在准备Java面试时需要重点掌握的一些核心知识和常见问题。下载Java面试八股文是为了将这些知识和问题整理成一份文档,方便学习和准备。这份文档通常包含Java基础知识、Java集合框架、多线程、IO流、数据库、设计模式、网络编程等各个方面的问题和答案。 Java面试八股文的下载对于准备面试的候选人来说非常重要。因为Java面试的问题种类繁多,面试官可能会选择任意一个方面进行提问。同时,面试官一般会倾向于问一些经典的问题,以便评估候选人对于基础和核心知识的掌握程度。如果候选人能够提前下载并学习这份八股文,不仅可以提高回答问题的准确性和流利度,还能够帮助候选人在面试中更好地展示自己的能力和优势。 当然,光有Java面试八股文还远远不够,候选人还需要结合自己在实际项目中的经验、对于面试岗位的理解以及对于技术的持续学习来进行综合准备。另外,面试本身也不是仅仅靠死记硬背答题,更重要的是能够准确理解问题的本质,提出合理的解决思路和方案,并能够清晰地表达自己的观点和思考过程。 总的来说,下载Java面试八股文是为了提高面试准备的效率和质量,但准备八股文只是面试准备的一部分,更重要的是掌握基础知识、理解问题本质,发展自己的解决问题的能力。希望以上回答对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值