2024最新java面试题(面试必备)

1. JDK 和 JRE 有什么区别?
  • JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
  • JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。

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

基本数据类型:比较的值是否相等;
引用数据类型:如String,==比较的是引用是否指向同一块内存;euqals被重写了,比较的是引用指向内存中的值是否相等

篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记的【点击此处即可】即可免费获取

  1. String、StringBuffer和StringBuilder的区别?

String 大小固定,不可变

StringBuffer 大小可变,线程安全(有锁),同步,效率低,适用于多线程,低并发

StringBuilder 大小可变,线程不安全(无锁),不同步,效率高,适用于单线程,高并发

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

final 修饰的类叫最终类,该类不能被继承。

final 修饰的方法不能被重写。

final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

5. Java 中的 Math. round(-1. 5) 等于多少?

等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。

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

String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

  1. 什么是自动装箱与拆箱?

装箱:将基本类型用包装器类型包装起来

拆箱:将包装器类型转换为基本类型

  1. 方法覆写和方法重载的区别

方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。重写(也可以叫覆盖,覆写)是父类与子类之间多态性的一种表现,而重载是一个类中多态性的一种表现。

重载发生在一个类里面,方法名相同,参数列表不同(参数类型,个数、顺序不同),方法的返回值和修饰符可以不同。

重写发生在父类与子类之间,方法名相同,参数列表相同,返回值的范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,如果父类方法访问修饰符为private则子类不能重写该方法。

9. 如何将字符串反转?

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

示例代码:

StringBuffer stringBuffer = new StringBuffer();

stringBuffer. append("abcdefg");

System. out. println(stringBuffer. reverse()); // gfedcba

StringBuilder stringBuilder = new StringBuilder();

stringBuilder. append("abcdefg");

System. out. println(stringBuilder. reverse()); // gfedcba

10. String 类的常用方法都有那些?
  • inexOf():返回指定字符的索引。
  • charAt():返回指定索引处的字符。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • getBytes():返回字符串的 byte 类型数组。
  • length():返回字符串长度。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。
  • equals():字符串比较。
11. 抽象类必须要有抽象方法吗

不需要,抽象类不一定非要有抽象方法。

12. 普通类和抽象类有哪些区别?
  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类可以直接实例化。
13. 抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:

14. 接口和抽象类有什么区别?
  • 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有。
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

 篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记的【点击此处即可】即可免费获取

15. Java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

16. BIO、NIO、AIO 有什么区别?
  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
17. Files的常用方法都有哪些?
  • Files. exists():检测文件路径是否存在。
  • Files. createFile():创建文件。
  • Files. createDirectory():创建文件夹。
  • Files. delete():删除一个文件或目录。
  • Files. copy():复制文件。
  • Files. move():移动文件。
  • Files. size():查看文件个数。
  • Files. read():读取文件。
  • Files. write():写入文件。
容器
18. Java 容器都有哪些?

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:

  • Collection
  • List
    • ArrayList
    • LinkedList
    • Vector
    • Stack
  • Set
    • HashSet
    • LinkedHashSet
    • TreeSet
  • Map
  • HashMap
    • LinkedHashMap

  • TreeMap
  • ConcurrentHashMap
  • Hashtable
19. Collection 和 Collections 有什么区别?
  • Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。
  • Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法:Collections. sort(list)。
20. List、Set、Map 之间的区别是什么?

List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。

三者之间的区别,如下表:

21. HashMap 和 Hashtable 有什么区别?
  • 存储:HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
  • 线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
  • 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。
22. 如何决定使用 HashMap 还是 TreeMap?

对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。

23. 说一下 HashMap 的实现原理?

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

24. 说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

25. ArrayList 和 LinkedList 的区别是什么?
  • 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
  • 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
  • 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

26. 如何实现数组和 List 之间的转换?
  • 数组转 List:使用 Arrays. asList(array) 进行转换。
  • List 转数组:使用 List 自带的 toArray() 方法。
27. ArrayList 和 Vector 的区别是什么?
  • 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
  • 性能:ArrayList 在性能方面要优于 Vector。
  • 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。

 篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记的【点击此处即可】即可免费获取

28. Array 和 ArrayList 有何区别?
  • Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
  • Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
  • Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。
29. 在 Queue 中 poll()和 remove()有什么区别?
  • 相同点:都是返回第一个元素,并在队列中删除返回的对象。
  • 不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。

代码示例:

Queue<String> queue = new LinkedList<String>();

queue. offer("string"); // add

System. out. println(queue. poll());

System. out. println(queue. remove());

System. out. println(queue. size());

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

