java 基础高频面试题总结

本文总结了Java编程中的高频面试题,涵盖了重载与重写、面向对象特性、构造方法、静态方法与实例方法的区别、冒泡排序算法、抽象类与接口的区别、内存泄漏、线程实现方式、同步方法、HashMap与HashTable对比、集合类List、Map、Set的区别、String、StringBuffer与StringBuilder的差异、垃圾回收机制、接口继承与类继承、内存区域等核心知识点,旨在帮助读者巩固和理解Java基础知识。

文章目录

1.重载和重写的区别

重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。   
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

2. Java 面向对象编程三大特性:封装、继承、多态.

封装

封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

继承

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。

关于继承如下 3 点请记住:**

  1. 子类拥有父类非 private 的属性和方法。
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。(以后介绍)。

多态

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

概括:子类对象指向父类的引用

3.构造方法有哪些特性

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

4.静态方法和实例方法有何不同

  1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

  2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制.

5. 写出冒泡排序的算法

for(int i=0;i<arr.length-1;i++){ //控制轮数
for(int j=0;j<arr.length-1-i;j++){ //控制每一轮的次数
if(arr[j]>arr[j+1]){ //每次都是和它下一个元素比
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;-
}
}
}

6. abstract class 和 interface 有什么区别?

             abstract class	                                                                   interface

实例化 不能 不能

类 一种继承关系,一个类只能使用一次继承关系。 一个类可以实现多个interface
可以通过实现多个接口

数据成员 可有自己的 静态的不能被修改即必须是static final,一般不在此定义

方法 可以私有的,非abstract方法,必须实现 不能有私有的,默认是public,abstract 类型

变量 可有私有的,变量有默认的类型, 不可有私有的,默认是public static
其值可以在子类中重新定义,也可以重新赋值 final 型,且必须给其初值,实现类中
不能重新定义,不能改变其值

设计理念 表示的是“is-a”关系 表示的是“like-a”关系

实现 需要继承,要用extends 要用implements

1.相同点
A. 两者都是抽象类,都不能实例化。
B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

  1. 不同点
    A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
    B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
    C. interface强调特定功能的实现,而abstract class强调所属关系。
    D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。

7.java中会存在内存泄露吗?请简单描述

答:内存泄露是指系统中存在无法回收的内存,
有时候会造成内存不足或系统崩溃。Java存在内存泄露。
Java中的内存泄露当然是指:存在无用但是垃圾回收器无法回收的对象。
而且即使有内存泄露问题存在,也不一定会表现出来。
自己实现堆栈的数据结构时有可能会出现内存泄露。

8.讲一下线程的几种实现方式?

extends Thread
implements Runnable
implements Callable
Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run()。
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。

9.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

答:多线程有两种实现方法:继承Thread类或者实现Runnable接口。
实现同步也有两种方法:一种是同步方法,另一种是同步代码块。
同步方法是在方法返回类型前面加上synchronized关键字
同步代码块是synchronized (这里写需要同步的对象){…}

10.sleep()和wait()有什么区别?

  1. Thread类的方法:sleep(),yield()等
    Object的方法:wait()和notify()等
    2.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
    sleep方法没有释放锁,
    wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
    3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
    4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

11. 谈谈你对面向对象的理解?

面向对象的三大特点:封装,继承,多态.

所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。

继承有点类似与我们生物学上的遗传,就是子类的一些特征是来源于父类的,儿子遗传了父亲或母亲的一些性格,或者相貌,又或者是运动天赋。有点种瓜得瓜种豆得豆的意思。面向对象里的继承也就是父类的相关的属性,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有点我们只要拿过来用就好了。而对于自己类里面需要用到的新的属性和方法,子类就可以自己来扩展了。当然,会出现一些特殊情况,就是我们在有一些方法在父类已经定义好了,但是子类我们自己再用的时候,发现,其实,我们的虽然都是计算工资的,但是普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。这个时候我们就需要用到面向对象的另一个特性.

多态。对,就是多态,我们要在子类里面把父类里面定义计算工资的方法在子类里面重新实现一遍。多态包含了重载和重写。重写很简单就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了,当然啦,你还是可以通过super.CaculSalary方法来调用父类的工资计算方法。而重载就是类里面相同方法名,不同形参的情况,可以是形参类型不同或者形参个数不同,或者形参顺序不同,但是不能使返回值类型不同。

12. 简单讲一下java的跨平台原理

java源程序(.java文件)通过编译器编译成为Class文件(字节码文件),而它的class文件是基于字节码(以byte为单位存储的文件)的,而字节码文件是描述程序要运行的的虚指令的集合,这些虚指令的集合与任何的平台无关,Java虚拟机认识它(只要在不同的平台下部署相应的jre,运行jvm!就可以了)

