[持续更新]计算机经典面试题基础篇Day1
[通用]计算机经典面试题基础篇Day1
1、jvm的组成
- 类加载器(Class Loader):负责将编译后的Java类加载到JVM中,并在运行时动态加载所需的类。
- 运行时数据区(Runtime Data Area):是JVM的内存管理区域,主要包括方法区、堆、栈、程序计数器等。
- 执行引擎(Execution Engine):负责执行字节码指令,可以通过解释器、即时编译器(JIT)等方式来实现。
- 垃圾回收器(Garbage Collector):负责自动管理堆内存的分配和释放,回收无用对象的内存。
- 本地方法接口(Native Interface):允许Java代码调用本地的C、C++等语言编写的代码。
- JNI(Java Native Interface):允许Java代码与本地代码进行交互,调用本地的C、C++等语言编写的方法。
2、jvm中的堆和栈的理解
- 方法区(Method Area):方法区是JVM的一部分,用于存储类的结构信息,如类的字段、方法、常量池、静态变量等。它是所有线程共享的区域。在JVM的规范中,并没有明确规定方法区的实现方式,不同的JVM实现可以有不同的方法区实现方式。
- 堆(Heap):堆是JVM中存储对象实例的区域,是Java程序中创建的对象所分配的内存区域。堆是所有线程共享的区域。在JVM启动时就会创建一个堆,堆的大小可以通过启动参数进行调整。堆被划分为年轻代和老年代,其中年轻代又分为Eden空间、Survivor空间(From和To)。
- Eden空间:对象的初始分配都在Eden空间中进行,当Eden空间满时触发Minor GC,并将存活的对象复制到Survivor空间。
- Survivor空间:存放从Eden空间中幸存的对象,当Survivor空间满时触发Minor GC,并将存活的对象复制到另一个Survivor空间,同时清空当前Survivor空间。
- 老年代:存放长时间存活的对象,当老年代满时触发Full GC。
- 栈(Stack):栈是JVM中的一个线程私有区域,用于存储方法的局部变量、操作数栈、方法返回值和异常处理信息等。每个线程在执行方法时都会创建一个栈帧,栈帧中保存了方法的局部变量、操作数栈等信息。随着方法的调用和返回,栈帧会被入栈和出栈。
- 程序计数器(Program Counter):程序计数器是JVM中的一个线程私有区域,用于记录当前线程执行的字节码指令的地址。每个线程都有一个独立的程序计数器,它指向当前正在执行的指令,在线程切换时会保存和恢复当前线程的程序计数器的值。程序计数器是线程私有的,不会发生内存溢出的情况,并且不会进行垃圾回收。
3、java类加载的三种方式
Java类加载是指将类的字节码文件加载到JVM中,并进行类的初始化和连接的过程。Java类加载有三种方式:
- 隐式加载(隐式类加载):当程序在执行过程中使用new关键字创建对象或者调用静态方法、静态变量时,JVM会自动加载相应的类。这是最常见的类加载方式,也是默认的类加载方式。
- 显式加载(显式类加载):使用Class.forName()方法来显式加载类。Class.forName()方法会根据提供的类的全限定名(包括包名)来加载类并返回对应的Class对象。这种方式可以动态加载类,根据运行时的条件决定加载哪个类。
- 被动加载(被动类加载):当一个类被引用,但并没有实际使用到该类的时候,类不会被加载。只有在真正使用到类时,才会加载该类。常见的被动加载场景包括通过子类引用父类的静态字段、通过数组定义引用类、常量在编译阶段会存入调用类的常量池等。
4、说说你对java中双亲委派机制的理解
双亲委派机制是Java类加载机制中的一种。它的核心思想是当类加载器需要加载一个类时,它会先委托给父类加载器去尝试加载,只有当父类加载器无法加载该类时,才会由当前类加载器去加载。这样可以保证类的唯一性和安全性,避免重复加载和恶意代码的加载。双亲委派机制在Java中起到了重要的作用,实现了类的共享和重用。
5、请你说说对gc的理解
GC(Garbage Collection)是一种自动内存管理机制,用于自动回收不再使用的对象所占用的内存空间。它通过标记、清除和压缩等步骤来完成垃圾回收的过程。程序员无需手动触发,由JVM的垃圾回收器自动执行。合理的编码和内存管理可以最大程度发挥GC的作用,提高程序性能和稳定性。
6、 hashmap容怎么实现扩容
HashMap在插入元素时,会根据负载因子(load factor)来判断是否需要进行扩容操作。负载因子是指哈希表中已存储元素个数与实际容量的比值。
当HashMap的负载因子超过设定的阈值时(默认为0.75),就会触发扩容操作。扩容会创建一个新的更大的哈希表,并将原有的元素重新分配到新的哈希表中,以减少哈希冲突,提高查询效率。
HashMap的扩容过程大致包括以下几个步骤:
- 创建新的哈希表,其容量是原哈希表的两倍。新哈希表的容量一般会选择最接近且大于原容量的2的幂次方。
- 遍历原哈希表中的每个桶(bucket),将桶中的元素重新计算哈希值并分配到新哈希表中的对应桶中。这一步骤会重新计算元素的哈希值和索引位置,确保元素在新哈希表中的位置发生变化。
- 将新哈希表设置为当前哈希表,原哈希表则成为垃圾对象等待垃圾回收。
扩容操作可能会对性能产生一定的影响,因为需要重新计算哈希值和重新分配元素。为了减少扩容的频率,可以通过调整负载因子的大小来控制HashMap的容量和性能之间的平衡。较小的负载因子会使哈希表更快地扩容,但会占用更多的内存空间,较大的负载因子则会减少扩容的次数,但可能会导致哈希冲突增多。
7、谈谈你对hashtable和currenthashmap的理解
Hashtable和ConcurrentHashMap都是Java中的线程安全的哈希表实现,它们在功能和使用方式上有一些相似之处,但在内部实现和性能方面有一些区别。
- Hashtable: Hashtable是最早引入的哈希表实现,它是线程安全的,所有的操作都是同步的(通过synchronized关键字实现)。由于同步的原因,HashTable在多线程环境下的性能比较低,只能通过同一时刻只允许一个线程访问的方式来保证线程安全。
- ConcurrentHashMap: ConcurrentHashMap是Java 5中引入的高性能线程安全的哈希表实现。它通过使用分段锁(Segment)来实现并发访问的高效性。每个Segment相当于一个小的HashTable,可以独立地进行操作,不同的Segment之间可以并发地进行读写操作。这样,在大多数情况下,不同的线程可以同时操作不同的Segment,提高了并发访问的效率。ConcurrentHashMap在并发环境下具有较高的性能和扩展性。
- 区别:
- 线程安全性:Hashtable是通过同步的方式实现线程安全,而ConcurrentHashMap是通过分段锁(Segment)实现高效的并发访问。
- 性能:ConcurrentHashMap相对于Hashtable在多线程环境下具有更好的性能,可以支持更高的并发度。
- 迭代器弱一致性:Hashtable的迭代器是强一致性的,即在迭代过程中不会发生修改。而ConcurrentHashMap的迭代器是弱一致性的,可以在迭代过程中发生修改,但不会抛出ConcurrentModificationException异常。
如果需要在多线程环境下使用哈希表且对性能要求较高,推荐使用ConcurrentHashMap。
如果在单线程环境下或性能要求不高的情况下,可以使用HashTable。
8、说一下tcp的三次握手和四次挥手
TCP(Transmission Control Protocol)是一种可靠的、面向连接的网络传输协议。在建立和关闭TCP连接时,需要进行三次握手和四次挥手的过程。
三次握手(Three-way Handshake)的过程如下:
- 第一次握手:客户端发送一个带有SYN(同步)标志的TCP报文段给服务器,请求建立连接。此时客户端进入SYN_SENT状态。
- 第二次握手:服务器接收到客户端的请求后,回复一个带有SYN和ACK(确认)标志的报文段给客户端。此时服务器进入SYN_RECEIVED状态。
- 第三次握手:客户端接收到服务器的回复后,再次发送一个带有ACK标志的报文段给服务器,表示连接已建立。此时连接建立完成,客户端和服务器都进入ESTABLISHED状态,可以开始进行数据传输。
四次挥手(Four-way Handshake)的过程如下:
- 第一次挥手:客户端发送一个带有FIN(结束)标志的报文段给服务器,表示客户端不再发送数据。客户端进入FIN_WAIT_1状态。
- 第二次挥手:服务器接收到客户端的结束请求后,发送一个带有ACK标志的报文段给客户端,表示服务器收到了结束请求。此时服务器进入CLOSE_WAIT状态。
- 第三次挥手:服务器发送一个带有FIN标志的报文段给客户端,表示服务器不再发送数据。服务器进入LAST_ACK状态。
- 第四次挥手:客户端接收到服务器的结束请求后,发送一个带有ACK标志的报文段给服务器,表示客户端收到了结束请求。客户端进入TIME_WAIT状态,等待一段时间后关闭连接。服务器接收到ACK后,关闭连接,进入CLOSED状态。
通过三次握手,客户端和服务器建立起可靠的连接;通过四次挥手,双方完成数据传输并安全地关闭连接。这样可以确保数据的可靠传输和连接的正常释放。
9、说一下tcp和udp的区别
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常用的传输层协议,它们在特点和适用场景上有以下几点区别。
- 连接性:
- TCP是面向连接的协议,通过三次握手建立连接,提供可靠的、有序的、面向字节流的数据传输。TCP确保数据的完整性和可靠性,适用于对数据准确性要求较高的场景。
- UDP是无连接的协议,不需要建立连接,直接发送数据包。UDP提供了一种简单的、无拥塞控制的数据传输方式,适用于对实时性要求较高,但对可靠性要求相对较低的场景。
- 数据传输特性:
- TCP提供可靠的数据传输,通过序列号和确认机制,保证数据的按序到达且不丢失。TCP还提供流量控制和拥塞控制机制,以避免网络拥塞和数据丢失。
- UDP提供不可靠的数据传输,数据包可能会丢失、重复、乱序。UDP没有流量控制和拥塞控制机制,数据传输速度更快,但不保证数据的可靠性。
- 数据报大小:
- TCP没有固定的最大数据报大小限制,可以传输大量的数据,适用于大文件传输。
- UDP的数据报大小有限制(64KB),适用于传输较小的数据包。
- 效率:
- TCP在保证可靠性的同时,会引入较大的延迟,数据传输速度相对较慢。
- UDP则没有TCP的拥塞控制和重传机制,传输效率更高,但由于可靠性较低,不适用于对数据准确性要求较高的场景。
10、 arrayList和LinkedList的区别
ArrayList和LinkedList都是Java中常用的集合类,它们有以下几点区别:
- 内部实现结构:
- ArrayList底层使用数组实现,通过索引可以快速地访问和修改元素。
- LinkedList底层使用双向链表实现,每个节点包含了当前元素的值和指向前后节点的引用。
- 插入和删除操作:
- ArrayList对于插入和删除操作效率较低,因为需要移动其他元素来填补被删除或插入的位置。
- LinkedList对于插入和删除操作效率较高,只需要修改节点的指针即可。
- 随机访问:
- ArrayList支持随机访问,即通过索引直接访问元素,时间复杂度为O(1)。
- LinkedList不支持随机访问,需要从头节点开始遍历到目标位置,时间复杂度为O(n)。
- 内存占用:
- ArrayList在内存中需要连续的存储空间,因此在插入和删除元素时可能需要进行数组的扩容和复制,占用的内存空间较大。
- LinkedList在内存中使用链表结构,每个节点只需存储当前元素和前后节点的引用,占用的内存空间相对较小。
如果需要频繁进行随机访问,而对于插入和删除操作性能要求不高,可以选择ArrayList。如果需要频繁进行插入和删除操作,而对于随机访问的性能要求不高,可以选择LinkedList。在选择使用哪个集合类时,需要根据具体的应用场景和需求进行权衡
相关文章:

[持续更新]计算机经典面试题基础篇Day1
[通用]计算机经典面试题基础篇Day1 1、jvm的组成 类加载器(Class Loader):负责将编译后的Java类加载到JVM中,并在运行时动态加载所需的类。运行时数据区(Runtime Data Area):是JVM的内存管理区…...

ProcessWindowFunction 结合自定义触发器的陷阱
背景: flink中常见的需求如下:统计某个页面一天内的点击率,每10秒输出一次,我们如果采用ProcessWindowFunction 结合自定义触发器如何实现呢?如果这样实现问题是什么呢? ProcessWindowFunction 结合自定义触发器实现…...

什么是jvm
一、初识JVM(虚拟机) JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Jav…...

kettle通过java步骤获取汉字首拼
kettle通过java步骤获取汉字首拼 用途描述 一组数据,需要获取汉字首拼后,输出; 实现效果 添加jar包 pinyin4j-2.5.0.jar 自定义常量数据 Java代码 完整代码: import net.sourceforge.pinyin4j.PinyinHelper; import net.sou…...

Conformer: Local Features Coupling Global Representationsfor Visual Recognition
论文链接:https://arxiv.org/abs/2105.03889 代码链接:https://github.com/pengzhiliang/Conformer 参考博文:Conformer论文以及代码解析(上)_conformer代码_从现在开始壹并超的博客-CSDN博客 摘要 在卷积神经网络…...

