Java面试题和答案大全

一、Java基础知识

1. Java语言特点

题目: 请说明Java语言的主要特点?

答案:

  • 面向对象:Java是纯面向对象的语言,支持封装、继承、多态
  • 平台无关性:一次编译,到处运行(Write Once, Run Anywhere)
  • 简单性:语法简洁,去掉了C++中的指针、多重继承等复杂特性
  • 安全性:提供了安全管理机制,防止恶意代码攻击
  • 多线程:内置多线程支持
  • 健壮性:强类型检查、异常处理、垃圾回收
  • 分布式:支持网络编程,便于开发分布式应用

2. JDK、JRE、JVM的关系

题目: 请解释JDK、JRE、JVM三者的关系?

答案:

  • JVM(Java虚拟机):Java程序运行的环境,负责将字节码转换为机器码
  • JRE(Java运行环境):包含JVM + Java核心类库,是Java程序运行的最小环境
  • JDK(Java开发工具包):包含JRE + 开发工具(javac、java、javadoc等),是Java开发环境

关系:JDK > JRE > JVM

3. 基本数据类型

题目: Java有哪些基本数据类型?各占几个字节?

答案:

整型:
- byte:1字节,范围 -128 到 127
- short:2字节,范围 -32768 到 32767
- int:4字节,范围 -2^31 到 2^31-1
- long:8字节,范围 -2^63 到 2^63-1浮点型:
- float:4字节,单精度
- double:8字节,双精度字符型:
- char:2字节,Unicode字符布尔型:
- boolean:1字节(JVM中实际可能占4字节)

4. 自动装箱和拆箱

题目: 什么是自动装箱和拆箱?

答案:

  • 自动装箱:基本类型自动转换为对应的包装类对象
  • 自动拆箱:包装类对象自动转换为对应的基本类型
// 自动装箱
Integer i = 100; // 等价于 Integer i = Integer.valueOf(100);// 自动拆箱  
int j = i; // 等价于 int j = i.intValue();

注意事项:

  • Integer缓存池:-128到127的Integer对象被缓存
  • 可能出现NullPointerException

5. equals()和==的区别

题目: equals()和==有什么区别?

答案:

  • ==
    • 对于基本类型:比较值是否相等
    • 对于引用类型:比较引用地址是否相等
  • equals()
    • 默认实现与==相同
    • 可以重写来比较对象内容
    • String类已重写equals()方法比较字符串内容
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = "hello";
String s4 = "hello";System.out.println(s1 == s2);     // false,不同对象
System.out.println(s1.equals(s2)); // true,内容相同
System.out.println(s3 == s4);     // true,字符串池中同一对象

二、面向对象编程

6. 面向对象三大特性

题目: 请详细说明面向对象的三大特性?

答案:

1. 封装(Encapsulation)

  • 将数据和方法包装在类中
  • 通过访问修饰符控制访问权限
  • 隐藏内部实现细节
public class Person {private String name; // 私有属性public String getName() { // 公共方法return name;}public void setName(String name) {this.name = name;}
}

2. 继承(Inheritance)

  • 子类继承父类的属性和方法
  • 实现代码复用
  • 支持方法重写
class Animal {protected void eat() {System.out.println("Animal is eating");}
}class Dog extends Animal {@Overrideprotected void eat() {System.out.println("Dog is eating");}
}

3. 多态(Polymorphism)

  • 同一接口不同实现
  • 运行时确定具体调用哪个方法
  • 包括重载和重写
Animal animal = new Dog();
animal.eat(); // 调用Dog的eat方法

7. 重载和重写的区别

题目: 方法重载和重写有什么区别?

答案:

特性 重载(Overload) 重写(Override)
定义 同一类中方法名相同,参数不同 子类重新实现父类方法
参数 必须不同 必须相同
返回值 可以不同 必须相同(或协变)
访问修饰符 可以不同 不能降低访问权限
异常 可以不同 不能抛出更宽泛的检查异常
发生时期 编译期确定 运行期确定

8. 抽象类和接口的区别

题目: 抽象类和接口有什么区别?什么时候使用?

答案:

特性 抽象类 接口
关键字 abstract interface
继承 单继承 多实现
构造器 可以有 不能有
成员变量 任意类型 public static final
方法 抽象和具体方法 抽象方法(JDK8+支持默认方法)
访问修饰符 任意 public

使用场景:

  • 抽象类:is-a关系,有共同的属性和部分相同的行为
  • 接口:can-do关系,定义行为规范

三、集合框架

9. Collection和Collections的区别

题目: Collection和Collections有什么区别?