13. 说一下"=="和equals方法究竟有什么区别?

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型比较的是值,引用数据类型比较的是内存地址)

equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
  • 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

举个例子:

public class test1 {
   
   
    public static void main(
<think>好的,我需要处理用户关于Java高频面试题的查询。首先,用户提到了几个引用内容,包括JDK、JRE、JVM的区别,wait/notify方法的位置,以及MQ消息幂等性的处理。我的任务是根据这些引用生成相关的问题,并确保格式正确。 首先,我要确认用户的需求是获取Java高频面试题的汇总,特别是最新整理的。用户提供的引用内容中,已经有一些问题,比如第5点类加载器的作用,第6点wait等方法定义在Object类的原因,以及MQ的幂等性处理。我需要围绕这些主题生成相关问题,并确保符合格式要求。 接下来,我需要检查是否有遗漏的领域。用户提供的引用涉及到JVM基础、多线程、消息队列(RocketMQ/RabbitMQ),这些都是Java面试中的常见主题。可能还需要覆盖集合、并发编程、JVM内存模型、设计模式、Spring框架、数据库等热门话题。 然后,我需要确保每个问题都是高频且符合最新的趋势。例如,关于JDK新特性的问题,如Java 8的Stream API或模块化系统,都是常见的。另外,Spring Boot的自动配置原理和微服务相关的问题也是当前的热点。 在生成问题时,要避免重复,并确保问题之间有逻辑性。例如,从基础到进阶,或者按技术领域分类。同时,每个问题需要明确,能够引导面试者展示其知识深度。 最后,按照用户的示例结构,先给出一个概览,再列出相关问题,并在每个问题后添加引用标识。确保所有数学公式正确使用$...$或$$...$$格式,虽然当前问题可能不涉及数学公式,但需要保持警惕。同时,使用中文回答,结构清晰,分点列出。</think>### Java 高频面试题汇总(最新整理) #### 1. **JVM 基础** - **JDK、JRE、JVM 的区别与联系** JDK 包含开发工具和 JRE,JRE 包含运行环境和 JVM,JVM 是跨平台的核心组件[^1]。 - **类加载器的作用是什么?如何实现双亲委派机制?** 类加载器负责将字节码加载到内存,双亲委派通过优先委派父类加载器避免重复加载。 #### 2. **多线程与并发编程** - **为什么 `wait()`、`notify()`、`notifyAll()` 定义在 `Object` 类而非 `Thread` 类?** 因为这些方法依赖于对象锁,任何对象都可作为锁,需与对象关联而非线程[^2]。 - **线程池的核心参数有哪些?拒绝策略如何选择?** 核心参数包括核心线程数、最大线程数、队列类型等;拒绝策略有丢弃任务、抛出异常等。 #### 3. **消息队列(MQ)** - **如何保证消息消费的幂等性?** 可通过唯一消息 ID 验证,消费者根据 ID 判断是否已消费[^3]。 - **RocketMQ 如何实现消息顺序性?** 通过同一队列内消息顺序存储和单线程消费保证。 #### 4. **集合框架** - **HashMap 的底层实现与扩容机制** 基于数组+链表/红黑树,扩容时容量翻倍并重新哈希。 #### 5. **JVM 内存模型** - **堆和栈的区别?哪些数据存储在堆中?** 堆存储对象实例,栈存储局部变量;对象和数组在堆中分配。 #### 6. **设计模式** - **单例模式的实现方式及优缺点** 包括饿汉式、懒汉式(双重检查锁)、静态内部类、枚举等。 #### 7. **Spring 框架** - **Spring AOP 的实现原理** 基于动态代理(JDK 或 CGLIB)实现横切逻辑的织入。 - **Bean 的生命周期包含哪些阶段?** 实例化、属性填充、初始化、使用、销毁。 #### 8. **数据库与事务** - **MySQL 的索引优化原则** 遵循最左前缀原则,避免冗余索引,使用覆盖索引减少回表。 #### 9. **分布式系统** - **CAP 理论如何权衡一致性、可用性、分区容错性?** 分布式系统需在 CAP 中至少满足两项,通常选择 CP 或 AP。 §§ 1. 如何通过 JVM 参数优化垃圾回收性能? 2. `synchronized` 和 `ReentrantLock` 的实现机制有何区别? 3. RocketMQ 的消息持久化策略是什么? 4. ConcurrentHashMap 如何保证线程安全? 5. Spring Boot 的自动配置原理是什么? 6. 如何解决数据库的幻读问题? 7. 微服务中如何实现服务熔断与降级? --- 以上问题覆盖 Java 核心知识点及分布式、框架等扩展领域,建议结合实际场景深入理解底层原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

诗人在流浪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值