【61-70期】Java面试题深度解析:从集合框架到线程安全的最佳实践

news2024/11/29 1:48:07

🚀 作者 :“码上有前”
🚀 文章简介 :Java
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬

在这里插入图片描述

在这里插入图片描述

文章题目:Java面试题深度解析:从集合框架到线程安全的最佳实践

摘要
本文针对Java面试中的常见问题进行详细解答,涵盖集合框架的使用、线程安全的保证机制、以及Java中常见性能优化技巧。每个问题都结合理论分析与实际代码示例,深入探讨原理与最佳实践,帮助开发者全面提升技术能力,并为面试和实际开发提供强有力的参考。


1. Java中HashMapHashtable有什么区别?

回答
HashMapHashtable都实现了Map接口,用于存储键值对,但有以下区别:

  1. 线程安全Hashtable是线程安全的,方法是通过sychronized关键字来同步每个方法;HashMap不是线程安全的,但可以通过Collections.synchronizedMap()方法将其包装成线程安全的;
  2. null值HashMap允许null键和值,而Hashtable不允许;
  3. 性能:由于Hashtable的线程同步机制,HashMap在单线程场景下性能更优。

最佳实践
在大多数情况下,推荐使用HashMap,并根据需要自己处理同步:

Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");

2. 什么是ConcurrentHashMap?它如何保证线程安全?

回答
ConcurrentHashMapjava.util.concurrent包中的一个线程安全的哈希表。它通过分段锁(Segment Locking)机制来保证线程安全,避免了锁的竞争,提高了并发性能。

  • ConcurrentHashMap将桶分成多个段,每个段都有独立的锁,当多个线程访问不同段时,可以并发执行,减少锁竞争。
  • 采用分段锁的方式,只有访问相同段的数据才会互斥。

最佳实践
使用ConcurrentHashMap来实现线程安全的映射存储:

ConcurrentHashMap<String, String> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("key1", "value1");
concurrentMap.put("key2", "value2");

3. Java中的volatile关键字的作用是什么?

回答
volatile是一个轻量级的同步机制,确保一个变量的修改会立即反映到所有线程中。

  • 保证可见性:当一个线程修改了volatile变量的值,其他线程能立即看到这个修改;
  • 禁止指令重排volatile防止JVM在对变量进行操作时进行指令重排。

最佳实践
当多个线程共享一个变量时,可以使用volatile来保证其可见性:

private volatile boolean flag = false;

public void run() {
    while (!flag) {
        // do something
    }
}

4. 什么是ReentrantLock?它和synchronized的区别是什么?

回答
ReentrantLockjava.util.concurrent包中的一个锁实现,它与synchronized关键字的功能类似,但提供了更多的灵活性。

  • ReentrantLock可以尝试获取锁(tryLock()),并能指定超时(tryLock(long time, TimeUnit unit));
  • ReentrantLock支持公平锁(new ReentrantLock(true))和非公平锁(默认);
  • 支持多次锁定(递归锁),同一个线程可以多次获得锁。

最佳实践
使用ReentrantLock来控制并发访问资源:

ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
    // 执行业务逻辑
} finally {
    lock.unlock();
}

5. Java中的StringStringBuilderStringBuffer有何区别?

回答

  1. String:不可变类,每次修改都会创建一个新的字符串对象;
  2. StringBuilder:可变类,线程不安全,适用于单线程环境;
  3. StringBuffer:可变类,线程安全,适用于多线程环境。

最佳实践
如果在单线程环境中需要拼接字符串,使用StringBuilder;在多线程环境中使用StringBuffer

StringBuilder sb = new StringBuilder();
sb.append("Hello, ").append("World!");

6. Java中如何实现线程池?

回答
线程池的核心是ExecutorService接口,其中最常用的实现是ThreadPoolExecutor。可以通过Executors工厂类创建常用的线程池。

  • 核心线程数:始终保持的线程数;
  • 最大线程数:线程池允许的最大线程数;
  • 任务队列:存放等待执行的任务;
  • 线程池的空闲线程生命周期:线程空闲超过一定时间会被销毁。

最佳实践
使用ThreadPoolExecutor来创建一个自定义线程池:

ExecutorService executor = new ThreadPoolExecutor(
    5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100)
);
executor.submit(() -> {
    // 任务执行逻辑
});

7. 什么是CountDownLatch,它如何使用?

回答
CountDownLatch是一个同步辅助类,用于让一个线程等待其他线程完成某些操作。CountDownLatch计数器通过调用countDown()方法减小,线程通过调用await()方法等待,直到计数器减到0时,所有等待的线程才会继续执行。
常用于“多线程等待某些事件完成”场景。

