java面试强基(19)

news2024/11/26 12:01:46

 

HashMap 和 Hashtable 的区别? 

  1. 线程是否安全: HashMap 是非线程安全的,Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
  2. 效率: 因为线程安全的问题,HashMap 要比 Hashtable 效率高一点。另外,Hashtable 基本被淘汰,不要在代码中使用它;
  3. 对 Null key 和 Null value 的支持: HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有 null 键和 null 值,否则会抛出 NullPointerException
  4. 初始容量大小和每次扩充容量大小的不同 : ① 创建时如果不指定容量初始值,Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。② 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小。也就是说 HashMap 总是使用 2 的幂作为哈希表的大小,后面会介绍到为什么是 2 的幂次方。
  5. 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

HashMap 和 HashSet 区别? 

HashSet 底层就是基于 HashMap 实现的。

HashMapHashSet
实现了 Map 接口实现 Set 接口
存储键值对仅存储对象
调用 put()向 map 中添加元素调用 add()方法向 Set 中添加元素
HashMap 使用键(Key)计算 hashcodeHashSet 使用成员对象来计算 hashcode 值,对于两个对象来说 hashcode 可能相同,所以equals()方法用来判断对象的相等性

HashMap 和 TreeMap 区别? 

TreeMap 和HashMap 都继承自AbstractMap ,但是需要注意的是TreeMap它还实现了NavigableMap接口和SortedMap 接口。

实现 NavigableMap 接口让 TreeMap 有了对集合内元素的搜索的能力。

实现SortedMap接口让 TreeMap 有了对集合中的元素根据键排序的能力。默认是按 key 的升序排序,不过我们也可以指定排序的比较器。

 

说说HashMap 的底层实现? 

JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。

所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞。

JDK1.8 之后相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。

TreeMap、TreeSet 以及 JDK1.8 之后的 HashMap 底层都用到了红黑树。红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。

  • loadFactor 加载因子

    loadFactor 加载因子是控制数组存放数据的疏密程度,loadFactor 越趋近于 1,那么数组中存放的数据(entry)也就越多,也就越密,也就是会让链表的长度增加,loadFactor 越小,也就是趋近于 0,数组中存放的数据(entry)也就越少,也就越稀疏。

    loadFactor 太大导致查找元素效率低,太小导致数组的利用率低,存放的数据会很分散。loadFactor 的默认值为 0.75f 是官方给出的一个比较好的临界值。

    给定的默认容量为 16,负载因子为 0.75。Map 在使用过程中不断的往里面存放数据,当数量达到了 16 * 0.75 = 12 就需要将当前 16 的容量进行扩容,而扩容这个过程涉及到 rehash、复制数据等操作,所以非常消耗性能。

  • put方法

​ HashMap 只提供了 put 用于添加元素,putVal 方法只是给 put 方法调用的一个方法,并没有提供给用户使用。

​ 对 putVal 方法添加元素的分析如下:

  1. 如果定位到的数组位置没有元素 就直接插入。

  2. 如果定位到的数组位置有元素就和要插入的 key 比较,如果 key 相同就直接覆盖,如果 key 不相同,就判断 p 是否是一个树节点,如果是就调用e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value)将元素添加进入。如果不是就遍历链表插入(插入的是链表尾部)。

我们再来对比一下 JDK1.7 put 方法的代码

对于 put 方法的分析如下:

  • ① 如果定位到的数组位置没有元素 就直接插入。
  • ② 如果定位到的数组位置有元素,遍历以这个元素为头结点的链表,依次和插入的 key 比较,如果 key 相同就直接覆盖,不同就采用头插法插入元素

 

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

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

相关文章

CCES软件开发ADSP-21489的详解

作者的话 21489和21479在自己写代码C编程的开发模式下&#xff0c;可以使用 Visual DSP软件&#xff0c;也可以使用 CCES 软件。CCES 软件是基于 Eclipse内核的&#xff0c;所以你会发现使用起来跟很多其他的调试工具很类似。本篇会简单的讲一下如何用CCES 软件来做开发。 PS…

【发福利啦!】畅享上百万卡时NPU普惠算力,启智与昇思MindSpore社区联合推出算力支持计划

启智社区与MindSpore联合&#xff0c;为MindSpore开发者提供 365天*24小时 上百万卡时的MindSporeNPU普惠算力&#xff0c;欢迎MindSpore产学研开发者申请&#xff0c;基于MindSpore开发你自己的模型算法套件和应用 嘿~因为了解到日理万机的你可能没有时间仔细阅读完整篇文章&…

[windows] opencv + ffmpeg + h264 + h265 源码编译教程

1 前言 此方法可支持读写 H264/H265编码的视频 2 环境准备 官网下载 msys 安装 建议默认路径安装&#xff0c;避免不必要的麻烦 打开MSYS2 MSYS命令行 打开后&#xff0c;能看见下图中的MSYS标记 在MSYS 命令行上执行下面命令安装依赖库&#xff0c;安装的时候建议每个…

C# 实现模拟PID调试(学习专用无硬件)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace PID控制 {public class PIDModel{public float goal; //定义设定值public float thisValue; //定义实际值public float err…

DBCO-ICG-disulfo_二磺酸-吲哚菁绿-二苯并环辛炔_disulfo-ICG-DBCO

一、理论分析&#xff1a; 中文名&#xff1a;二磺酸-吲哚菁绿-二苯并环辛炔、水溶性吲哚菁绿-二苯基环辛炔 英文名&#xff1a;disulfo-ICG-DBCO、DBCO-ICG-disulfo CAS号&#xff1a;N/A 化学式&#xff1a;C63H62N4Na2O11S3 分子量&#xff1a;1193.37二、产品详情&#xff…

