Java面试题(4)

14.说一下HashMap的实现原理

HashMap概述:HashMap是基于哈希表的Map接口的非同步实现,以键值对的存储形式存在,且线程 不安全。此实现提供所有可选的映射操作,并允许使用空键值对,但并不保证映射的顺序,尤其是顺序 恒定性。

HashMap数据结构:在java中,最基本的数据结构就是两种,一个是数组,另一个是模拟指针(引 用),所有的数据结构都可以用这两个基本结构来构造,HashMap也是。另外HashMap实际上是一 个”链表散列+红黑树“的数据结构,即数组、链表和红黑树的结合体。

(1)HashMap线程不安全主要体现在哪 多线程环境下,使用put方法会发生数据覆盖的情况。 (2)HashMap底层数据结构 数组+链表 数组+链表+红黑树 在JDK1.8后,当链表长度超过8时,就会转换为红黑树,当小于6时变回链表。 在负载因子默认为0.75时,单个hash槽内元素个数为8的概率小于百万分之一(特别特别小),所以将 7作为分水岭,当等于7的时候不转换,大于等于8的时候转换为红黑树。

(3)哈希扩容 扩容阈值:负载因子(0.75)*当前容量 扩容步骤:1.创建一个新的数组,长度为原来的两倍 2.遍历取出原数组的所有内容,重新进行哈希函数计算出新的哈希值 3.重新插入元素

(4)HashMap为什么是两倍扩容 哈希值的计算是通过除留余数法获取,因为哈希表的大小始终为2的n次幂,所以可以将取模运算转为位 运算,效率更高。而且移动的数据也只有大约一半。

15.说一下HashSet的实现原理

HashSet底层由HashMap实现,他的值存放于HashMap的键上,并使得HashMap的值统一为 PRESENT。HashSet的实现比较简单,相关HashSet的操作基本都是直接调用底层HashMap的相关方 法来完成,HashSet不允许重复值。

16.说一下ArrayList的实现原理

ArrayList底层使用动态数组实现,实现了 RandmoAccess 、 Cloneable 、 Serializable 接口,因此可 以实现随机访问、克隆、序列化等功能。因此他的查找和访问效率更高,但新增和删除效率较低。 调用他的构造函数时只会出初始化数组的大小,而size这个变量不会初始化,此时调用set方法指定下标 设置数据会抛出数组越界异常,因此set方法中是根据size来判断是否可以设置当前下标的数据。

17.说一下LinkedList的实现原理

LinkedList底层使用双向链表实现,因此他的新增和删除效率更高,但查找和访问效率较低。实现了队 列接口,具有先进先出的功能。内部维护了链表长度以及头尾节点,获取长度不需要遍历。 (1)ArrayList与LinkedList的区别是什么 前者基于动态数组实现,方便查找和访问;后者基于双向链表实现,方便添加和删除。

(2)如何实现数组与List之间的转换 数组转List:使用Arrays.asList(array)进行转换。 List转数组:使用List自带的toArray()方法进行转换。

(3)Array与ArrayList的区别是什么

1. Array是数组,而ArrayList是继承与List集合的列表,是对数组的加强。

2. Array可以存储基本类型和对象,而ArrayList只能存储对象。

3. Array是指定固定大小的,而ArrayList大小是可以自动扩展的。

4. Array的内置方法没有ArrayList多,比如addAll、removeAll、iteration 等方法只有ArrayList有 。

18.说一下Vector的实现原理

Vector的内部实现类似于ArrayList,但是他的很多方法都加入了同步语句,因此是线程安全(相对安 全)的,实现了List、RandomAccess、Cloneable、 Serializable等接口 。

(1)说一下Vector与ArrayList的区别

1. Vector使用了Synchronized来实现线程同步,是线程安全的;ArrayList是非线程安全的

2. ArrayList的性能优于Vector

3. ArrayList和Vector都会根据实际需求进行扩容,只不过Vector扩容每次会增加一倍,而ArrayList 扩容只会增加50%

