【2】猫眼娱乐后端开发面试题整理

[1]. String为什么是线程安全的?

在Java中,存在一个存储字符串对象的特殊内存区域字符串常量池。当创建一个字符串时,如果该字符串已经存在于字符串常量池中,直接返回这个字符串的引用;如果不存在,将该字符串添加到字符串常量池中,并返回新创建的字符串的引用。

String类内部使用一个final修饰的字符数组来存储字符序列。final关键字确保了该数组在String对象生命周期内不会被重新赋值。

主要还是String的不可变性,一旦String对象被创建,其内部的字符序列就不能被改变。这一特性使得String可以在多个线程之间安全地共享,而不需要额外的同步机制。

[2]. StringBuilder和StringBuffer的区别

StringBuffer所有的公开方法都被synchronized修饰,从而保证了多线程环境下的数据一致性,是线程安全的,而StringBuilder并没有使用synchronized修饰其方法,是线程不安全的。

StringBuffer的toString方法使用缓存区的toStringCache 的值来构造一个字符串,而StringBuilder的toString方法是通过复制字符数组来构造一个字符串。

StringBuffer适用于需要在多线程环境中安全地构建字符串的场景,而StringBuilder适用于单线程环境或不需要线程安全的字符串构建场景。

[3]. Hashcode()和equals()为什么要重写?

equals() 方法用于比较两个对象是否“相等”。Java中在Object类中的默认实现是基于对象的内存地址来比较的,如果两个对象不是同一个实例,即使它们的内容完全相同,equals() 方法也会返回 false。

hashCode() 方法返回一个哈希码(整数),用于确定对象在哈希表中的位置。两个对象的哈希码相同是两个对象根据equals()方法也相等的必要不充分条件。也就是说,如果两个对象的哈希码相同,不能直接断定它们是相等的(因为可能存在哈希冲突),但如果它们相等,那么它们的哈希码一定相同。

Java中在Object类中的默认实现是基于对象的内存地址来计算的。如果不重写hashCode(),即使两个对象在逻辑上相等,它们也可能有不同的哈希码,这将导致哈希表无法正确识别它们,从而可能出现查找失败重复插入等问题。

[4]. synchronized和Reentranlock的区别

synchronized是Java语言内置的一个关键字,可用来修饰普通方法静态方法代码块,而ReentrantLock基于抽象类AQS(AbstractQueuedSynchronizer)实现的一个,只能用于代码块

synchronized会自动加锁和释放锁,而ReentrantLock需要手动加锁和释放锁。

synchronized是非公平锁,而ReentrantLock 默认为非公平锁,也可以手动指定为公平锁

synchronized不能响应中断,如果发生了死锁会一直等待下去,而使用 ReentrantLock可以响应中断并释放锁,从而解决死锁的问题。

[5]. 数据库中有哪些锁

按锁的粒度划分:表级锁、行级锁、页级锁

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率高,并发度低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。

页级锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

按锁对资源的访问权限划分:共享锁、排他锁

共享锁(读锁):当一个事务已经获取了数据项的共享锁后,其他事务可以继续对该数据项加共享锁,但是不能加排他锁。

排他锁(写锁):当一个事务对一个数据项加上排他锁后,其他事务无法再对该数据项加上任何类型的锁。

[6]. MySQL数据库的索引底层实现

MySQL的索引使用B+树作为底层的数据结构,举例说明一下:

比如当我们执行
select * from xxx where name="x"
这条SQL语句的时候,数据库引擎会检查name字段有没有索引,如果没有索引数据库引擎会做全表扫描,这样的话效率会比较低。如果有索引,数据库引擎会向内核申请从磁盘上读取索引文件到内存,一个节点接着一个节点在内存上构建B+树,每个节点对应一次磁盘IO。非叶子节点只存储关键字key,所有的key和data都存储在叶子节点,所以用B+树会以最少的磁盘IO构建出索引树。另外,在搜索的时候是以二分的方式进行搜索的,时间复杂度为O(logn)。

[7]. B+树和B树的区别

B+树只有叶子节点存储数据,非叶子节点仅存储索引,叶子节点间通过指针连接,B树的叶子结点和非叶子节点都会存储数据

B+树所有数据记录都存储在叶子节点上,且叶子节点同时还维护了一条双向链表,提高了范围查询的效率,而B树需要在各个节点上逐个查找,范围查找效率较低。

B+树适用于范围查询和顺序访问的场景,如数据库索引。B树适用于需要随机访问的场景,如文件系统索引

[8]. 常见的解决哈希冲突的方式

哈希冲突的解决方法主要分为两大类:开放地址法链地址法

开放地址法又分为3种:

线性探测法:当发生哈希冲突时,就线性地往后寻找下一个可用的位置,直到找到一个空位置为止。即,如果hash(key)的位置被占用,则尝试hash(key) + 1、hash(key) + 2...直到找到一个空位置。

二次探测法:当发生哈希冲突时,通过二次方程来寻找下一个可用的位置,以减小探测的步长。即,如果hash(key)的位置被占用,则尝试hash(key) + 1^2、hash(key) - 1^2、hash(key) + 2^2...

