当前位置: 首页 > news >正文

[持续更新]计算机经典面试题基础篇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 虚拟机自动管理。一般情况下,对外内存的分配和释放是通过调用本地方法或操作系统提供的底层接口来完成的。

常见的使用对外内存的场景包括:

  1. 需要处理大量的数据,如大型数组、图像数据等,这些数据无法完全放入堆内存中。
  2. 需要使用常驻内存的数据结构,如缓存、数据库连接池等。
  3. 需要与底层系统进行交互,如直接操作文件、网络数据传输等。
  4. 需要提高性能和降低垃圾回收的影响,对外内存的分配和释放比堆内存更高效。

6、说一下进程和线程的区别

进程是程序的一个实例,拥有独立的内存空间和系统资源,线程是进程的执行单元,共享相同的资源。

  • 资源占用:进程占用独立资源,线程共享资源。
  • 切换成本:进程切换成本高,线程切换成本低。
  • 通信和同步:进程间通信需要特定机制,线程间可直接共享内存通信和同步。
  • 独立性:进程相互隔离,线程共享资源。
  • 容错性:进程崩溃不影响其他进程,线程崩溃可能导致整个进程崩溃。

7、说一下对多线程的理解

多线程是指在一个程序中同时运行多个线程,在多核处理器上并行执行,提高程序的并发性和效率。

多线程的理解可以从以下几个角度来考虑:

  1. 并发性和响应性:多线程可以使程序同时执行多个任务,提高程序的并发性,增加系统的吞吐量。同时,多线程可以提高程序的响应性,通过将耗时的操作放在后台线程中执行,使主线程能够快速响应用户的操作。
  2. 资源共享与同步:多线程共享同一进程的资源,如内存、文件、网络连接等。但同时也需要考虑线程之间的同步问题,确保对共享资源的访问是安全的,避免竞态条件等问题的发生。
  3. 并发控制与线程安全:多线程编程需要处理并发控制问题,如互斥锁、信号量、条件变量等,以确保线程的安全执行。线程安全是指多个线程访问共享资源时不会产生不正确的结果。
  4. 调度和优先级:多线程通过操作系统的调度机制在多核处理器上进行分配和调度。线程的优先级可以指定,高优先级的线程可能会更早地得到执行机会,但并不能保证绝对的顺序。
  5. 死锁与活锁:多线程编程中存在死锁和活锁的风险,死锁是指多个线程相互等待对方释放资源而无法继续执行,而活锁则是指线程虽然不会被阻塞,但由于某种逻辑问题导致无法正常执行。

8、说一下对线程池的理解

线程池是一种线程管理的机制,它可以提前创建一定数量的线程,并将任务提交给线程池来执行。线程池维护着一组可重用的线程,可以有效地管理和控制线程的数量,提高系统的性能和稳定性。

对线程池的理解可以从以下几个方面考虑:

  1. 线程复用:线程池在初始化时会创建一定数量的线程,并将其维护在池中。任务提交给线程池后,线程池会选择空闲的线程来执行任务,任务执行完毕后线程并不会被销毁,而是继续保留在池中,以供后续任务使用,从而避免了频繁地创建和销毁线程的开销。
  2. 线程管理和控制:线程池可以通过设置参数来控制线程的数量、线程的优先级、线程的闲置时间等。可以根据系统的负载情况动态地调整线程池的大小和配置,以适应不同的应用场景和资源需求。
  3. 任务排队和调度:线程池会维护一个任务队列,将提交给线程池的任务按顺序排队,并通过线程调度算法选择合适的线程来执行任务。任务队列可以避免任务过多导致系统资源耗尽,同时还可以实现任务的优先级调度、任务的拒绝策略等。
  4. 异常处理和监控:线程池可以对线程的异常进行处理,避免异常的传递导致整个系统崩溃。同时,线程池还可以提供监控和统计信息,如线程池的活动线程数、完成任务数、任务队列长度等,用于监控线程池的运行状态和性能指标。

9、java提供了那些线程池

  1. FixedThreadPool:固定大小的线程池,创建时指定线程数量,线程池中的线程数量始终保持不变。适用于需要控制并发线程数的场景。
  2. CachedThreadPool:可缓存的线程池,线程池中的线程数量根据需要自动调整,如果有空闲线程则复用,没有空闲线程则创建新线程。适用于执行大量短期异步任务的场景。
  3. ScheduledThreadPool:定时任务线程池,用于在给定的延迟后或定时执行任务。适用于需要定时执行任务的场景。
  4. SingleThreadExecutor:单线程化的线程池,只有一个工作线程执行任务,保证任务按照指定的顺序执行。适用于需要按顺序执行任务的场景。
  5. WorkStealingPool:工作窃取线程池,每个线程维护自己的任务队列,空闲线程会从其他线程的队列中窃取任务执行,以提高并行度。适用于执行大量相互独立的任务的场景。

这些线程池都实现了ExecutorService接口,可以通过ThreadPoolExecutor类进行更加灵活的配置和自定义线程池的行为。通过使用Java提供的线程池,可以避免手动创建和管理线程,提高系统的性能和可维护性。