java8-Stream流常用API
什么是 Stream Stream(流)是 Java 8 引入的一个新的抽象概念,它代表着一种处理数据的序列。简单来说,Stream 是一系列元素的集合,这些元素可以是集合、数组、I/O 资源或者其他数据源。 Stream API 提供了丰富的操作方…...

React 任务调度
React 任务池 不同的fiber任务有不同的优先级,为了用户体验,React需要先处理优先级高的任务。 为了存储这些任务,React中有两个任务池: // Tasks are stored on a min heap var taskQueue []; // 存储立即要执行的任务 var tim…...

小白开始学习C++
第一节:控制台输出hello word! #include<iostream> //引入库文件 int main() { //控制台输出 hello word! 之后回车 std::cout << "hello word!\n"; #include<iostream> //引入库文件int main() {//控制…...

SpringMVC入门的注解、参数传递、返回值和页面跳转---超详细教学
前言: 欢迎阅读Spring MVC入门必读!在这篇文章中,我们将探索这个令人兴奋的框架,它为您提供了一种高效、灵活且易于维护的方式来构建Web应用程序。通过使用Spring MVC,您将享受到以下好处:简洁的代码、强大…...

【复习socket】每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——28/70 第二十八天
专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮忙 点…...
vue2踩坑之项目:生成二维码使用vue-print-nb打印二维码
1. vue2安装 npm install vue-print-nb --save vue3安装 npm install vue3-print-nb --save 2. //vue2 引入方式 全局 main.js import Print from vue-print-nb Vue.use(Print) ------------------------------------------------------------------------------------ //vue2 …...