Bootstrap Table pagelist设置后失效

Bootstrap Table pagelist设置后不生效、失效、不起作用、不能使用问题。 前言 在使用Bootstrap Table进行数据展示时&#xff0c;设置pagelist选项后不生效。bootstrap版本为 v3.3.7。 经过 网上搜索尝试使用以下几种方式解决&#xff0c;发现均不行&#xff0c;你们可以参…

深入理解ReentrantReadWriteLock源码

1. ReentrantReadWriteLock简介 之前我们介绍过ReentrantLock&#xff0c;它是基于AQS同步框架实现的&#xff0c;是一种可重入的独占锁。但是这种锁在读多写少的场景下&#xff0c;效率并不高。因为当多个线程在进行读操作的时候&#xff0c;实际上并不会影响数据的正确性。 …

分享5款小众软件,大家按需下载

今天推荐一些可以大幅度提升办公效率的小软件&#xff0c;安全无毒&#xff0c;下载简单&#xff0c;最重要的是没有广告&#xff01; 1.进程调试——Process Lasso Process Lasso是一款独特的调试进程级别的系统优化工具 &#xff0c;主要功能是基于其特别的算法动态调整各个…

Linux——文件系统inode与软硬链接

目录 一.inode &#xff08;一&#xff09;.背景知识 &#xff08;二&#xff09;.inode 二.软硬链接 &#xff08;一&#xff09;.软链接 &#xff08;二&#xff09;.硬链接 一.inode &#xff08;一&#xff09;.背景知识 我们知道&#xff0c;磁盘是按磁道与扇区划分…

广告行业中那些趣事系列58:当我们面对文本分类任务的时,可以使用哪些优化策略...

导读&#xff1a;本文是“数据拾光者”专栏的第五十七篇文章&#xff0c;这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要总结了一下我在实际项目中对于文本分类任务的优化策略&#xff0c;对于想要提升线上文本分类任务效果的小伙伴可能有所帮助。欢迎转载&a…

专访 | 罗成:开源并非“只可远观”

OpenMLDB: 请先来一段自我介绍吧。 罗成&#xff1a; 我是罗成&#xff0c;来自华中科技大学&#xff0c;目前研二在读&#xff0c;研究方向是云原生数据库的架构研究。 OpenMLDB: 请问是什么样的契机让你接触到了 OpenMLDB 呢&#xff1f; 罗成&#xff1a; 当时课余时间比…

skywalking链路追踪整合spring-cloud

skywalking安装资料 一、安装skywalking 将apache-skywalking-apm-bin.zip上传到/opt目录下2. 解压apache-skywalking-apm-bin.zip unzip apache-skywalking-apm-bin.zip&#xff0c;解压后即可使用&#xff0c;里面的配置文件都提前配置好了 3. 启动skywalking 进入apache-…

HTML做一个传统节日端午节 带设计报告4500字

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

征文连载丨在不修改数据库源码的情况下,如何提高 MogDB 对 Oracle 的兼容性?...

&#xff1a; 2022年8月4日至9月9日&#xff0c;墨天轮社区联合云和恩墨发起了首届「MogDB 主题征文活动」&#xff0c;邀请各位技术从业者学习、使用 MogDB 数据库&#xff0c;分享使用心得与实战案例&#xff0c;一起探索这款融合了众多创新特性的商业版企业级数据库。活动期…

[附源码]Python计算机毕业设计Django校园租赁系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Docker安装Jenkins

docker安装&#xff1a;可参考这里 拉取Jenkins镜像 docker pull jenkins/jenkins创建挂载目录并赋予777权限 mkdir /data/jenkins chmod 777 /data/jenkins运行Jenkins容器并设置名字、端口、目录、时间 50000:50000:前面端口是宿机的端口&#xff0c;&#xff1a;后面端口…

客服如何维护客户?

有网店工作经验的客服&#xff0c;都知道维护老客户的重要性&#xff0c;因为老客户关乎着商品的销量、店铺的升级、客户转化率的多少&#xff0c;因此客服需要通过好的售后服务留住大量的老客户。 前言 有网店工作经验的客服&#xff0c;都知道维护老客户的重要性&#xff0c…

LIBTIFF读取tiff文件时,打印buf出错

如图所示&#xff0c;按照官网提供的例程读取tiff文件&#xff0c;并打印读取的值时&#xff0c;提示&#xff1a; Subscript of pointer to incomplete type void 代码如下&#xff1a; //---打开tiff文件的测试TIFF* tif TIFFOpen("a.tif", "r");if(tif…

使用docker安装RocketMQ

1.创建namesrv服务拉取镜像docker pull rocketmqinc/rocketmq创建namesrv数据存储路径mkdir -p /docker/rocketmq/data/namesrv/logs /docker/rocketmq/data/namesrv/store构建namesrv容器docker run -d \ --restartalways \ --name rmqnamesrv \ -p 9876:9876 \ -v /docker…

如何用vue+免费的webdb 实现一个世界杯足球竞猜系统

一、前言 最近世界杯在如火如荼的进行。我们都知道&#xff0c;中国也派出了我们的一支强大的队伍&#xff1a;中国建筑队&#xff0c;全程参与了世界杯的所有比赛。 哈哈开个玩笑&#xff0c;不过说到世界杯&#xff0c;还真有不少朋友&#xff0c;不仅仅是看球&#xff0c;…