10、说一下对hashmap的理解

ashMap是Java中的一种数据结构,它基于哈希表实现,用于存储键值对(Key-Value)的映射关系。HashMap提供了快速的查找、插入和删除操作,是常用的集合类之一。

对HashMap的理解可以从以下几个方面考虑:

  1. 存储结构:HashMap内部使用数组和链表(或红黑树)实现。数组用于存储桶(bucket),每个桶存储一条链表(或红黑树),链表(或红黑树)用于解决哈希冲突,即多个键映射到同一个桶的情况。
  2. 键值对映射:HashMap通过哈希函数将键映射为数组的索引位置,从而实现快速的查找操作。每个键值对存储在桶中的链表(或红黑树)中,通过键的哈希值来定位所在的桶,然后通过比较键的equals方法来找到对应的值。
  3. 哈希冲突:由于不同的键可能映射到同一个桶,因此HashMap需要解决哈希冲突的问题。当链表(或红黑树)中的元素过多时,链表会转换为红黑树,以提高查找的效率。
  4. 线程不安全:HashMap是非线程安全的,多个线程同时进行读写操作可能导致数据不一致的问题。如果需要在多线程环境下使用,可以使用ConcurrentHashMap或通过同步机制进行外部同步。
  5. 效率与容量: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命令行工具&#xff0c;它支持文件的上传和下载&#xff0c;是综合传输工具。 2.curl用法 curl [参数] [url] curl参数 参数说明-C断点续传-o <filename>把输出写到filename文件中-x在给定的端口上使用HT…...

详解 sudo usermod -aG docker majn

这个命令涉及到几个 Linux 系统管理的基础概念&#xff0c;包括 sudo、usermod 和用户组管理。我们可以逐一地解析它们&#xff1a; sudo: sudo&#xff08;superuser do&#xff09;允许一个已经被授权的用户以超级用户或其他用户的身份执行一个命令。当使用 sudo 前缀一个命令…...

大数据课程L2——网站流量项目的算法分析数据处理

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

jar包或exe程序设置为windows服务

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

数据结构--- 树

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

两个pdf文件合并为一个怎么操作?分享pdf合并操作步骤

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

Zookeeper简述

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

1、Flutter移动端App实战教程【环境配置、模拟器配置】

一、概述 Flutter是Google用以帮助开发者在IOS和Android 两个平台开发高质量原生UI的移动SDK&#xff0c;一份代码可以同时生成IOS和Android两个高性能、高保真的应用程序。 二、渲染机制 之所以说Flutter能够达到可以媲美甚至超越原生的体验&#xff0c;主要在于其拥有高性…...

stride与padding对输出尺寸的计算

公式&#xff1a; 练习&#xff1a; 图1&#xff1a; input4&#xff0c;filter3&#xff0c;padding0&#xff0c;stride1 output2 图2&#xff1a; input5&#xff0c;filter3&#xff0c;padding0&#xff0c;stride2 output2 图3&#xff1a; input6&#xff0c;filter3&am…...

Excel VSTO开发2 -建立Excel VSTO项目

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

chrome插件:一个基于webpack + react的chrome 插件项目模板

项目结构 $ tree -L 1 . ├── README.md ├── node_modules # npm依赖 ├── package.json # 详细依赖 ├── pnpm-lock.yaml ├── public # 里边包含dist&#xff0c;安装的时候安装这个目录即可 ├── src …...

Vue:组件缓存

组件缓存 keep-alive 文章目录 组件缓存 keep-alive一、keep-alive是什么二、keep-alive优点三、问题四、解决方案五、代码示例 六、回顾一下钩子七、总结 一、keep-alive是什么 keep-alive是Vue中的一个内置组件&#xff0c;会缓存不活动的组件实例。并不会销毁组件&#xff…...

【C++】DICOM医学影像工作站PACS源码

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

UDP的可靠性传输2

系列文章目录 第一章 UDP的可靠性传输-理论篇&#xff08;一&#xff09; 第二章 UDP的可靠性传输-理论篇&#xff08;二&#xff09; 文章目录 系列文章目录三、流量控制RTORTT流量控制1.如何控制流量2. 发送方何时在发送数据3.流程图 拥塞控制1.慢启动 总结1.拥塞控制和流量…...

《Java程序设计》实验报告

实验内容&#xff1a;面向对象程序设计 1、定一个名为Person的类&#xff0c;其中含有一个String类型的成员变量name和一个int类型的成员变量age&#xff0c; 分别为这两个变量定义访问方法和修改方法&#xff0c;另外再为该类定义一个名为speak的方法&#xff0c; 在其中输出n…...

数据可视化、BI和数字孪生软件:用途和特点对比

在现代企业和科技领域&#xff0c;数据起着至关重要的作用。为了更好地管理和理解数据&#xff0c;不同类型的软件工具应运而生&#xff0c;其中包括数据可视化软件、BI&#xff08;Business Intelligence&#xff09;软件和数字孪生软件。虽然它们都涉及数据&#xff0c;但在功…...

