[持续更新]计算机经典面试题基础篇Day2
[通用]计算机经典面试题基础篇Day2
1、单例模式是什么,线程安全吗
单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。通过使用单例模式,可以避免多次创建相同的对象,节省内存资源,同时也可以确保对象的一致性。
在Java中,常见的实现单例模式的方式是使用懒汉式和饿汉式。
懒汉式:在首次使用时才创建实例。懒汉式的线程安全性取决于具体的实现方式。如果使用简单的懒汉式实现,在多线程环境下是不安全的,可能会导致多个线程同时创建多个实例。可以通过加锁(synchronized)或者使用双重检查锁(double-checked locking)来实现线程安全的懒汉式。
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {// 私有化构造函数}public static synchronized LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;} }
饿汉式:在类加载时就创建实例。饿汉式是线程安全的,因为实例在类加载时就被创建,保证了全局唯一性。但由于实例的创建是提前进行的,可能会导致资源的浪费。
public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {// 私有化构造函数}public static EagerSingleton getInstance() {return instance;} }
2、Vector是什么,线程安全吗
Vector 是 Java 中的一种同步容器类,它实现了动态数组的功能。它与 ArrayList 类似,但是具有线程安全的特性。
线程安全是指在多线程环境下,对共享数据的访问和操作不会出现冲突或产生不一致的结果。对于 Vector 来说,它提供了一些同步方法,如 add()、remove() 和 get() 等,在多线程环境中可以确保对 Vector 的操作是线程安全的。
然而,尽管 Vector 的操作是线程安全的,但是在高并发的情况下,使用 Vector 还是可能会导致性能问题。因为 Vector 在进行操作时,会对整个集合进行加锁,这样其它线程就无法同时操作 Vector,导致效率下降。
所以,如果只需要在单线程环境下使用动态数组,建议使用 ArrayList。如果需要在多线程环境下使用,可以考虑使用 Vector 或者使用其他线程安全的容器类,如 CopyOnWriteArrayList 或 ConcurrentHashMap。
3、请你说说synchronized和lock的区别
synchronized 和 lock 都是 Java 中用于实现线程同步的机制。
- synchronized 是关键字,可以直接应用于方法或代码块中,自动获取和释放锁。
- lock 是接口,需要手动调用 lock() 和 unlock() 方法来获取和释放锁。
区别:
- 锁的获取和释放方式:synchronized 自动获取和释放锁,lock 需要手动调用对应方法。
- 可重入性:synchronized 和 lock 都是可重入的,但 lock 需要手动释放相应次数的锁。
- 等待可中断:synchronized 无法中断等待,lock 提供可中断获取锁的方式。
- 条件变量:synchronized 通过 wait()、notify() 和 notifyAll() 实现条件变量,lock 使用 Condition 接口实现更灵活的线程等待和唤醒机制。
总的来说,synchronized 简单易用,适合简单的线程同步,而 lock 提供更多功能和灵活性,适用于复杂的线程同步。在性能方面,synchronized 对短时间同步操作更高效,lock 对长时间同步更有优势。
4、请说一下什么是堆内内存,是怎么分配的
堆内存的分配是由 Java 虚拟机负责的。当我们创建一个对象时,Java 虚拟机会在堆内存中分配一块连续的内存空间来存储该对象的实例变量和其他相关信息。堆内存的大小可以通过启动参数来指定,或者根据系统的物理内存大小进行自动调整。
在堆内存中,对象是通过垃圾回收机制来进行管理和释放的。当一个对象不再被引用时,垃圾回收器会自动标记并回收该对象所占用的内存空间,以便后续的对象可以继续在该空间中分配。
堆内存的分配方式是动态的,在运行时根据程序的需求进行分配和释放。由于堆内存的分配和释放是比较耗时的操作,所以垃圾回收机制的性能和算法对于程序的性能和内存的使用效率都有很大的影响。
要注意的是,堆内存是多线程共享的,多个线程可以同时分配和访问堆内存中的对象。因此,在多线程编程中,需要注意对共享对象的访问同步和线程安全性的问题。
5、请说一下什么事对外内存,是怎么分配的
对外内存(Off-Heap Memory)是指在 Java 中,通过使用非堆内存来存储数据的一种方式。与堆内存不同,对外内存并不受 Java 垃圾回收机制的管理。
对外内存的分配和释放是由程序员手动控制的,而不是由 Java 虚拟机自动管理。一般情况下,对外内存的分配和释放是通过调用本地方法或操作系统提供的底层接口来完成的。
常见的使用对外内存的场景包括:
- 需要处理大量的数据,如大型数组、图像数据等,这些数据无法完全放入堆内存中。
- 需要使用常驻内存的数据结构,如缓存、数据库连接池等。
- 需要与底层系统进行交互,如直接操作文件、网络数据传输等。
- 需要提高性能和降低垃圾回收的影响,对外内存的分配和释放比堆内存更高效。
6、说一下进程和线程的区别
进程是程序的一个实例,拥有独立的内存空间和系统资源,线程是进程的执行单元,共享相同的资源。
- 资源占用:进程占用独立资源,线程共享资源。
- 切换成本:进程切换成本高,线程切换成本低。
- 通信和同步:进程间通信需要特定机制,线程间可直接共享内存通信和同步。
- 独立性:进程相互隔离,线程共享资源。
- 容错性:进程崩溃不影响其他进程,线程崩溃可能导致整个进程崩溃。
7、说一下对多线程的理解
多线程是指在一个程序中同时运行多个线程,在多核处理器上并行执行,提高程序的并发性和效率。
多线程的理解可以从以下几个角度来考虑:
- 并发性和响应性:多线程可以使程序同时执行多个任务,提高程序的并发性,增加系统的吞吐量。同时,多线程可以提高程序的响应性,通过将耗时的操作放在后台线程中执行,使主线程能够快速响应用户的操作。
- 资源共享与同步:多线程共享同一进程的资源,如内存、文件、网络连接等。但同时也需要考虑线程之间的同步问题,确保对共享资源的访问是安全的,避免竞态条件等问题的发生。
- 并发控制与线程安全:多线程编程需要处理并发控制问题,如互斥锁、信号量、条件变量等,以确保线程的安全执行。线程安全是指多个线程访问共享资源时不会产生不正确的结果。
- 调度和优先级:多线程通过操作系统的调度机制在多核处理器上进行分配和调度。线程的优先级可以指定,高优先级的线程可能会更早地得到执行机会,但并不能保证绝对的顺序。
- 死锁与活锁:多线程编程中存在死锁和活锁的风险,死锁是指多个线程相互等待对方释放资源而无法继续执行,而活锁则是指线程虽然不会被阻塞,但由于某种逻辑问题导致无法正常执行。
8、说一下对线程池的理解
线程池是一种线程管理的机制,它可以提前创建一定数量的线程,并将任务提交给线程池来执行。线程池维护着一组可重用的线程,可以有效地管理和控制线程的数量,提高系统的性能和稳定性。
对线程池的理解可以从以下几个方面考虑:
- 线程复用:线程池在初始化时会创建一定数量的线程,并将其维护在池中。任务提交给线程池后,线程池会选择空闲的线程来执行任务,任务执行完毕后线程并不会被销毁,而是继续保留在池中,以供后续任务使用,从而避免了频繁地创建和销毁线程的开销。
- 线程管理和控制:线程池可以通过设置参数来控制线程的数量、线程的优先级、线程的闲置时间等。可以根据系统的负载情况动态地调整线程池的大小和配置,以适应不同的应用场景和资源需求。
- 任务排队和调度:线程池会维护一个任务队列,将提交给线程池的任务按顺序排队,并通过线程调度算法选择合适的线程来执行任务。任务队列可以避免任务过多导致系统资源耗尽,同时还可以实现任务的优先级调度、任务的拒绝策略等。
- 异常处理和监控:线程池可以对线程的异常进行处理,避免异常的传递导致整个系统崩溃。同时,线程池还可以提供监控和统计信息,如线程池的活动线程数、完成任务数、任务队列长度等,用于监控线程池的运行状态和性能指标。
9、java提供了那些线程池
- FixedThreadPool:固定大小的线程池,创建时指定线程数量,线程池中的线程数量始终保持不变。适用于需要控制并发线程数的场景。
- CachedThreadPool:可缓存的线程池,线程池中的线程数量根据需要自动调整,如果有空闲线程则复用,没有空闲线程则创建新线程。适用于执行大量短期异步任务的场景。
- ScheduledThreadPool:定时任务线程池,用于在给定的延迟后或定时执行任务。适用于需要定时执行任务的场景。
- SingleThreadExecutor:单线程化的线程池,只有一个工作线程执行任务,保证任务按照指定的顺序执行。适用于需要按顺序执行任务的场景。
- WorkStealingPool:工作窃取线程池,每个线程维护自己的任务队列,空闲线程会从其他线程的队列中窃取任务执行,以提高并行度。适用于执行大量相互独立的任务的场景。
这些线程池都实现了ExecutorService接口,可以通过ThreadPoolExecutor类进行更加灵活的配置和自定义线程池的行为。通过使用Java提供的线程池,可以避免手动创建和管理线程,提高系统的性能和可维护性。
10、说一下对hashmap的理解
ashMap是Java中的一种数据结构,它基于哈希表实现,用于存储键值对(Key-Value)的映射关系。HashMap提供了快速的查找、插入和删除操作,是常用的集合类之一。
对HashMap的理解可以从以下几个方面考虑:
- 存储结构:HashMap内部使用数组和链表(或红黑树)实现。数组用于存储桶(bucket),每个桶存储一条链表(或红黑树),链表(或红黑树)用于解决哈希冲突,即多个键映射到同一个桶的情况。
- 键值对映射:HashMap通过哈希函数将键映射为数组的索引位置,从而实现快速的查找操作。每个键值对存储在桶中的链表(或红黑树)中,通过键的哈希值来定位所在的桶,然后通过比较键的equals方法来找到对应的值。
- 哈希冲突:由于不同的键可能映射到同一个桶,因此HashMap需要解决哈希冲突的问题。当链表(或红黑树)中的元素过多时,链表会转换为红黑树,以提高查找的效率。
- 线程不安全:HashMap是非线程安全的,多个线程同时进行读写操作可能导致数据不一致的问题。如果需要在多线程环境下使用,可以使用ConcurrentHashMap或通过同步机制进行外部同步。
- 效率与容量:HashMap的性能受到初始容量和负载因子的影响。初始容量是哈希表在创建时的桶的数量,负载因子是哈希表在自动扩容之前可以达到的填充比例。过高的负载因子会导致哈希冲突的增加,而过低的负载因子会导致存储空间的浪费。
简而言之,HashMap是一种用于存储键值对的数据结构,通过哈希函数将键映射为数组的索引位置,以实现快速的查找操作。它提供了高效的插入、删除和查找操作,但需要注意线程安全性和合理的容量设置。
相关文章:
[持续更新]计算机经典面试题基础篇Day2
[通用]计算机经典面试题基础篇Day2 1、单例模式是什么,线程安全吗 单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。通过使用单例模式,可以避免多次创建相同的对象,节省内存资源,同…...

C++:类和对象(二)
本文主要介绍:构造函数、析构函数、拷贝构造函数、赋值运算符重载、const成员函数、取地址及const取地址操作符重载。 目录 一、类的六个默认成员函数 二、构造函数 1.概念 2.特性 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 五、赋值…...

Java“牵手”京东商品详情数据,京东商品详情API接口,京东API接口申请指南
京东平台商品详情接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口,通过…...
Fluidd摄像头公网无法正常显示修复一例
Fluidd摄像头在内网正常显示,公网一直无法显示,经过排查发现由于url加了端口号引起的,摄像头url中正常填写的是/webcam?actionsnapshot,或者/webcam?actionstream。但是由于nginx跳转机制,会被301跳转到/webcam/?ac…...

【C++ 学习 ⑳】- 详解二叉搜索树
目录 一、概念 二、实现 2.1 - BST.h 2.2 - test.cpp 三、应用 四、性能分析 一、概念 二叉搜索树(BST,Binary Search Tree),又称二叉排序树或二叉查找树。 二叉搜索树是一棵二叉树,可以为空;如果不…...

Java中网络的基本介绍。网络通信,网络,ip地址,域名,端口,网络通信协议,TCP/IP传输过程,网络通信协议模型,TCP协议,UDP协议
- 网络通信 概念:网络通信是指通过计算机网络进行信息传输的过程,包括数据传输、语音通话、视频会议等。在网络通信中,数据被分成一系列的数据包,并通过网络传输到目的地。在数据传输过程中,需要确保数据的完整性、准…...
【Qt】总体把握文本编码问题
在项目开发中,经常会遇到文本编码问题。文本编码知识非常基础,但对于新手来说,可能需要花费较长的时间去尝试,才能在脑海中建立对编码的正确认知。文本编码原理并不难,难的是在项目实践中掌握正确处理文本编码的方法。…...
Linux命令(77)之curl
linux命令之curl 1.curl介绍 linux命令之curl是一款强大的http命令行工具,它支持文件的上传和下载,是综合传输工具。 2.curl用法 curl [参数] [url] curl参数 参数说明-C断点续传-o <filename>把输出写到filename文件中-x在给定的端口上使用HT…...
详解 sudo usermod -aG docker majn
这个命令涉及到几个 Linux 系统管理的基础概念,包括 sudo、usermod 和用户组管理。我们可以逐一地解析它们: sudo: sudo(superuser do)允许一个已经被授权的用户以超级用户或其他用户的身份执行一个命令。当使用 sudo 前缀一个命令…...

大数据课程L2——网站流量项目的算法分析数据处理
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的算法分析; ⚪ 了解网站流量项目的数据处理; 一、项目的算法分析 1. 概述 网站流量统计是改进网站服务的重要手段之一,通过获取用户在网站的行为,可以分析出哪些内…...

jar包或exe程序设置为windows服务
最近在使用java和python制作客户端时突发奇想,是否能够通过一种方法来讲jar包和exe程序打包成windows服务呢?简单了解了一下是可以的。 首先要用到的是winSW,制作windows服务的过程非常简单,仅需几步制作完成,也不需要…...

数据结构--- 树
(一)知识补充 定义 树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点;每一个非根…...

两个pdf文件合并为一个怎么操作?分享pdf合并操作步骤
不管是初入职场的小白,还是久经职场的高手,都必须深入了解pdf,特别是关于pdf的各种操作,如编辑、合并、压缩等操作,其中合并是这么多操作里面必需懂的技能之一,但是很多人还是不知道两个pdf文件合并为一个怎…...

Zookeeper简述
数新网络-让每个人享受数据的价值 官网现已全新升级—欢迎访问! 前 言 ZooKeeper是一个开源的、高可用的、分布式的协调服务,由Apache软件基金会维护。它旨在帮助管理和协调分布式系统和应用程序,提供了一个可靠的平台,用于处理…...

1、Flutter移动端App实战教程【环境配置、模拟器配置】
一、概述 Flutter是Google用以帮助开发者在IOS和Android 两个平台开发高质量原生UI的移动SDK,一份代码可以同时生成IOS和Android两个高性能、高保真的应用程序。 二、渲染机制 之所以说Flutter能够达到可以媲美甚至超越原生的体验,主要在于其拥有高性…...

stride与padding对输出尺寸的计算
公式: 练习: 图1: input4,filter3,padding0,stride1 output2 图2: input5,filter3,padding0,stride2 output2 图3: input6,filter3&am…...

Excel VSTO开发2 -建立Excel VSTO项目
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 2 建立Excel VSTO项目 新建项目,选择Excel 2013和2016 VSTO外接程序。输入项目名称(本示例的项目名称为&am…...

chrome插件:一个基于webpack + react的chrome 插件项目模板
项目结构 $ tree -L 1 . ├── README.md ├── node_modules # npm依赖 ├── package.json # 详细依赖 ├── pnpm-lock.yaml ├── public # 里边包含dist,安装的时候安装这个目录即可 ├── src …...
Vue:组件缓存
组件缓存 keep-alive 文章目录 组件缓存 keep-alive一、keep-alive是什么二、keep-alive优点三、问题四、解决方案五、代码示例 六、回顾一下钩子七、总结 一、keep-alive是什么 keep-alive是Vue中的一个内置组件,会缓存不活动的组件实例。并不会销毁组件ÿ…...

【C++】DICOM医学影像工作站PACS源码
PACS即影像存档与传输系统,是医学影像、数字化图像技术、计算机技术和网络通讯技术相结合的产物,是处理各种医学影像信息的采集、存储、报告、输出、管理、查询的计算机应用程序。 PACS是基于DICOM标准的医学影像管理系统,其模块覆盖了从影像…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...