答案:

  • Collection:集合框架的根接口,定义了集合的基本操作
  • Collections:工具类,提供了对集合操作的静态方法
// Collection是接口
Collection<String> list = new ArrayList<>();// Collections是工具类
Collections.sort(list);
Collections.reverse(list);

10. ArrayList和LinkedList的区别

题目: ArrayList和LinkedList有什么区别?

答案:

特性 ArrayList LinkedList
底层结构 动态数组 双向链表
随机访问 O(1) O(n)
插入删除(头部) O(n) O(1)
插入删除(尾部) O(1) O(1)
插入删除(中间) O(n) O(n)
内存占用 较小 较大(存储指针)
线程安全 不安全 不安全

11. HashMap的实现原理

题目: 请详细说明HashMap的实现原理?

答案:

底层结构:

  • JDK1.7:数组 + 链表
  • JDK1.8+:数组 + 链表 + 红黑树

核心机制:

// 1. 计算hash值
int hash = key.hashCode();
hash = hash ^ (hash >>> 16); // 扰动函数// 2. 确定数组下标
int index = (n - 1) & hash; // n为数组长度// 3. 处理冲突
// - 链表长度 < 8:使用链表
// - 链表长度 >= 8:转换为红黑树
// - 红黑树节点 <= 6:转换为链表

扩容机制:

  • 默认容量:16
  • 负载因子:0.75
  • 扩容阈值:容量 × 负载因子
  • 扩容时容量翻倍

12. ConcurrentHashMap实现原理

题目: ConcurrentHashMap是如何实现线程安全的?

答案:

JDK1.7实现:

  • 分段锁(Segment)机制
  • 每个Segment继承ReentrantLock
  • 降低锁的粒度

JDK1.8实现:

  • 取消分段锁
  • 使用CAS + synchronized
  • 锁住链表或红黑树的首节点
  • 进一步降低锁粒度
// JDK1.8 put方法核心逻辑
final V putVal(K key, V value, boolean onlyIfAbsent) {// 1. CAS尝试设置空位置if (casTabAt(tab, i, null, new Node<K,V>(hash, key, value, null)))break;// 2. synchronized锁住首节点synchronized (f) {// 3. 插入链表或红黑树}
}

四、多线程

13. 进程和线程的区别

题目: 进程和线程有什么区别?

答案:

特性 进程 线程
定义 程序的执行实例 进程中的执行单元
资源 拥有独立的内存空间 共享进程的内存空间
通信 IPC(进程间通信) 共享内存
创建开销
切换开销
影响范围 进程崩溃不影响其他进程 线程崩溃可能影响整个进程

14. 线程的状态

题目: Java线程有哪些状态?如何转换?

答案:

线程状态(Thread.State):

public enum State {NEW,          // 新建RUNNABLE,     // 运行(就绪+运行)BLOCKED,      // 阻塞WAITING,      // 等待TIMED_WAITING, // 超时等待TERMINATED    // 终止
}

状态转换:

NEW → RUNNABLE:调用start()
RUNNABLE → BLOCKED:等待synchronized锁
BLOCKED → RUNNABLE:获得锁
RUNNABLE → WAITING:调用wait()、join()
WAITING → RUNNABLE:notify()、notifyAll()
RUNNABLE → TIMED_WAITING:sleep()、wait(timeout)
TIMED_WAITING → RUNNABLE:时间到或被唤醒
RUNNABLE → TERMINATED:run()方法结束

15. synchronized关键字

题目: 请详细说明synchronized的原理和使用?

答案:

使用方式:

// 1. 修饰实例方法
public synchronized void method() {}// 2. 修饰静态方法
public static synchronized void method() {}// 3. 修饰代码块
synchronized(object) {// 同步代码
}

实现原理:

  • Java对象头:包含MarkWord,存储锁信息
  • Monitor机制:基于操作系统的互斥量
  • 字节码指令:monitorenter和monitorexit

锁升级过程(JDK1.6+):

无锁 → 偏向锁 → 轻量级锁 → 重量级锁

16. volatile关键字

题目: volatile关键字的作用是什么?

答案:

作用:

  1. 保证可见性:修改后立即写入主内存,其他线程读取时从主内存读取
  2. 禁止指令重排序:使用内存屏障

使用场景:

// 1. 状态标记
private volatile boolean flag = true;// 2. 双重检查锁单例模式
public class Singleton {private volatile static Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

注意:volatile不保证原子性

17. 线程池

题目: 请说明线程池的工作原理和参数?

答案:

核心参数:

public ThreadPoolExecutor(int corePoolSize,       // 核心线程数int maximumPoolSize,    // 最大线程数long keepAliveTime,     // 线程存活时间TimeUnit unit,          // 时间单位BlockingQueue<Runnable> workQueue,  // 工作队列ThreadFactory threadFactory,        // 线程工厂RejectedExecutionHandler handler    // 拒绝策略
)

工作流程:

  1. 提交任务到线程池
  2. 如果运行线程数 < corePoolSize,创建新线程
  3. 如果运行线程数 >= corePoolSize,任务加入队列
  4. 如果队列满了且运行线程数 < maximumPoolSize,创建新线程
  5. 如果运行线程数 >= maximumPoolSize,执行拒绝策略

常用线程池:

// 固定大小线程池
ExecutorService executor = Executors.newFixedThreadPool(10);// 缓存线程池
ExecutorService executor = Executors.newCachedThreadPool();// 单线程线程池
ExecutorService executor = Executors.newSingleThreadExecutor();// 定时任务线程池
ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);

五、JVM虚拟机

18. JVM内存结构

题目: 请详细说明JVM的内存结构?

答案:

运行时数据区域:

1. 程序计数器(PC Register)

  • 线程私有
  • 存储当前线程执行字节码的行号
  • 唯一不会OutOfMemoryError的区域

2. Java虚拟机栈(JVM Stack)

  • 线程私有
  • 存储局部变量表、操作数栈、动态链接、方法出口
  • StackOverflowError、OutOfMemoryError

3. 本地方法栈(Native Method Stack)

  • 线程私有<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92195.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用NAS如何远程访问:详细教程与实用技巧

在信息时代&#xff0c;家用NAS&#xff08;网络附加存储&#xff09;成为家庭数据存储和管理的热门设备。它不仅可以作为家庭照片、视频、工作文件的集中存储中心&#xff0c;还支持远程访问&#xff0c;方便用户随时随地获取数据。那么&#xff0c;如何配置和实现家用NAS的远…

Qt-桌面宠物

目录 一&#xff0c;演示&#xff08;部分功能&#xff09; 二&#xff0c;开发环境准备 三&#xff0c;部分代码实现 1.创建基础窗口 2.实现宠物动画 3.添加交互功能 4.系统托盘集成 5.行为模式实现 6.状态管理系统 7.资源打包部署 四&#xff0c;接受定制 一&…

C++编程学习(第19天)

局部变量和全局变量每一个变量都有其有效作用范围&#xff0c;这就是变量的作用域&#xff0c;在作用域以外是不能访问这些变量的。局部变量在一个函数内部定义的变量是局部变量&#xff0c;它只在本函数范围内有效&#xff0c;也就是说只有在本函数内才能使用他们&#xff0c;…

客流特征识别准确率提升 29%:陌讯多模态融合算法在零售场景的实战解析

原创声明本文为原创技术解析文章&#xff0c;涉及的技术参数与架构设计引用自《陌讯技术白皮书》&#xff0c;禁止任何形式的抄袭与转载。一、行业痛点&#xff1a;零售客流识别的技术瓶颈在零售数字化转型过程中&#xff0c;客流特征识别&#xff08;包括性别、年龄分层、停留…

YOLOv8/YOLOv11 C++ OpenCV DNN推理

首先需要将yolov8/yolov11的pt文件转为onnx文件 from ultralytics import YOLO model YOLO("best.pt") model.export(format"onnx",opset11,dynamicFalse) 本次C工具使用vs2017&#xff0c;需要下载OpenCV包&#xff1a;https://opencv.org/releases/&a…

【Mysql】日志--错误日志、二进制日志、查询日志、慢查询日志

错误日志:数据库出现错误时&#xff0c;进行故障排除默认位置&#xff1a;/var/log/mysqld.log查看日志位置show variables like %log_error%查看日志tail -50 /var/log/mysqld.log二进制日志&#xff1a;记录了所有的DDL语句和DML语句&#xff0c;不包含查询&#xff08;selec…

后端常用框架环境与软件详解

一、基础运行环境 1. JDK&#xff08;Java Development Kit&#xff09; 定义&#xff1a;Java 开发工具包&#xff0c;包含编译器、运行时环境&#xff08;JRE&#xff09;及核心类库 作用&#xff1a;提供 Java 程序开发和运行的基础环境&#xff0c;是所有 Java 应用的必备依…

本地服务器端部署基于大模型的通用OCR项目——dots.ocr

本地服务器端部署基于大模型的通用OCR项目——dots.ocrdots.ocr相关介绍本地服务器端部署第一步&#xff1a;安装cuda12.8与CUDNN8.9.7第二步&#xff1a;创建项目所需的依赖环境第三步&#xff1a;启动项目第四步&#xff1a;测试第五步&#xff1a;文本解析相关性测试第六步&…

