2024Java面试题大全带答案

本文围绕Java基础、面试技巧以及常用集合框架展开,解答了JDK/JRE区别、equals与hashCode的区别、final的作用、字符串操作、HashMap与TreeMap选择等关键知识点,为面试者提供了实用的答案和技巧指导。
摘要由CSDN通过智能技术生成

本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自己的答案。

第一部分、Java 基础

1. JDK 和 JRE 有什么区别?

  • JDK是java的开发工具包,有JDK8,9甚至到14的差别,安装以后,不仅包含了java 的开发环境,比如java.exe,还包含了运行环境(jre)相关包。
  • JRE是java 运行环境,一般装好JDK后,系统里会有对应的JRE环境。

2. 说下你对== 和 equals 的认识,它们有什么差别?

对于==

  • 基本类型,比如int等,==比较的是值是否相同;
  • 引用类型,比如自定义对象:比较地址是否相同;
  • 尤其地,对常量,由于常量被放在常量池里管理,所以对String等常量,==也是比较值

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

需要全套资料及答案的在【翻到文章底部,点击名片】即可免费获取 备注:“CSDN”

对于equals 方法

  • 对于String,ArrayList等,equals方法是比较值;
  • 但在Object里,equals还是比较地址;
  • 如果自己创建了一个类,但没有重写equals方法,还是会比较地址

3. 如果两个对象的 hashCode值一样,则它们用equals()比较也是为 true,是不是?

不是

  • hashCode是定义在HashMap里,用以快速索引;
  • Object里,hashCode和equals是两个不同的方法,默认hashCode是返回对象地址,equals方法也是对比地址;
  • 两者不是一回事,可以通过重写对象的hashCode方法,让不同值的对象有相同的hashCode,但它们的equals方法未必相同

4. 综合说下final的作用

  • 修饰在类上,该类不能被继承。
  • 修饰在方法上,该方法不能被重写。
  • 修饰在变量上,叫常量,该常量必须初始化,初始化之后值就不能被修改,而常量一般全都是用大写来命名。

5. Math.round(-2.5) 等于多少?

结果是-2,因为该函数在数轴上,表现是向右取整,由此 Math.round(1.3) = 2。

6. String 是基本数据类型吗?

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

但说到这里,你要多说句。

  • String s = “abc”;,这是常量,放常量池管理。
  • 不建议频繁对String修改,因为会产生内存碎片。

7. 对字符串的都有哪些方法?详细说明下。

具体有String、StringBuffer和StringBuilder这三个类。

  • String是不可变类,每次操作都会生成新的String对象,并将结果指针指向新的对象,由此会产生内存碎片。
  • 如果要频繁对字符串修改,建议采用StringBuffer 和 StringBuilder。
  • StringBuffer 和 StringBuilder的差别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,由于无需维护线程安全的操作,所以StringBuilder 的性能要高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。由于大多数环境下是单线程,所以大多是用 StringBuilder。

8. String str="abc"与 String str=new String(“abc”)的定义方法一样吗?

不一样,String str="abc"的方式,java 虚拟机会将其分配到常量池中;所以建议这种写法。

而 String str=new String(“abc”) 则会被分到堆内存中,如果再频繁修改,会导致内存碎片。

9. 如何将字符串反转?

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

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

  • indexOf():返回指定字符的索引。
  • length():返回字符串长度。
  • equals():字符串比较。
  • replace():字符串替换。
  • trim():去除字符串两端空白。
  • split():分割字符串,返回一个分割后的字符串数组。
  • toLowerCase():将字符串转成小写字母。
  • toUpperCase():将字符串转成大写字符。
  • substring():截取字符串。

你面试时,说出其中的一两个即可,但需要说明如下的意思。

  • String s = “abc”;,这是常量,放常量池管理。

  • 不建议频繁对String修改,因为会产生内存碎片。

  • 如果要频繁对字符串修改,建议采用StringBuffer 和 StringBuilder

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

不需要的,抽象类不一定非要有抽象方法。但从面向对象思想角度来分析,不建议这样做。

因为在设计的时候,会把逻辑上存在但实际不存在的类设置成抽象类,比如动物类,毕竟不能直接展示“动物”。

正因为不存在,所以里面的方法未必能实现,比如“奔跑”方法,所以此类方法需要设置成没方法体的抽象方法。

如果在抽象类里方法,全都有方法体,那么要么是抽象类设计不当,或者实现了未必能实现的方法,所以建议修改。

12. 一般的类和抽象类有哪些区别?

  • 一般的类不能包含没有方法体的抽象方法,而抽象类可以包含抽象方法。
  • 抽象类不能直接用new来实例化,普通类可以直接实例化。

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

首先说明,语法上不能,然后再进一步从面向对象思想角度来说明。

定义抽象类的本意是,让其它类继承的,从而进一步完善对象。如果定义为 final 该类就不能被继承,这样就会有矛盾,所以 final 不能修饰抽象类。

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

  • 抽象类的子类要用extends 来继承;而实现接口要用 implements 。
  • 抽象类可以定义构造函数,而接口不能。
  • 抽象类里可以定义main 方法,但接口不能有 main 方法。
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