Vector、Hashtable、Stack 都是线程安全的,而像 HashMap 则是非线程安全的,不过在 JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就是 ConcurrentHashMap。

31. 迭代器 Iterator 是什么?

Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。

32. Iterator 怎么使用?有什么特点?

Iterator 使用代码如下:

List<String> list = new ArrayList<>();

Iterator<String> it = list. iterator();

String obj = it. next();

System. out. println(obj);

Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

33. Iterator 和 ListIterator 有什么区别?
  • Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
  • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
  • ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
34. 怎么确保一个集合不能被修改?

可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。

示例代码如下:

List<String> list = new ArrayList<>();

Collection<String> clist = Collections. unmodifiableCollection(list);

clist. add("y"); // 运行时此行报错

System. out. println(list. size());

多线程
35. 并行和并发有什么区别?
  • 并行:多个处理器或多核处理器同时处理多个任务。
  • 并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。
36. 线程和进程的区别?

一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。

37. 守护线程是什么?

守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在 Java 中垃圾回收线程就是特殊的守护线程。

38. 创建线程有哪几种方式?

创建线程有三种方式:

  • 继承 Thread 重写 run 方法;
  • 实现 Runnable 接口;
  • 实现 Callable 接口。
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以给你一些关于 Java 的面试资料: 1. 《Java 编程思想》(Thinking in Java)这本书是一本关于 Java 编程的经典教程,包含了 Java 的基础知识和一些比较复杂的主,对于准备 Java 面试非常有帮助。 2. 《Java 面试宝典》这是一本关于 Java 面试的专业书籍,包含了大量的 Java 面试和答案,可以帮助你更好地准备面试。 3. 《Java 核心技术·卷 I》(Java SE)这本书是 Oracle 出版的 Java 官方文档,包含了 Java SE 的所有核心知识,对于准备 Java 面试也是非常有帮助的。 4. 网上的模拟面试系统,比如 InterviewBit、LeetCode、HackerRank 等,都可以帮助你更好地准备面试,通过模拟面试的方式练习面试。 希望这些资料能帮助你准备 Java 面试。 ### 回答2: 很高兴为您提供关于Java面试的推荐资料。 首先,我建议您可以从以下几个方面来寻找相关的Java面试资料: 1. 书籍推荐:有许多经典的Java面试书籍可以帮助您准备面试。其中比较知名的包括《Java程序员面试宝典》、《剑指Offer》等。这些书籍中包含了大量的常见的Java面试及其解析,可以帮助您对Java面试有一个全面的了解。 2. 在线教育平台:目前有许多在线教育平台提供了丰富的Java面试资料,比如知乎、CSDN、博客园等。可以通过搜索关键词“Java面试”来获取大量相关资料,这些资料往往由经验丰富的Java工程师分享,包括常见的编程、算法、设计模式等。 3. 面试准备网站:有一些专门为面试准备提供资料的网站,比如牛客网、LeetCode等。这些网站提供了大量的编程和算法,可以帮助您熟悉常见的面试类型和解答思路,同时还可以通过参与在线编程竞赛提高解能力。 最后,我建议您在准备Java面试时,不仅要注重答案的准确性,还要理解其中的原理和背后的思想。此外,注意平衡理论与实践,多进行实际的编码练习,熟悉Java常用的开发工具和框架,这样在面试时才能更加游刃有余。祝您面试顺利! ### 回答3: 在准备Java面试过程中,推荐以下几种Java面试资料: 1. 《Java编程思想》:这是一本广为流传的Java经典书籍,不仅深入浅出地讲述了Java编程的基础知识,还涵盖了许多常见的面试。 2. 网上Java面试集:可以通过搜索引擎找到很多网上整理的Java面试集。一些知名的技术博客和论坛上也有Java面试必备库,可以多多搜索和收集。 3. Java相关的MOOC课程:选择一门优质的Java相关的在线课程,学习课程中的练习和考试目,这些目一般会紧密结合实际应用场景,有助于提升实战能力。 4. IT技术社区和博客:加入一些知名的IT技术社区或关注几个知名的技术博客,这些平台上的经验分享和技术讨论往往会涉及到一些面试相关的问,可以增加一些思路和解技巧。 5. 面试经验分享:在各种面试准备网站或社交媒体上,可以找到很多关于Java面试经验的分享。这些分享中有些会提到一些常问的问和经典的面试,可以作为参考。 需要注意的是,Java面试主要涵盖基础知识、算法与数据结构、多线程、IO、网络编程、设计模式等领域,建议综合多个资料和资源进行学习和准备,灵活选择适合自己的面试资料。同时,还要结合自己的实际经验和项目经历,进行针对性的准备和答技巧的培养。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值