Text2SQL 智能问答系统开发-spider验证集(三)

概述 已完成 基础 Text2SQL 功能实现 实现用户输入自然语言问题后&#xff0c;系统能够自动生成 SQL 并执行返回结果。用户交互优化 支持用户通过补充信息对查询进行调整&#xff0c;提升易用性。模糊时间处理机制 对“最近”“近期”等模糊时间关键词进行补全或引导&#xf…

ElementUI常用的组件展示

文章目录1、要使用ElementUI先导入组件库2、自定义表头&#xff0c;可以改为添加和批量删除的按钮3、Dialog模态框&#xff0c;主要用于添加和修改时展示信息4、抽屉5、消息提示&#xff1a;用于提示是否操作成功6、询问&#xff1a;常用于询问是否确定删除7、批量选择复选框8、…

在电脑上可以存储文件并合理备份文件的工具用哪个?

每天被群消息、报表、PPT 轮番轰炸的上班族&#xff0c;最怕的不是加班&#xff0c;而是——文件突然失踪&#xff01;别再把“CtrlS”当护身符&#xff0c;今天一口气测完 4 款热门“文件保险箱”&#xff0c;看看谁才真正配得上你的 Deadline。 敬业签 首先登场的是敬业签&am…

JavaWeb(04)

MyBatis 时一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 The MyBatis Blog 目录 MyBatis入门Mybatis基础CRUDMybatis动态SQL Mybatis入门 快速入门 JDBC介绍 数据库连接池 lombok 准备工作(创建springboot工程&#xff0c;数据库表user&#xff0c;实体类User) …

统计学1:伯努利模型的参数估计与等价性分析

伯努利模型的参数估计方法 1. 统计学习方法三要素对比方法模型策略算法极大似然估计概率模型经验风险最小化数值解贝叶斯估计概率模型结构风险最小化解析解2. 极大似然估计 2.1 模型设定 设P(x1)θP(x1)\thetaP(x1)θ&#xff0c;则P(x0)1−θP(x0)1-\thetaP(x0)1−θ 2.2 似然…

游戏行业DDoS攻防实战指南

一、游戏DDoS攻击特征分析游戏行业DDoS攻击呈现高度复合化特征&#xff0c;攻击手段日益专业化。2023年Akamai监测数据显示&#xff0c;63%的游戏服务器攻击采用UDP反射放大&#xff08;如NTP、Memcached协议&#xff09;与HTTP慢速攻击&#xff08;如Slowloris&#xff09;相结…

[自动化Adapt] 录制引擎 | iframe 穿透 | NTP | AIOSQLite | 数据分片

链接&#xff1a;https://github.com/OpenAdaptAI/OpenAdapt/wiki/OpenAdapt-Architecture-(draft) docs&#xff1a;OpenAdapt OpenAdapt 是一个开源项目&#xff0c;旨在 记录 和 回放 用户在计算机上的交互行为。 它如同智能助手般 观察 我们的操作&#xff08;鼠标点击、…

ipv6学习

ipv6的历史背景和及展望ipv6普及不够&#xff0c;ipv4快要用完。ipv6技术部分ivp6包头结构ipv6不允许分片&#xff0c;减轻中间设备压力。IPv6 包头结构可按字段分层解析&#xff0c;核心特点是 固定头部长度&#xff08;40 字节&#xff09; &#xff0c;将可选功能移至扩展头…

软件定义汽车 --- 电子电气架构的驱动

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

HTML5 语义元素

HTML5 语义元素 引言 HTML5 作为现代网页开发的基础&#xff0c;引入了许多新的语义元素&#xff0c;这些元素使得网页内容更加结构化&#xff0c;便于搜索引擎更好地理解和索引页面内容。本文将详细介绍 HTML5 中的语义元素&#xff0c;并探讨其在网页设计中的应用。 HTML5…

vue3 el-select el-option 使用

在 Vue 3 中&#xff0c;el-select 是 Element Plus 组件库中的一个选择器组件&#xff0c;它允许用户从下拉菜单中选择一个或多个选项。如果你想在使用 Vue 3 和 Element Plus 时让 el-select 支持多种选择&#xff08;即多选&#xff09;&#xff0c;你可以通过设置 multiple…

windows搬运文件脚本

使用方法&#xff1a;copy_files_by_prefix.bat [目标目录] [结果目录] [文件名前缀] [可选参数&#xff1a;文件包含内容]echo off chcp 65001 >nul setlocal enabledelayedexpansion:: Check parameters if "%~3""" (echo Usage: %~nx0 [SourceDir] […