上述是从语法上来归纳,然后建议大家再从面向对象思想的角度来说明

  • 抽象类是对逻辑的归纳,比如动物类可以是抽象类,人类可以extends动物这个抽象类。
  • 而接口是对功能的归纳,比如可以定义一个“提供数据库访问功能”的 接口,在其中封装若干操作数据库的方法。

15. java 中 IO 流分为几种?

按功能来分可以分输入流(input)和输出流(output)。从类型来分可以是字节流和字符流。

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

  • BIO的英语全称是Block IO, 同步阻塞式 IO,就是平常经常使用的传统 IO,特点是简单方便,但并发处理能力低。
  • NIO,叫New IO, 同步非阻塞 IO,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  • AIO,Asynchronous IO, 是 NIO 的升级,实现了异步非堵塞 IO ,它是基于事件和回调机制。

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

  • Files.exists():检测路径是否存在。
  • Files.createFile():创建文件。
  • Files.createDirectory():创建文件夹。
  • Files.delete():删除文件或文件夹。
  • Files.copy():复制文件。
  • Files.move():移动文件,即复制后删除。
  • Files.size():查看文件的个数。
  • Files.read():读取文件。
  • Files.write():写入文件。

第二部分,Java的集合,也叫容器

18. java 的集合容器都有哪些?

如下给出了大致的结构

  • 所有线性表对象的父类是Collection
  • 有线性表类,比如ArrayList和Set等。
  • 有键值对类,比如HashMap。

19. Collection 和 Collections 有什么区别?

  • Collection 是一个集合接口,是所有线性表对象的父类。
  • Collections是集合类的一个工具类,包含了对集合元素进行排序和线程安全等各种操作方法。

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

21. HashMap 和 Hashtable 有什么区别?

首先说,两者都是键值类的对象

  • HashTable线程安全的,而HashMap线程不安全的,大多数的场景是单线程环境,在单线程环境下,HashMap效率上比hashTable要高。
  • HashMap允许空键值,而hashTable不允许。

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

对于在Map中进行插入、删除和定位元素这类操作,可以选HashMap。但如果你要对一个有序的key集合进行遍历,需要选TreeMap。

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

需要全套资料及答案的在【翻到文章底部,点击名片】即可免费获取 备注:“CSDN”

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

HashMap是基于数据结构里的散列表,在大数据情况下,能保证get的高效性。

HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

当向Hashmap对象里put元素时,会根据key的hashcode计算hash值,根据hash值得到这个元素在数组中的位置,如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

很抱歉,我无法提供完整的Java笔试题大全答案。但是,我可以为您提供一些常见的Java笔试题类型和一些参考答案,希望对您有所帮助。 1. Java基础知识 Q:Java中的八种基本类型是什么? A:byte、short、int、long、float、double、char、boolean。 Q:什么是Java中的自动装箱和拆箱? A:自动装箱是指将基本类型自动转换为相应的包装类型,拆箱则是将包装类型自动转换为相应的基本类型。例如: ``` int a = 123; Integer b = a; // 自动装箱 int c = b; // 自动拆箱 ``` 2. 面向对象编程 Q:什么是Java中的抽象类和接口?它们有什么区别? A:抽象类是一个不能被实例化的类,它的存在只是为了被子类继承。抽象类可以包含抽象方法和非抽象方法。接口是一组方法的集合,没有实现的方法,只有方法的签名,需要实现该接口的类来实现这些方法。 区别在于,抽象类可以包含成员变量和非抽象方法,而接口只能包含常量和抽象方法。另外,一个类只能继承一个抽象类,但是可以实现多个接口。 Q:Java中的多态是什么? A:多态是指同一种行为具有多种不同的表现形式或形态。在Java中,多态可以通过继承和接口来实现。例如: ``` class Animal { void makeSound() { System.out.println("Animal"); } } class Dog extends Animal { void makeSound() { System.out.println("Dog"); } } Animal a = new Dog(); a.makeSound(); // 输出Dog ``` 3. 异常处理 Q:Java中的异常分为哪些类型? A:Java中的异常分为受检异常和非受检异常两种类型。受检异常是指必须在方法声明中声明并处理的异常,例如IOException和SQLException;非受检异常是指RuntimeException及其子类,通常是由程序错误导致的异常,例如NullPointerException和ArrayIndexOutOfBoundsException。 Q:Java中的异常处理机制是什么? A:Java中的异常处理机制包括try-catch-finally语句和throw语句。try块中包含可能抛出异常的代码,catch块用于捕获异常并处理异常,finally块中的代码总是会被执行。throw语句用于手动抛出异常。例如: ``` try { // 可能会抛出异常的代码 } catch (Exception e) { // 处理异常 } finally { // 始终会执行的代码 } ``` 以上是一些常见的Java笔试题类型和参考答案,希望能够帮助您。但是请注意,在面试或者笔试中,考官可能会根据您的回答提出更深入的问题,所以最好还是对Java的各个方面有一个全面的了解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值