最佳实践
使用CountDownLatch等待多个线程完成任务:

CountDownLatch latch = new CountDownLatch(3);

for (int i = 0; i < 3; i++) {
    new Thread(() -> {
        // 执行任务
        latch.countDown();
    }).start();
}

latch.await(); // 等待直到计数器为0

8. 如何通过JVM调优提高性能?

回答
JVM调优包括垃圾回收器选择、内存参数调整、线程调度等。关键的调优方式包括:

  1. 垃圾回收器选择:不同的GC算法适合不同的应用场景,常用的有G1GCCMS等;
  2. 内存设置:合理设置-Xms-Xmx等参数,避免频繁的垃圾回收;
  3. 线程优化:合理设置线程池大小,避免线程过多导致系统资源耗尽。

最佳实践
使用G1GC垃圾回收器并调整堆内存参数:

-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200

9. Java中的deadlock是什么,如何避免?

回答
deadlock(死锁)是指两个或多个线程互相等待对方释放资源,导致无法继续执行。
避免死锁的方法包括:

  1. 避免嵌套锁:尽量减少锁的粒度;
  2. 线程按固定顺序获取锁:确保所有线程按同一顺序获取锁;
  3. 使用tryLock:尝试获取锁失败时可以跳过或重试。

最佳实践
避免死锁的代码示例:

ReentrantLock lock1 = new ReentrantLock();
ReentrantLock lock2 = new ReentrantLock();

lock1.lock();
try {
    lock2.lock();
    try {
        // 执行业务逻辑
    } finally {
        lock2.unlock();
    }
} finally {
    lock1.unlock();
}

10. 如何实现一个线程安全的单例模式?

回答
线程安全的单例模式可以使用双重检查锁定(Double-Checked Locking)方式实现,确保实例在首次访问时创建,且多线程访问时不会出现重复创建的情况。

最佳实践
使用双重检查锁定的单例实现:

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

总结
本文通过深入解析Java面试中的常见问题,从集合框架到线程安全的设计,全面覆盖了高频技术点。通过

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

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

相关文章

关闭AWS账号后,服务是否仍会继续运行?

在使用亚马逊网络服务&#xff08;AWS&#xff09;时&#xff0c;用户有时可能会考虑关闭自己的AWS账户。这可能是因为项目结束、费用过高&#xff0c;或是转向使用其他云服务平台。然而&#xff0c;许多人对关闭账户后的服务状态感到困惑&#xff0c;我们九河云和大家一起探讨…

JVM_垃圾收集器详解

1、 前言 JVM就是Java虚拟机&#xff0c;说白了就是为了屏蔽底层操作系统的不一致而设计出来的一个虚拟机&#xff0c;让用户更加专注上层&#xff0c;而不用在乎下层的一个产品。这就是JVM的跨平台&#xff0c;一次编译&#xff0c;到处运行。 而JVM中的核心功能其实就是自动…