19.在Queue中poll()和remove()有什么区别

poll()和remove()都是从队列中取出一个元素,但是前者在获取元素失败的时候会返回空,但是后者失 败的时候会抛出异常。

20.那些集合类是线程安全的

1. Vector:比ArrayList多出了一个同步化机制(线程安全),但是因为效率低,不太建议使用了。 2. HashTable:就比HashMap多了个线程安全,去除了contains方法,增加了containsKay和 containsVal方法,且不允许出现空键值对。

3. statck:堆栈类,先进后出。

4. enumeration:枚举,相当于迭代器。

21.迭代器Iterator是什么

迭代器是一种设计模式,是一个对象,不是一个集合,而是一种用于访问集合的方法。它可以遍历并选 择序列(ArrayList、HashSet)中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称 为”轻量级“对象,因为创建它的代价小。

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

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

相关文章

关于使用jdk8自带的日期类getDayOfWeek()的详细解释

问题引入 我们会发现getDayOfWeek()这个函数和其他自带函数不一样 直接写会报错 但是如果我们将他变成getDayOfWeek().getValue() 又能够正常运行,我们这次就来看看是为什么 解释 进入getDayOfWeek()源码查看 我们进入getDayOfWeek()的源码中查看 我们可以发现他给我们返回的…

vivado:关联notepad++

网上好多都要下插件,看了野火视频,直接在vivado里面加路径弄好的 2 3(那个fonts and colors也经常用 改字体) 4 5 以下是我的路径 D:/gongjuruanjian/notepad/Notepad/notepad.exe [file name] -n[line number] 把[file name] -…

