某大厂跳动Java面试真题之问题与解答总结(三)

Java 面试题解析​编辑

在 Java 面试中,除了基础的语法和数据结构问题外,常常会涉及到框架的使用和设计模式的理解。本文将解答一些常见的 Java 面试题,涵盖 Spring AOP、面向对象的特性、集合类的区别等内容。

​编辑---

1. Spring AOP 怎么实现,围绕 Bean 生命周期去讲

Spring AOP(面向切面编程)通过动态代理技术为目标对象提供横切功能,如日志、事务等。Spring AOP 主要有两种实现方式:基于 JDK 动态代理和基于 CGLIB 的字节码生成。​编辑

Spring AOP 实现过程:
  1. Bean 生命周期 :在 Spring 容器启动时,Spring 会通过 BeanFactoryApplicationContext 实例化 Bean。Bean 生命周期包括:实例化、依赖注入、初始化、销毁等过程。
  2. 代理的创建:当一个 Bean 被标记为需要 AOP 处理时,Spring 会根据配置的切面(如日志切面、事务切面)生成代理对象。代理对象会拦截方法调用并加入横切逻辑。
  3. 切面和通知:Spring AOP 使用切面(Aspect)来描述横切逻辑,通知(Advice)来定义具体的操作。常见的通知类型有前置通知、后置通知、环绕通知等。
  4. 动态代理 :Spring AOP 使用代理模式来实现切面功能。当一个方法被调用时,代理对象会先执行切面逻辑,再调用原始方法。编辑

通过这种方式,Spring AOP 将关注点分离,不影响核心业务逻辑,从而增强了代码的可维护性和扩展性。


2. 三大特性:封装、继承、多态

面向对象编程的核心三大特性是封装、继承和多态,它们是构建 Java 应用程序的基础。

  1. 封装
    • 封装指的是将对象的状态(字段)和行为(方法)封装到一个类中,并通过公开的接口(如 getter 和 setter)来访问数据。封装有助于数据隐藏、减少代码耦合,增强安全性。
    • 示例:
      ```java
      public class Person {
      private String name;
      private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

```

  1. 继承
    • 继承是通过一个类继承另一个类的属性和方法,形成类与类之间的关系。继承有助于代码复用并且促进代码的扩展。
    • 示例:
      ```java
      public class Animal {
      public void eat() {
      System.out.println("Eating...");
      }
      }

public class Dog extends Animal {

public void bark() {

System.out.println("Barking...");

}

}

```

  1. 多态
    • 多态是指同一个方法或操作可以作用于不同的对象,并产生不同的行为。多态主要通过方法重载和方法重写来实现。
    • 示例:
      java Animal a = new Dog(); a.eat(); // Dog类中的eat()方法,表现出不同的行为

3. 谈谈多态

多态是面向对象编程的核心概念之一。它的含义是同一个方法名可以根据不同对象的类型,执行不同的操作。多态可以分为两种类型:

  • 方法重载(Compile-time Polymorphism) :同一个类中方法的名字相同,但参数不同(数量、类型、顺序等)。编译时通过参数的不同来决定调用哪个方法。
    java class Printer { public void print(String message) { System.out.println(message); } public void print(int number) { System.out.println(number); } }

  • 方法重写(Runtime Polymorphism) :子类重写父类的方法,并且通过父类的引用指向子类对象。运行时根据对象的实际类型来决定调用哪个方法。

    ```java

    class Animal {

    public void sound() {

    System.out.println("Animal sound");

    }

    }

class Dog extends Animal {

@Override

public void sound() {

System.out.println("Bark");

}

}

public class Test {

public static void main(String\[\] args) {

Animal animal = new Dog();

animal.sound(); // 输出 "Bark"

}

}

```


4. 接口和抽象类的区别

接口(Interface)和抽象类(Abstract Class)都可以用来定义方法,但它们有一些重要的区别:

  • 定义方式 :接口中的所有方法默认为 public abstract,不需要显式声明;而抽象类可以有具体方法和抽象方法。
  • 继承方式:类可以实现多个接口,但只能继承一个抽象类。
  • 构造器:接口不能有构造函数,而抽象类可以有构造函数。
  • 默认方法 :接口可以有默认方法(default),而抽象类则没有此限制。

5. 谈谈集合

集合是存储一组数据的容器,在 Java 中主要有两种类型的集合:

  1. List :有序的集合,允许重复元素。常见实现类有 ArrayListLinkedList
  2. Set :无序的集合,不允许重复元素。常见实现类有 HashSetTreeSet
  3. Map :键值对集合,允许根据键来查找值。常见实现类有 HashMapTreeMap

6. ArrayList 和 LinkedList 的区别

ArrayListLinkedList 都是实现 List 接口的集合类,但它们在底层实现和性能上有所不同:

  • 底层数据结构

    • ArrayList:基于动态数组实现。

    • LinkedList:基于双向链表实现。

  • 访问速度

    • ArrayList:访问元素的时间复杂度是 O(1),适合频繁读取操作。

    • LinkedList:访问元素的时间复杂度是 O(n),因为需要遍历链表。

  • 插入和删除操作

    • ArrayList:在数组的中间插入或删除元素需要移动大量元素,时间复杂度是 O(n)。

    • LinkedList:插入或删除操作只需要修改链表节点的引用,时间复杂度是 O(1)。


7. HashMap 底层

HashMap 是基于哈希表实现的,它的底层结构是一个数组加链表/红黑树(Java 8 引入)。每个元素根据哈希值存储在数组的特定位置,如果发生哈希冲突,则通过链表或红黑树解决冲突。主要操作有 putgetremove

  • 数组:每个数组槽位存储一个链表的头结点,链表中的每个节点存储一个键值对。
  • 链表:当两个不同的键具有相同的哈希值时,它们会被存储在同一个数组槽位的链表中。
  • 红黑树:当链表长度超过一定阈值时(默认是 8),链表会转换为红黑树,以提高查询效率。

8. ==equals 的区别

  • == 运算符:用于比较两个对象的内存地址(引用)是否相同。如果是基本数据类型,比较的是值;如果是对象类型,比较的是引用。
  • equals 方法 :用于比较两个对象的内容是否相等。equalsObject 类中的方法,通常会被重写来实现对象的内容比较。

总结

这些问题涵盖了 Java 编程中的一些核心概念,包括面向对象的特性、Spring AOP 实现、集合类的使用、以及一些常见的性能优化技巧。理解这些概念并能够清晰地回答问题,是面试中展示自己技术水平的重要步骤。

相关推荐
Nturmoils11 分钟前
订单查询丢数据,查了半天原来是 WHERE 惹的祸
数据库·后端
叫我Paul就好13 分钟前
自从用上 Agents View 之后, 我的心力交瘁感消失了
后端
SamDeepThinking14 分钟前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
niuju16 分钟前
一种基于 Agent 的需求规范化闭环实践:让合规与规范内建于流程
后端
wear工程师18 分钟前
setState 到底是不是异步的?这题从 React 16 问到 18,标准答案早就变了
react.js·面试
团团崽_七分甜19 分钟前
四大数据库底层原理详解
后端
glartchen21 分钟前
使用 Pixi 配置 Whisper 环境,实现采用本地大模型读取视频字幕
后端
站大爷IP21 分钟前
明明传了参数,进程池却说没找到?记一次变量丢失的排查实录
后端
gs801401 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
用户6757049885021 小时前
从失真到绝对精准:Go语言中如何进行高精度计算?
后端·go