若依框架部署在网站一个子目录下(/admin)问题(

部署在子目录下首先修改vue.config.js文件&#xff1a; 问题一&#xff1a;登陆之后跳转到了404页面问题&#xff0c;解决办法如下&#xff1a; src/router/index.js 把404页面直接变成了首页&#xff08;大佬有啥优雅的解决办法求告知&#xff09; 问题二&#xff1a;退出登录…

BERT解析

BERT项目 我在BERT添加注释和部分推理代码 main.py vocab WordVocab.load_vocab(args.vocab_path)#加载vocab那么这个加载的二进制是什么呢&#xff1f; 1. 加载数据集 继承关系&#xff1a;TorchVocab --> Vocab --> WordVocab TorchVocab 该类主要是定义了一个词…

连接共享打印机0X0000011B错误多种解决方法

打印机故障一直是一个热门话题&#xff0c;特别是共享打印机0x0000011b错误特别头疼&#xff0c;有很多网友经常遇到共享打印机0x0000011b错误。0x0000011b有更新补丁导致的、有访问共享打印机服务异常、有访问共享打印机驱动异常等问题导致的&#xff0c;针对共享打印机0x0000…

spring +fastjson 的 rce

前言 众所周知&#xff0c;spring 下是不可以上传 jsp 的木马来 rce 的&#xff0c;一般都是控制加载 class 或者 jar 包来 rce 的&#xff0c;我们的 fastjson 的高版本正好可以完成这些&#xff0c;这里来简单分析一手 环境搭建 <dependency><groupId>org.spr…

jeecgbootvue2重新整理数组数据或者添加合并数组并遍历背景图片或者背景颜色

想要实现处理后端返回数据并处理&#xff0c;添加已有静态数据并遍历快捷菜单背景图 遍历数组并使用代码 需要注意&#xff1a; 1、静态数组的图片url需要的格式为 require(../../assets/b.png) 2、设置遍历背景图的代码必须是: :style"{ background-image: url( item…

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前&#xff0c;我们都在讲什么低代码/无代码平台&#xff0c;这个概念很久了&#xff0c;但是&#xff0c;一直没有很好的落地&#xff0c;整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来&#xff0c;各大科技公司也都推出了很多 AI 代码助手&#xff…

jenkins 2.346.1最后一个支持java8的版本搭建

1.jenkins下载 下载地址&#xff1a;Index of /war-stable/2.346.1 2.部署 创建目标文件夹&#xff0c;移动到指定位置 创建一个启动脚本&#xff0c;deploy.sh #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/opt/projects/jenkins # 服务名称。同时约定部…

3D建筑模型的 LOD 规范

LOD&#xff08;细节层次&#xff09; 是3D城市建模中用于表示建筑模型精细程度的标准化描述不同的LOD适用于不同的应用场景 LOD是3D建模中重要的分级标准&#xff0c;不同层级适合不同精度和用途的需求。 从LOD0到LOD4&#xff0c;细节逐渐丰富&#xff0c;复杂性和精度也逐…

解锁 Vue 项目中 TSX 配置与应用简单攻略

在 Vue 项目中配置 TSX 写法 在 Vue 项目中使用 TSX 可以为我们带来更灵活、高效的开发体验&#xff0c;特别是在处理复杂组件逻辑和动态渲染时。以下是详细的配置步骤&#xff1a; 一、安装相关依赖 首先&#xff0c;我们需要在命令行中输入以下命令来安装 vitejs/plugin-v…

【UE5 C++课程系列笔记】04——创建可操控的Pawn

根据官方文档创建一个可以控制前后左右移动、旋转视角、缩放视角的Pawn 。 步骤 一、创建Pawn 1. 新建一个C类&#xff0c;继承Pawn类&#xff0c;这里命名为“PawnWithCamera” 2. 在头文件中申明弹簧臂、摄像机和静态网格体组件 3. 在源文件中引入组件所需库 在构造函数…

多目标优化算法——多目标粒子群优化算法(MOPSO)

Handling Multiple Objectives With Particle Swarm Optimization&#xff08;多目标粒子群优化算法&#xff09; 一、摘要&#xff1a; 本文提出了一种将帕累托优势引入粒子群优化算法的方法&#xff0c;使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…

HTML5好看的音乐播放器多种风格(附源码)

文章目录 1.设计来源1.1 音乐播放器风格1效果1.2 音乐播放器风格2效果1.3 音乐播放器风格3效果1.4 音乐播放器风格4效果1.5 音乐播放器风格5效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&…

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…

c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备&#xff0c;广泛应用于电子报警器、玩具、计时器等领域。在本项目中&#xff0c;我们结合树莓派Pico开发板&#xff0c;通过C代码控制有源蜂鸣器发出“滴滴”声&#xff0c;并解析其中涉及的关键技术点和硬件知识。 一、项目概述 1. 项…

jar包打成exe安装包

打包exe并设置管理员权限 前言打包可执行文件exe准备jre环境运行exe4j并配置 设置执行文件exe管理员权限设置打包工具管理员权限打包exe安装包创建脚本打包 前言 准备安装包&#xff1a; jar包&#xff1a;自己的程序&#xff1b;exe4j&#xff1a;将jar打包可执行的exe&…

NAT:连接私有与公共网络的关键技术(4/10)

一、NAT 的工作原理 NAT 技术的核心功能是将私有 IP 地址转换为公有 IP 地址&#xff0c;使得内部网络中的设备能够与外部互联网通信。其工作原理主要包括私有 IP 地址到公有 IP 地址的转换、端口号映射以及会话表维护这几个步骤。 私有 IP 地址到公有 IP 地址的转换&#xff1…

多模态大型语言模型(MLLM)综述

目录 多模态大语言模型的基础 长短期网络结构(LSTM) 自注意力机制 基于Transformer架构的自然语言处理模型 多模态嵌入概述 多模态嵌入关键步骤 多模态嵌入现状 TF-IDF TF-IDF的概念 TF-IDF的计算公式 TF-IDF的主要思路 TF-IDF的案例 训练和微调多模态大语言模…

学习ASP.NET Core的身份认证(基于Cookie的身份认证3)

用户通过验证后调用HttpContext.SignInAsync函数将用户的身份信息保存在认证Cookie中,以便后续的请求可以验证用户的身份,该函数原型如下所示&#xff0c;其中properties参数的主要属性已在前篇文章中学习&#xff0c;本文学习scheme和principal的意义及用法。 public static …