面试真实经历某商银行大厂Java问题和答案总结(六)

Java 面试常见问题解答

在 Java 开发中,面试中常见的问题涵盖了广泛的领域,包括面向对象编程、JVM 运行机制、集合框架以及垃圾回收等方面。本文将重点回答一些常见的 Java 面试问题,并详细解析每个问题的核心概念。


1. 可达性分析如何做

在 Java 中,可达性分析是垃圾回收(GC)算法的一部分,它用于判断一个对象是否可以被回收。可达性分析通过检查对象的可达性(是否有引用指向该对象)来判断是否进行回收。

具体步骤如下:

  • 根集合(GC Roots):GC 会从一组根对象(如栈上的引用、静态变量、活动线程等)开始查找。
  • 可达性分析:从根对象开始,沿着所有对象引用关系进行遍历,标记所有可达的对象。
  • 不可达对象回收:如果某个对象不可达(即没有任何引用指向它),则认为该对象可以被回收。

例如,垃圾回收器会从栈、静态变量等根对象开始,通过引用关系遍历所有对象。如果某个对象没有被访问到,就会被认为是垃圾对象,准备进行回收。


2. 什么代码能够使 JVM 进行 GC

JVM 进行垃圾回收的触发通常是由以下几种情况触发的:

  1. 内存不足:当堆内存不足时,JVM 会自动触发垃圾回收来释放内存空间。

  2. System.gc() :调用 System.gc() 可以请求 JVM 执行垃圾回收,但并不一定立即进行。JVM 会根据自己的调度策略来决定是否执行垃圾回收。

    java 复制代码
    System.gc();  // 强制触发垃圾回收请求

    注意:调用 System.gc() 只是一个请求,JVM 可能选择忽略这个请求。

  3. 对象变得不可达:当一个对象不再被任何活动线程引用时,它就变成了不可达对象,垃圾回收器会对其进行回收。


3. Java 泛型

Java 泛型(Generics)是 Java 5 引入的一个特性,它允许类、接口和方法操作各种类型的数据,而无需在编译时指定具体的类型,从而增加了代码的可重用性和类型安全性。

常见的泛型应用:

  1. 泛型类: 泛型类允许使用类型参数来定义类。

    java 复制代码
    class Box<T> {
        private T value;
        public void setValue(T value) {
            this.value = value;
        }
        public T getValue() {
            return value;
        }
    }
    
    Box<Integer> intBox = new Box<>();
    intBox.setValue(10);
    System.out.println(intBox.getValue());
  2. 泛型方法: 泛型方法允许你定义在方法内部使用泛型。

    java 复制代码
    public <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }
    
    Integer[] intArray = {1, 2, 3};
    printArray(intArray);
  3. 泛型的边界: 泛型的类型参数可以设置边界,以限制它们只能是某些类型的子类。

    java 复制代码
    public <T extends Number> void printNumber(T number) {
        System.out.println(number);
    }

泛型为代码提供了强类型检查,在编译时确保类型安全,减少了运行时错误。


4. 封装、继承和多态