双重散列法:使用两个哈希函数,首先使用第一个哈希函数计算出一个初始哈希值,如果该位置已经被占用,就通过第二个哈希函数来计算下一个位置。即,如果hash1(key)的位置被占用,则尝试hash1(key) + hash2(key)、hash1(key) + 2 * hash2(key)...

链地址法:

将哈希表的每个槽设置为一个链表,当发生哈希冲突时,将具有相同哈希值的元素存储在同一个链表中。

[9]. HashMap线程不安全的例子

当两个线程同时进行插入操作时,假设它们都要插入到同一个数组位置,并且该位置没有元素,那么它们都会认为该位置可以插入元素,最终就会导致其中一个线程的元素被覆盖掉。类似地,删除操作也可能因相同原因导致数据被覆盖掉。

[10]. 常用的垃圾回收算法

标记-清除算法:由标记阶段和清除阶段构成。标记阶段遍历所有可达对象,将其标记为“活动”;清除阶段遍历内存空间,回收那些未被标记为“活动”的对象。

复制算法:将内存分为两半,每次只使用其中一半来分配对象。当这一半内存用尽时,复制当前这一半内存中所有存活的对象到另一半空闲内存中,并回收当前使用的一半内存。

标记-整理算法:在标记-清除算法基础上,不直接清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。

分代收集算法:一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),新生代存活率低,使用复制算法。而老年代对象存活率高,使用标记-清除或者标记-整理算法。

[11]. Java中常用的垃圾收集器

根据其工作方式可大致分类为串行(Serial)、并行(Parallel)和并发(Concurrent)三种类型。

串行垃圾收集器指的是Serial GC,并行垃圾收集器指的是Parallel GC,并发垃圾收集器有4种,分别是CMS GC、G1 GC、ZGC和Shenandoah GC。

Serial GC:单线程的收集器,只能在暂停所有应用线程的情况下进行垃圾回收。适用于单核处理器或小型应用。

Parallel GC:Serial GC的多线程版本。适用于多核处理器,追求高吞吐量的应用。

CMS(Concurrent Mark Sweep) GC:以获取最短回收停顿时间为目标的收集器,适用于Web服务器这种对响应时间有较高要求的应用。

G1(Garbage-First) GC:面向服务端应用的垃圾收集器。将堆内存划分为多个区域,并根据垃圾分布情况优先收集垃圾最多的区域。适用于追求高吞吐量和低停顿时间的应用。

ZGC:低延迟的垃圾回收器,旨在实现极低的停顿时间(不超过10ms)。适用于对低延迟有较高要求的应用程序。

Shenandoah GC:另一种低延迟的垃圾收集器,与ZGC类似。

[12]. Java深拷贝和浅拷贝的区别

在拷贝一个对象时,对于对象中的基本数据类型,深拷贝和浅拷贝没有区别。但是对于对象中的引用数据类型来说,浅拷贝只是将引用数据类型的地址值复制一份给新对象,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值会随之改变;而深拷贝会在新的内存空间里创建一个与原始对象中引用数据类型内容完全相同的新对象,新旧对象不共享内存,相互独立,修改其中一个对象的值,不会影响另一个对象。

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

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

相关文章

js实现导航栏鼠标移入时,下划线跟随鼠标滑动

话不多说&#xff0c;上代码&#xff1a; html代码&#xff1a; <div class"nav clearfix"><div class"bottomLine"></div><ul class"clearfix"><li class"nav__item"><a href"./index.html&…

React教程第二节之虚拟DOM与Diffing算法理解

1、什么是虚拟DOM 虚拟DOM 是javascript的一个对象&#xff0c;是内存中的一种数据结构&#xff0c;以树的形式存储UI的状态&#xff0c;树中的每个节点都代表着真实的DOM&#xff0c;用来描述我们希望在页面看到的 HTML结构&#xff1b; 现在的MVVM 框架&#xff0c;大多使用…

多线程4:线程池、并发、并行、综合案例-抢红包游戏

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

【WPF】Prism库学习(一)

Prism介绍 1. Prism框架概述&#xff1a; Prism是一个用于构建松耦合、可维护和可测试的XAML应用程序的框架。它支持WPF、.NET MAUI、Uno Platform和Xamarin Forms等多个平台。对于每个平台&#xff0c;Prism都有单独的发布版本&#xff0c;并且它们在不同的时间线上独立开发。…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征&#xff0c;代表着产品达到了高标准的要求。从技术层面看&#xff0c;认证确保产品与华为鲲鹏架构深度融合&#xff0c;能充分释放鲲鹏芯片的高性能、低功耗优势&#xff0c;为集成平台的高效运行提供强大动力。在安全方面&#xff0c;…

STM32 ADC --- 任意单通道采样

STM32 ADC — 单通道采样 文章目录 STM32 ADC --- 单通道采样cubeMX配置代码修改&#xff1a;应用 使用cubeMX生成HAL工程 需求&#xff1a;有多个通道需要进行ADC采样&#xff0c;实现每次采样只采样一个通道&#xff0c;且可以随时采样不同通道的功能。 cubeMX配置 这里我们…