Ros noetic 机器人坐标记录运动路径和发布 实战教程(C)

前言: 承接上一篇博文本文将编写并记录上文中详细的工程项目,用于保存小车的运动路径,生成对应的csv,和加载所保存的路径到实际的Rviz中,本文将开源完整的工程项目,工程结构如下: 工程原码位于文章末尾: 路径存储: waypoint_saver 用于存储 waypoint 的节点 waypo…...

Linux入门之多线程|线程的同步|生产消费模型

文章目录 一、多线程的同步 1.概念 2.条件变量 2.1条件变量概念 2.2条件变量接口 1.条件变量初始化 2.等待条件满足 3.唤醒等待 3.销毁条件变量 2.3条件变量demo 二、生产消费模型 1.生产消费模型 2.基于BlockQueue的生产者消费者模型 3.基于C用条件变量和互斥锁实…...

MATLAB解析和保存ini文件

1. 将ini文件转换成struct结构体 function data ini2struct(filename)fid fopen(filename, r);if fid -1error(Unable to open file %s., filename);enddata struct();section ;while ~feof(fid)line fgetl(fid);line strtrim(line);% 如果是注释行或者空行&#xff0c…...

模型压缩-对模型结构进行优化

模型压缩-对模型结构进行优化 概述 模型压缩通常都是对推断过程而言&#xff0c;训练过程的计算代价通常不考虑&#xff0c;因为GPU可以快速完成任意复杂度模型的训练对于推断过程来说&#xff0c;模型应用才是对于速度敏感的场景多数情况下 希望使用尽可能少的能耗完成京可能…...

软件工程课件

软件工程 考点概述软件工程概述能力成度模型能力成熟度模型集成软件过程模型逆向工程![ ](https://img-blog.csdnimg.cn/425cea8190fb4c5ab2bf7be5e2ad990e.png) 考点概述 重点章节 软件工程概述 之前老版教程的&#xff0c;之前考过 能力成度模型 记忆 能力等级 和 特点 能力…...

基于ADS的marx雪崩电路设计-设计实践(射频脉冲源)

基于ADS的marx雪崩电路设计-设计实践&#xff08;射频脉冲源&#xff09; 设计一个ns级别的脉冲源&#xff0c;属于是半路转行的&#xff0c;虽然不了解具体原理但是也可以进行设计。具体的设计理论以及优化方法将在之后进行讨论. 参考文献&#xff1a;基于Marx电路的亚纳秒级…...

X86_64函数调用汇编程序分析

X86_64函数调用汇编程序分析 1 X86_64寄存器使用标准2 对应代码的分析2.1 main函数及其对应的汇编程序2.1.1 main的C代码实现2.1.2 main函数对应汇编及其分析2.1.3 执行完成之后栈的存放情况 2.2 test_fun_a函数及其对应的汇编程序2.2.1 test_fun_a函数的C实现2.2.2 test_fun_a…...

php做商品网站/如何宣传自己的网站

oracle11g关于坏块的修复一&#xff1a;bbed的命令简单介绍&#xff0c;后面用该工具构造块校验和不一致以达到模拟坏块目的show 显示当前所有配置选项info&#xff1a;列出当前bbed能处理的文件set dba fileid,block:设置当前要处理的数据文件id和块号set dba fileid&#xff…...

做网站调用无广告视频/seo建站技巧

蒸汽流量计采用先进的差动技术&#xff0c;配合隔离、屏蔽、滤波等措施&#xff0c;克服了同类产品抗震性差、小信号数据紊乱等问题&#xff0c;并采用了独特的传感器封装技术和防护措施&#xff0c;保证了产品的可靠性。产品有基本型和复合型两种型式&#xff0c;基本型测量单…...

wordpress 建站赚钱/百度云搜索引擎官方入口

说明&#xff1a; next(n)表示&#xff1a;命令是next&#xff0c;n是缩写&#xff1b;b表示break;i b表示info break;cond表示condition;r表示run;s表示step;c表示continue&#xff1b;p表示print&#xff1b;bt表示backtrack命令与参数之间有一个空格 调试运行环境相关命令 …...

北京市建委网站官网/百度视频免费下载

1.微信聊天记录是一个listview&#xff0c;并且分为自己和其他人的两个布局 1.1左侧为其他人的布局&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"a…...

效果好企业营销型网站建设开发/seo怎么去优化

1.CallableCallable与Runnable类似&#xff0c;理解Callable可以从比较其与Runnable的区别开始&#xff1a;1.从使用上&#xff1a;实现的Callable的类需要实现call()方法&#xff0c;此方法有返回对象V&#xff1b;而Runnable的子类需要实现run()方法&#xff0c;但没有返回值…...

网站实现步骤及方法/seo去哪里学

路由交换实验 第一篇&#xff1a;实验&#xff1a;通过console口访问交换机 第二篇&#xff1a;实验&#xff1a;通过Telnet访问路由器转载于:https://www.cnblogs.com/madsnotes/p/7095119.html...