【iVX】十五分钟制作一款小游戏,iVX真有怎么神?
个人主页:【😊个人主页】 新人博主,喜欢就关注一下呗~ 文章目录 前言iVX介绍初上手布置背景制作可移动物体总结(完善步骤) 前言 在上篇文章中,我向大家介绍了一种打破常规的编程方式——iVX,可…...

SpringMVC常用注解、参数传递、返回值
目录 前言 一、常用注解 二、参数传递 编辑 1. 基础类型String类型 2. 复杂类型 3. RequestParam 4. PathVariable 5.RequestBody 6. RequestHeader 三、方法返回值 一:void 二:String 三:Stringmodel 四:ModelAndVi…...

新公司第一次上架新APP需要提前准备哪些材料?
目录 前言一、需要上架的应用市场二、需要准备的资料总结 前言 前不久,使用一家新公司刚刚上架了一款新的APP项目。特此记录一下,现在第一次上架一款APP需要提前准备的各项材料。 一、需要上架的应用市场 现在,上架一款新的APP主流的应用市…...

『C语言进阶』指针进阶(一)
🔥博客主页: 小羊失眠啦 🔖系列专栏: C语言 🌥️每日语录:无论你怎么选,都难免会有遗憾。 ❤️感谢大家点赞👍收藏⭐评论✍️ 前言 在C语言初阶中,我们对指针有了一定的…...

2605. 从两个数字数组里生成最小数字(Java)
给你两个只包含 1 到 9 之间数字的数组 nums1 和 nums2 ,每个数组中的元素 互不相同 ,请你返回 最小 的数字,两个数组都 至少 包含这个数字的某个数位。 示例 1: 输入:nums1 [4,1,3], nums2 [5,7] 输出:1…...

深度解析 PostgreSQL Protocol v3.0(一)
引言 PostgreSQL 使用基于消息的协议在前端(也可以称为客户端)和后端(也可以称为服务器)之间进行通信。该协议通过 TCP/IP 和 Unix 域套接字支持。 《深度解析 PostgreSQL Protocol v3.0》系列技术贴,将带大家深度了…...

