Java高频面试题合集——【Java基础、IO流、Java异常、Java集合、Java并发】高频面试题汇总

本文详细阐述了Java开发中的关键概念,包括JDK、JRE和JVM的关系,反射机制的应用,线程的创建、同步与管理,异常处理机制,以及集合框架中的重要类如HashMap、HashSet和线程安全。此外,还讨论了锁的实现与优化,如synchronized和ReentrantLock的差异,以及线程池的作用和优势。
摘要由CSDN通过智能技术生成

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

文章目录

1、JDK、JRE和JVM三者之间的关系?

JDK(Java Development Kit): 是 Java 开发工具包,是整个 Java 的核心。

JRE( Java Runtime Environment): 是 Java 的运行环境。

JVM(Java Virtual Machine): 是 Java 虚拟机,是整个 Java 实现跨平台的最核心的部分,能够运行以 Java 语言编写的软件程序。所有的 Java 程序会首先被编译为 .class 的类文件,这种类文件可以在虚拟机上执行。


2、Java中创建对象有几种方式?

  1. 使用 new 关键字

  2. 通过反射机制创建,该方法调用无参的构造器创建对象(反射):Class.forName.newInstance()

  3. 使用 clone() 方法

  4. 反序列化,比如调用 ObjectInputStream 类的 readObject() 方法。


3、==和equals()有什么区别?

==运算符:

  • 作用于基本数据类型时,是比较两个数值是否相等;

  • 作用于引用数据类型时,是比较两个对象的内存地址是否相同,即判断它们是否为同一个对象;

equals()方法:

  • 没有重写时,Object默认以 == 来实现,即比较两个对象的内存地址是否相同;

  • 进行重写后,一般会按照对象的内容来进行比较,若两个对象内容相同则认为对象相等,否则认为对象不等。


4、重写和重载的区别?

重载 发生在同一个类中,若多个方法之间 方法名相同、参数列表不同,则它们构成重载的关系。重载与方法的返回值以及访问修饰符无关,即重载的方法不能根据返回类型进行区分。

重写 发生在父类子类中,若子类方法想要和父类方法构成重写关系,则它的 方法名、参数列表必须与父类方法相同。另外,返回值要小于等于父类方法,抛出的异常要小于等于父类方法,访问修饰符则要大于等于父类方法。还有,若父类方法的访问修饰符为private,则子类不能对其重写。


5、构造方法有哪些特性?

  1. 名字与类名相同;
  2. 没有返回值,但不能用 void 声明构造函数;
  3. 成类的对象时自动执行,无需调用。

6、自动装箱和自动拆箱的区别?

  • 自动装箱:可以把一个基本类型的数据直接赋值给对应的包装类型;

  • 自动拆箱:可以把一个包装类型的对象直接赋值给对应的基本类型;

通过自动装箱、自动拆箱功能,可以大大简化基本类型变量和包装类对象之间的转换过程。比如,某个方法的参数类型为包装类型,调用时我们所持有的数据却是基本类型的值,则可以不做任何特殊的处理,直接将这个基本类型的值传入给方法即可。


7、Integer 和 int 的区别?

  • int是基本数据类型,Integer是int的包装类;
  • int型变量的默认值是0,Integer变量的默认值是null,这一点说明Integer可以区分出未赋值和值为0的变量;
  • Integer变量必须实例后才可以使用,而int不需要。

8、说一说hashCode()和equals()的关系?

hashCode()用于获取哈希值,eauqls()用于比较两个对象是否相等,它们应遵守如下规定:

  • 如果两个对象相等,则它们必须有相同的哈希值。

  • 如果两个对象有相同的哈希码,则它们未必相等。


9、为什么重写 equals() 时必须重写 hashCode() 方法?

Object类提供的equals()方法默认是用==来进行比较的,也就是说只有两个对象是同一个对象时,才能返回相等的结果。而实际的业务中,我们通常的需求是,若两个不同的对象它们的内容是相同的,就认为它们相等。鉴于这种情况,Object类中equals()方法的默认实现是没有实用价值的,所以通常都要重写。

如果重写 equals() 时没有重写 hashCode() 方法的话,就可能会导致 equals() 方法判断是相等的两个对象,哈希值却不相等。


10、String、StringBuilder、StringBuffer 的区别?

  • String 中的对象是不可变的,也就可以理解为常量,线程安全。

  • StringBuilder与 StringBuffer类似,都是字符串缓冲区,但线程不安全;

  • StringBuffer 对方法加了同步锁,因此线程安全。

执行效率:StringBuilder > StringBuffer > String


11、浅拷贝和深拷贝的区别?

  • 浅拷贝:拷贝对象与原始对象是同一个对象,浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值也会随之变化,这就是浅拷贝;
  • 深拷贝:拷贝对象与原始对象是同两个对象,深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝。

深拷贝的实现就是在引用类型所在的类实现 Cloneable 接口,并使用 public 访问修饰符 重写 clone 方法

在这里插入图片描述


12、抽象类和接口的区别?

  • 抽象类中可以定义构造函数,接口不能定义构造函数;

  • 抽象类中可以有抽象方法和具体方法,而接口中只能有抽象方法;

  • 抽象类中的成员权限可以是public、默认、protected,而接口中的成员权限只能是public;

  • 抽象类中可以包含静态方法,而接口中不可以包含静态方法。


13、静态变量和实例变量的区别?

  • 静态变量: 是被static修饰的变量,它属于类,因此不管创建多少个对象,静态变量在内存中有且只有一个拷贝,静态变量可以实现让多个对象共享内存;
  • 实例变量:属于某一实例,需要先创建对象,然后通过对象才能访问到它。

14、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?

  • 对于 short s1 = 1; s1 = s1 + 1; 来说,在 s1 + 1 运算时会自动提升表达式的类型为 int ,那么将 int 型值赋值给 short 型变量,s1 会出现类型转换错误。

  • 对于 short s1 = 1; s1 += 1; 来说,+= 是 Java 语言规定的运算符,Java 编译器会对它进行特殊处理,因此可以正确编译。


15、final、finally和finalize 有什么区别?

  • final 和 finally 是Java中的关键字,而 finalize 是一个方法;
  • final:用于修饰类、变量和方法,表示这个类、变量和方法不能被继承或重写;
  • finally: 是在 try-catch 语句中使用的关键字,表示不管是否发生异常,finally中的代码都会执行;
  • finalize: 是Object() 类中的一个方法,是一个在垃圾回收器将对象从内存中清除之前调用的方法。

16、什么是Java反射机制?Java反射有哪些应用场景?

Java反射指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。

Java的反射机制常见的应用场景有:

  • 使用JDBC时,如果要创建数据库的连接,则需要先通过反射机制加载数据库的驱动程序;

  • 多数框架都支持注解/XML配置,从配置中解析出来的类是字符串,需要利用反射机制实例化;

  • 面向切面编程(AOP)的实现方案,是在程序运行时创建目标对象的代理类,这必须由反射机制来实现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术一点通

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值