封装继承多态是面向对象编程的三大基本特性。

  1. 封装(Encapsulation): 封装指的是将数据和操作数据的方法包装在一起,并将对象的实现细节隐藏起来,只暴露必要的接口。这样可以保护对象的状态不被外部代码随意修改。

    java 复制代码
    public class Person {
        private String name;  // 私有变量
        
        public String getName() {  // 公开接口
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
    }
  2. 继承(Inheritance): 继承是面向对象编程的基本特性之一,允许一个类继承另一个类的属性和方法。通过继承可以实现代码重用。

    java 复制代码
    class Animal {
        public void eat() {
            System.out.println("Animal is eating");
        }
    }
    
    class Dog extends Animal {
        public void bark() {
            System.out.println("Dog is barking");
        }
    }
  3. 多态(Polymorphism): 多态是指同一个方法或操作在不同的对象上可以表现出不同的行为。Java 中的多态包括方法重载和方法重写。

    java 复制代码
    class Animal {
        public void sound() {
            System.out.println("Animal makes a sound");
        }
    }
    
    class Dog extends Animal {
        @Override
        public void sound() {
            System.out.println("Dog barks");
        }
    }
    
    Animal myDog = new Dog();
    myDog.sound();  // 输出:Dog barks

5. JVM 模型

Java 虚拟机(JVM)模型描述了 JVM 如何执行 Java 程序。JVM 分为几个主要组成部分:

  1. 类加载器子系统: 类加载器负责加载 Java 类文件,将其转化为 JVM 能够理解的二进制格式。

  2. 运行时数据区

    • 堆(Heap):存储对象和数组,是垃圾回收的主要区域。
    • 方法区(Method Area):存储类的信息、常量、静态变量等。
    • 栈(Stack):每个线程有自己的栈,存储局部变量和方法调用信息。
  3. 执行引擎: 执行引擎负责执行字节码,分为解释执行和即时编译(JIT)两种模式。


6. static

static 关键字用于声明类级别的成员,表示这些成员属于类而不是某个具体的对象。常用于静态变量、静态方法和静态代码块。

  1. 静态变量:静态变量被所有实例共享,内存中只有一份。

    java 复制代码
    class Counter {
        static int count = 0;  // 静态变量
        
        public Counter() {
            count++;
        }
    }
  2. 静态方法:静态方法可以通过类名直接调用,不能访问实例变量和实例方法。

    java 复制代码
    class MathUtils {
        public static int add(int a, int b) {
            return a + b;
        }
    }
  3. 静态代码块:静态代码块在类加载时执行,用于初始化静态资源。

    java 复制代码
    class Example {
        static {
            System.out.println("Static block executed");
        }
    }

7. String

String 是 Java 中一个非常特殊的类,因为它是不可变的。一旦创建一个 String 对象,它的值就不能更改。常见的字符串操作如下:

  1. 字符串连接

    • 使用 + 运算符或者 StringBuilder/StringBuffer
    java 复制代码
    String str = "Hello" + " World";
  2. 字符串池String 字面量会被保存在字符串池中,当多个相同内容的 String 对象被创建时,它们会共享相同的内存地址。

    java 复制代码
    String s1 = "hello";
    String s2 = "hello";  // s1 和 s2 指向同一对象

8. Java 集合有哪些

Java 提供了丰富的集合框架,用于存储和操作数据。主要的集合类型包括:

  1. List :有序集合,允许重复元素。例如:ArrayListLinkedList
  2. Set :不允许重复元素。例如:HashSetTreeSet
  3. Queue :队列,用于存储按顺序处理的数据。例如:LinkedListPriorityQueue
  4. Map :键值对集合,不允许重复的键。例如:HashMapTreeMap

这些问题涵盖了 Java 面试中最常见的基础知识和常见概念,掌握这些问题的解答有助于在面试中脱颖而出。希望本篇文章能为你的面试准备提供帮助。

相关推荐
IT_陈寒4 小时前
Vue3性能优化实战:这7个技巧让我的应用提速50%,尤雨溪都点赞!
前端·人工智能·后端
xurime4 小时前
Excelize 开源基础库发布 2.10.0 版本更新
golang·开源·github·excel·ai编程·go语言
yuniko-n4 小时前
【力扣 SQL 50】连接
数据库·后端·sql·算法·leetcode
白萤4 小时前
SpringBoot用户登录注册系统设计与实现
java·spring boot·后端
canonical_entropy4 小时前
告别异常继承树:从 NopException 的设计看“组合”模式如何重塑错误处理
后端·架构
Victor3565 小时前
Redis(65)如何优化Redis的AOF持久化?
后端
Victor3565 小时前
Redis(64)Redis的Lua脚本有哪些常见场景?
后端
Arva .7 小时前
面试题02
后端
uzong11 小时前
一次慢接口背后,竟藏着40+种可能!你中过几个
后端·面试·程序员