Mysql中having语句与where语句的用法与区别
分析&回答 我们在写sql语句的时候,经常会使用where语句,很少会用到having,其实在mysql中having子句也是设定条件的语句与where有相似之处但也有区别。having子句在查询过程中慢于聚合语句(sum,min,max,avg,count)。而where子句在查询过程中则快于聚合语句(sum,min,max,avg…...

基于qt软件的网上聊天室软件
1.服务器: 1).功能: 用于创建一个客户端,通过文本编辑器来获得端口号,根据获得的端口号创建服务器,等待客户端连接 创建成功会提示服务器创建成功 在收到客户端发送的信息时,把这条信息发送给其他所有客户端,实现群…...

本是同根生-双数据库集群keepalived virtual_route_id冲突导致连接故障
项目场景: 一企业近期陆续开始升级办公与大数据系统,新的承包商。原有的数据库是某国内大品牌A,现在新的功能准备陆续迁移到大品牌B上。系统部署后,A依旧承担比较轻松的财务、仓库管理,B承担实时的线上业务。项目验收…...

『力扣每日一题06』字符串中的第一个唯一字符
今天是学习新知识的一天,String 类中有太多细枝末节,需要我去学习跟掌握了。 话不多说,今天给大家带来一道字符串的题目~ 一、题目 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在&…...

selenium鼠标操作方法
1.0 selenium新版本封装驱动 from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import ChromiumOptions from selenium.webdriver.chrome.service import Servicedef get_chrome_driver(driver_path):chrome_options ChromiumOptions()chrome_…...

医者无疆 | AI赋能大医精诚,医疗制药的进阶与突破
在历史的长河中,医学一直是人类文明的重要组成部分。从古希腊的希波克拉底到现代医学研究,医学始终与时俱进,为人类的健康和福祉做出了巨大的贡献。在互联网、大数据、5G等信息技术的迭代下,人工智能(AI)的…...

使用 Hue 玩转 Amazon EMR(SparkSQL, Phoenix) 和 Amazon Redshift
现状 Apache Hue 是一个基于 Web 的交互式 SQL 助手,通过它可以帮助大数据从业人员(数仓工程师,数据分析师等)与数据仓库进行 SQL 交互。在 Amazon EMR 集群启动时,通过勾选 Hue 进行安装。在 Hue 启用以后࿰…...

Unity中神秘的Transform和transform(小写)的关系
1.为什么Transform类是保护的不能通过new 来实例化对象,也没有静态函数,而Rotate()这种方法却属于它,该如何访问? Transform 类还是被保护的不允许用户修改! protected Transform(); 是一个受保护的构造函数,不能直接实例化 Transform 类。 2.为甚么transform可以访问Tr…...

【LeetCode-中等题】78. 子集
文章目录 题目方法一:动态规划方法二:递归加回溯(关键----startIndex) 题目 注意:这里的nums数组里面的元素是各不相同的,所以不存在去重操作 方法一:动态规划 public List<List<Integer>> subsets(int[]…...

学习设计模式之代理模式,但是宝可梦
前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 代码同步更新到 github ,要是点个Star您就是我的神 目录 前言代理模式1.情景模拟1.1静态代理优点局限 1.2 动态代理 2.应用3.局限4.解决方…...

自学Python01-创建文件写入内容
此处省去安装和前言,需要两个东西 一个去下载安装python官方库 Welcome to Python.org 一个是编译器pycharm PyCharm 安装教程(Windows) | 菜鸟教程 PyCharm: the Python IDE for Professional Developers by JetBrains 第一节 练习print…...

Qt —UDP通信QUdpSocket 简介 +案例
1. UDP通信概述 UDP是无连接、不可靠、面向数据报(datagram)的协议,可以应用于对可靠性要求不高的场合。与TCP通信不同,UDP通信无需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口。 QUdpSocket…...

五大类注解和方法注解详解
五大类注解为Controller,Service,Repository,Configuration,Component,方法注解为Bean。 需要注意的是:Bean注解必须要在类注解修饰的类内才能正常使用。 一、与配置文件的关系 在spring原生项目中 如果你使用的spri…...