web——upload-labs——第十二关——%00截断

查看源码 分析源码我们可以知道&#xff0c;这里是基于白名单过滤&#xff0c;只允许上传jpg,png,gif&#xff0c;但是这里注意第八行&#xff0c;上传路径是可以控制的&#xff0c;所以可以利用%00截断&#xff0c;来达到上传木马的目的。这里要注意一下&#xff0c;%00截断想…

STM32 创建一个工程文件(寄存器、标准库)

首先到官网下载对应型号的固件包&#xff1a; 像我的STM32F103C8T6的就下载这个&#xff1a; 依次打开&#xff1a; .\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 可以看到&#xff1a; 这…

Spark:大数据处理的强大引擎

一、Spark 简介 Apache Spark 是一个专为大规模数据处理而设计的快速、通用、可扩展的大数据分析计算引擎。它诞生于 2009 年&#xff0c;由美国加州伯克利大学的 AMP 实验室开发&#xff0c;2013 年被纳入 Apache 开源项目&#xff0c;并迅速成为顶级项目。 Spark 被认为是 …

鸿蒙HarmonyOS 地图定位到当前位置 site查询等操作

应用服务Map使用 地图定位 地点查询及导航 周边查询 点位标记定义等 地图定位 前提地图已经能正常显示&#xff0c;若不能显示请大家参考之前的那篇如何显示地图的博文 地图相关的api 位置效果图&#xff1a; module.json5配置权限 "requestPermissions": [{&…

编程语言02:语法基础

一、注释 (一)单行注释 java&#xff1a;//&#xff0c;快捷键 Ctrl/ package Summarize;public class L01_01 {public static void main(String[] args) {// 单行注释&#xff0c;快捷键Ctrl/} }python:#,快捷键Ctrl/ # python单行注释 (二)多行注释 java /*java多行注释…

ubuntu24.04网卡配置

vim /etc/netplan/01-netcfg.yaml /24表示子网掩码的长度。这种表示法称为CIDR&#xff08;无类别域间路由&#xff09;记法。CIDR记法将IP地址和它们的子网掩码合并为一个单一的值&#xff0c;其中斜杠/后面的数字表示子网掩码中连续的1的位数。 对于/24&#xff1a; 24表示…

基于普中51单片机开发板的电子门铃设计( proteus仿真+程序+设计报告+讲解视频)

基于普中51单片机开发板的电子门铃设计( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.15(有低版本) 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;P17 1. 主要功能&#xff1a; 基于51单片机的电子门铃设计 1、…

HTML and CSS Support HTML 和 CSS 支持

GoTo DevExpress Data Grid 数据网格 HTML and CSS Support HTML 和 CSS 支持 HTML和CSS支持允许您创建完全自定义的UI元素&#xff0c;并消除使用基于属性的UI自定义和CustomDraw事件。您可以构建 HTML 格式的 UI&#xff0c;并使用 CSS 样式自定义 UI 元素的外观设置、大小、…

掌握Golang中的数据竞争检测:runtime/race包全面教程

掌握Golang中的数据竞争检测&#xff1a;runtime/race包全面教程 引言数据竞争问题概述数据竞争的定义数据竞争对程序的影响常见数据竞争场景 Golang runtime/race包概述runtime/race包简介启用数据竞争检测使用 go run使用 go build使用 go test 基本用法与示例单元测试中的使…

Ascend C算子性能优化实用技巧05——API使用优化

Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。使用Ascend C&#xff0c;开发者可以基于昇腾AI硬件&#xff0c;高效的实现自定义的创新算法。 目前已经有越来越多的开发者使用Ascend C&#xff0c;我们…

【HCIP]——OSPF综合实验

题目 实验需求 根据上图可得&#xff0c;实验需求为&#xff1a; 1.R5作为ISP&#xff1a;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c;出口公网地址需要通过PPP协议获取&#xff0c;并进行CHAP认证。&#xff08;PS&#xff1a;因PPP协议尚未学习&#…

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因&#xff1a; &#xff08;1&#xff09;Redis有很高的性能&#xff1b; &#xff08;2&#xff09;Redis命令对此支持较好&#xff0c;实现起来比较方便 2、使用命令介绍&#xff1a; &#xff08;1&#xff09;SETNX SETNX …

Python-简单病毒程序合集(一)

前言&#xff1a;简单又有趣的Python恶搞代码&#xff0c;往往能给我们枯燥无味的生活带来一点乐趣&#xff0c;激发我们对编程的最原始的热爱。那么话不多说&#xff0c;我们直接开始今天的编程之路。 编程思路&#xff1a;本次我们将会用到os,paltform,threading,ctypes,sys,…

Web3浪潮下的区块链应用:从理论到实践的全面解析

随着Web3的兴起&#xff0c;区块链技术作为其核心支撑&#xff0c;正迎来前所未有的应用爆发。Web3不仅仅是技术的革新&#xff0c;更代表了一种去中心化、开放、透明的互联网愿景。在这一背景下&#xff0c;区块链技术的应用正从理论走向实践&#xff0c;推动着各行各业的数字…