上位机图像处理和嵌入式模块部署(自定义算法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们在使用opencv的时候,虽然大部分算法都不需要我们自己重头开始编写,但是总有一些关于我们自己产品的know-how&#xff0…

控制项目风险

一、风险预算 暴雪公司经理艾莉森,暴雪公司是一家小型工业企业,该公司的高管为了降低生产成本,决定搬迁工厂。项目经理明白实际情况与初始计划之间常常会有很大的出入。项目经理需要事先为一些事情做好准备,并在项目运作或预算方面…

python报错:TypeError: ‘str‘ object is not callable

错误打印: python 代码: datalist [];datadictTmp (};mch 48;for i in range(1,10):datadict.clear()mch 48 ## 报错位置 datadict[parent_ID] str(i)chr(mch)mch 1datadict[paymentMethod] str(i)chr(mch)mch 1datadict[payer] str(i)chr(mc…

kafka入门(八):kafka分区分配策略

kafka分区分配策略 参数: Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。 默认情况下,此参数的值为 org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略…

【服务器】安装宝塔面板

目录 🌺【前言】 🌼【前提】连接服务器 🌷方式一 使用工具登录服务器如Xshell 🌷方式二 阿里云直接连接 🌼 1. 安装宝塔 🌷获取安装脚本 方式一 使用下面提供的脚本安装 方式二 使用官网提供的脚本…

notepad++ v8.5.3 安装插件,安装失败怎么处理?下载进度为0怎么处理?

notepad v8.5.3 安装插件,安装失败?下载进度为0,怎么处理? 安装 进度 进度条没有进度 ,然后就退出了,自动打开程序,不知道什么问题,插件管理下面也没有插件显示 找到问题了&#x…

2024年最全春节攻略,外贸人看这一篇就够了

凡事预则立,不预则废--《礼记•中庸》 不知不觉春节将至,很多外贸公司以及工厂也都公布了放假时间,虽然放假时间有长有短。很多人应该都有点迫不及待想要快点放假,回家过春节。春节毕竟是我们每年最重大的节日,也是家…

梯度下降算法实现原理

文章目录 什么是梯度梯度下降算法(通过迭代解决目标函数最小值)代码实现拓展: 什么是梯度 在了解梯度之前,我们先了解一下导数: 用于描述曲线变换快慢的一个量,在几何意义上表示为函数的斜率,数学定义为: f ′ ( x ) lim ⁡ △ x → 0 f ( x △ x ) − f ( x ) △ x f(x) \…

【Python进阶编程】python编程高手常用的设计模式(持续更新中)

Python编程高手通常熟练运用各种设计模式,这些设计模式有助于提高代码的可维护性、可扩展性和重用性。 以下是一些Python编程高手常用的设计模式: 1.单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供全局…

Taro框架如何抹平各端的差异

Taro 是一款开源的跨端统一开发框架,它通过以下方式来抹平各端(如微信小程序、支付宝小程序、H5、React Native 等)的差异: 统一的编程模型:Taro 提供了与 React 类似的编程模型,开发者可以使用 JSX 语法和…

幻兽帕鲁服务器搭建,包教包会

服务器搭建 幻兽帕鲁服务器搭建,包教包会,不会评论区评论手把手帮忙搭建 一、steamCMD安装 1、安装screen: yum install screen -y 2、切换用户: su -ls /bin/bash steam 3、切换至steam用户目录: cd ~ 4、下载ste…

CrawlSpider【获取当前访问链接的父链接和锚文本】代码逻辑

tip: 超链接对应的文案通常被称为“锚文本”(anchor text) 在继承CrawlSpider父类的前提下,编写一个 fetch_referer 方法获取当前response.url的父链接和锚文本。 实现逻辑,通过一个例子简要说明: 如果设置 start_…

快快销ShopMatrix 分销商城多端uniapp可编译5端 - 订单金额满多少,一次性订单金额满多少,充值多少升级

“订单金额满多少”或“一次性订单金额满多少”进行升级的商业逻辑。这种策略通常是为了激励用户增加消费额度、提高客单价或者提升用户的活跃度与忠诚度,具有以下好处: 刺激消费增长:商家设置一定的门槛,如一次性订单金额满300元…

C++基础语法和用法

文章目录 1.hello world2.引入namespace(命名空间/域问题)3.输入输出4.缺省参数/默认参数5.函数重载6.引用7.内联函数8.auto关键字&#xff0c;基于范围的for循环&#xff0c;空指针NULL8.1 auto8.2 基于范围的for循环8.3 nullptr 1.hello world #include <iostream> us…

世界经济论坛发布《2024年全球风险报告》和《2024年全球网络安全展望》:网络攻击是2024世界5大风险之一,网络安全经济增速是全球经济的四倍

在近日举行的世界经济论坛 (WEF)上&#xff0c;发布了《2024 年全球风险》报告和《2024年全球网络安全展望》两份重磅报告&#xff0c;分别揭示了全球经济今年和未来几年可能面临的一些关键风险和问题&#xff0c;以及网络安全与全球经济之间的逻辑关系。 2024年全球风险报告 今…

SQL数据库的创建操作

1.如何才能创建一个库、表 CREATE DATABASE 数据库: SHOW databases&#xff1b; USE 数据库; DROP DATABASE 数据库&#xff1b; /*数据表操作/ CREATE TABLE teacher( id int (4) not null primary key auto_increment, name char(20)not null, sex char(10) notnul…

ES6笔记-symbol

ES6 symbol 是什么 ES5的对象属性名是字符串&#xff0c;这容易造成属性名的冲突。symbol是一种机制&#xff0c;保证每个属性的名字都是独一无二的。这样就从根本上防止属性名冲突。 它是一种原始数据类型Symbol,表示独一无二的值。它属于javaScript语言的原生数据类型之一。…

CloudPanel RCE漏洞复现(CVE-2023-35885)

0x01 产品简介 CloudPanel 是一个基于 Web 的控制面板或管理界面,旨在简化云托管环境的管理。它提供了一个集中式平台,用于管理云基础架构的各个方面,包括虚拟机 (VM)、存储、网络和应用程序。 0x02 漏洞概述 由于2.3.1 之前的 CloudPanel 具有不安全的文件管理器 cook…