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

面试题----集合

概述 

从上图可以看出,在 Java 中除了以 Map 结尾的类之外, 其他类都实现了 Collection 接⼝。 并且,以 Map 结尾的类都实现了 Map 接⼝

List,Set,Map

  • List (对付顺序的好帮⼿): 存储的元素是有序的、可重复的。
  • Set (注重独⼀⽆⼆的性质): 存储的元素是⽆序的、不可重复的。
  • Map ( Key 来搜索的专家): 使⽤键值对(kye-value)存储,类似于数学上的函数 y=f(x)“x”代表 key"y"代表 valueKey 是⽆序的、不可重复的,value 是⽆序的、可重复的,每个键最多映射到⼀个值。

集合框架底层数据结构总结

List

  • Arraylist Object[] 数组
  • Vector Object[] 数组
  • LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)

Set

  • HashSet (⽆序,唯⼀): 基于 HashMap 实现的,底层采⽤ HashMap 来保存元素
  • LinkedHashSet LinkedHashSet HashSet 的⼦类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现⼀样,不过还是有⼀点点区别的
  • TreeSet (有序,唯⼀): 红⿊树(⾃平衡的排序⼆叉树)

Map

  • HashMap JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主 要为了解决哈希冲突⽽存在的(拉链法解决冲突)。JDK1.8 以后在解决哈希冲突时有了较⼤ 的变化,当链表⻓度⼤于阈值(默认为 8)(将链表转换成红⿊树前会判断,如果当前数组的⻓ 度⼩于 64,那么会选择先进⾏数组扩容,⽽不是转换为红⿊树)时,将链表转化为红⿊树,以 减少搜索时间
  • LinkedHashMap LinkedHashMap 继承⾃ HashMap ,所以它的底层仍然是基于拉链式散 列结构即由数组和链表或红⿊树组成。另外, LinkedHashMap 在上⾯结构的基础上,增加了 ⼀条双向链表,使得上⾯的结构可以保持键值对的插⼊顺序。同时通过对链表进⾏相应的操作, 实现了访问顺序相关逻辑。
  • Hashtable : 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突 ⽽存在的
  • TreeMap : 红⿊树(⾃平衡的排序⼆叉树)

为什么要使⽤集合?

  • 当我们需要保存⼀组类型相同的数据的时候,我们应该是⽤⼀个容器来保存,这个容器就是数组,但是,使⽤数组存储对象具有⼀定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的, 于是,就出现了集合,集合同样也是⽤来存储多个数据的。
  • 数组的缺点是⼀旦声明之后,⻓度就不可变了;同时,声明数组时的数据类型也决定了该数组存储的数据的类型;⽽且,数组存储的数据是有序的、可重复的,特点单⼀。 但是集合提⾼了数据存储的灵活 性,Java 集合不仅可以⽤来存储不同类型不同数量的对象,还可以保存具有映射关系的数据

如何选⽤集合?

  • 主要根据集合的特点来选⽤,⽐如我们需要根据键值获取到元素值时就选⽤ Map 接⼝下的集合,需 要排序时选择 TreeMap ,不需要排序时就选择 HashMap ,需要保证线程安全就选⽤ ConcurrentHashMap
  • 当我们只需要存放元素值时,就选择实现 Collection 接⼝的集合,需要保证元素唯⼀时选择实现 Set 接⼝的集合⽐如 TreeSet HashSet ,不需要就选择实现 List 接⼝的⽐如 ArrayList LinkedList ,然后再根据实现这些接⼝的集合的特点来选⽤。

迭代器 Iterator 是什么?

Iterator 对象称为迭代器(设计模式的⼀种),迭代器可以对集合进⾏遍历,但每⼀个集合内部的数据结构可能是不尽相同的,所以每⼀个集合存和取都很可能是不⼀样的,虽然我们可以⼈为地在每⼀个类中定义 hasNext() next() ⽅法,但这样做会让整个集合体系过于臃肿。于是就有了迭代 器。

迭代器 Iterator 有啥⽤?

Iterator 主要是⽤来遍历集合⽤的,它的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常,触发快速失败机制(fail-fast)。

 有哪些集合是线程不安全的?怎么解决呢?

我们常⽤的 Arraylist , LinkedList , Hashmap , HashSet , TreeSet , TreeMap PriorityQueue 都不是线程安全的。
解决办法很简单,可以使⽤线程安全的集合来代替。
如果你要使⽤线程安全的集合的话, java.util.concurrent 包中提供了很多并发容器供你使⽤:
  • 1. ConcurrentHashMap : 可以看作是线程安全的 HashMap
  • 2. CopyOnWriteArrayList :可以看作是线程安全的 ArrayList ,在读多写少的场合性能⾮常 好,远远好于 Vector .
  • 3. ConcurrentLinkedQueue :⾼效的并发队列,使⽤链表实现。可以看做⼀个线程安全的 LinkedList ,这是⼀个⾮阻塞队列。
  • 4. BlockingQueue : 这是⼀个接⼝,JDK 内部通过链表、数组等⽅式实现了这个接⼝。表示阻塞 队列,⾮常适合⽤于作为数据共享的通道。
  • 5. ConcurrentSkipListMap :跳表的实现。这是⼀个 Map ,使⽤跳表的数据结构进⾏快速查 找。

Arraylist Vector 的区别?

  • ArrayList List 的主要实现类,底层使⽤ Object[ ]存储,适⽤于频繁的查找⼯作,线程不 安全 ;
  • Vector List 的古⽼实现类,底层使⽤ Object[ ]存储,线程安全的。

Arraylist LinkedList 区别?

  • 是否保证线程安全: ArrayList LinkedList 都是不同步的,也就是不保证线程安全;
  • 底层数据结构: Arraylist 底层使⽤的是 Object 数组LinkedList 底层使⽤的是 向链表 数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。注意双向链表和双向循环链表的区别,下⾯有介绍到!)
  • 插⼊和删除是否受元素位置的影响:ArrayList 采⽤数组存储,所以插⼊和删除元素的 时间复杂度受元素位置的影响。 ⽐如:执⾏ add(E e) ⽅法的时候, ArrayList 会默认在 将指定的元素追加到此列表的末尾,这种情况时间复杂度就是 O(1)。但是如果要在指定位置 i 插⼊和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。因为在进 ⾏上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执⾏向后位/向前移⼀位的 操作。LinkedList 采⽤链表存储,所以对于 add(E e) ⽅法的插⼊,删除元素时间复杂 度不受元素位置的影响,近似 O(1),如果是要在指定位置 i 插⼊和删除元素的话( (add(int index, E element) ) 时间复杂度近似为 o(n)) 因为需要先移动到指定位置再插⼊。
  • 是否⽀持快速随机访问: LinkedList 不⽀持⾼效的随机元素访问,⽽ ArrayList ⽀持。 快速随机访问就是通过元素的序号快速获取元素对象(对应于 get(int index) ⽅法)
  • 内存空间占⽤: ArrayList 的空 间浪费主要体现在在 list 列表的结尾会预留⼀定的容量空 间,⽽ LinkedList 的空间花费则体现在它的每⼀个元素都需要消耗⽐ ArrayList 更多的空间 (因为要存放直接后继和直接前驱以及数据)。

双向链表和双向循环链表

双向链表: 包含两个指针,⼀个 prev 指向前⼀个节点,⼀个 next 指向后⼀个节点
双向循环链表:最后⼀个节点的 next 指向 head,⽽ head prev 指向最后⼀个节点,构成⼀个环。

comparable Comparator 的区别

  • comparable 接⼝实际上是出⾃ java.lang 包 它有⼀个 compareTo(Object obj) ⽅法⽤ 来排序
  • comparator 接⼝实际上是出⾃ java.util 包它有⼀个 compare(Object obj1, Object obj2) ⽅法⽤来排序
⼀般我们需要对⼀个集合使⽤⾃定义排序时,我们就要重写 compareTo() ⽅法或 compare() ⽅法,当我们需要对某⼀个集合实现两种排序⽅式,⽐如⼀个 song 对象中的歌名和歌⼿名分别采⽤种排序⽅法的话,我们可以重写 compareTo() ⽅法和使⽤⾃制的 Comparator ⽅法或者以两个Comparator 来实现歌名排序和歌星名排序,第⼆种代表我们只能使⽤两个参数版的Collections.sort() .

⽆序性和不可重复性的含义是什么

  • 什么是⽆序性?⽆序性不等于随机性 ,⽆序性是指存储的数据在底层数组中并⾮按照数组索引的顺序添加 ,⽽是根据数据的哈希值决定的。
  • 什么是不可重复性?不可重复性是指添加的元素按照 equals()判断时 ,返回 false,需要同时重 写 equals()⽅法和 HashCode()⽅法。

⽐较 HashSet、LinkedHashSet 和 TreeSet 三者的异同

  • HashSet Set 接⼝的主要实现类 ,HashSet 的底层是 HashMap,线程不安全的,可以存储 null 值;
  • LinkedHashSet HashSet 的⼦类,能够按照添加的顺序遍历;
  • TreeSet 底层使⽤红⿊树,能够按照添加元素的顺序进⾏遍历,排序的⽅式有⾃然排序和定制排序。

HashMap Hashtable 的区别

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

相关文章:

面试题----集合

概述 从上图可以看出,在Java 中除了以 Map 结尾的类之外, 其他类都实现了 Collection 接⼝。 并且,以 Map 结尾的类都实现了 Map 接⼝List,Set,Map List (对付顺序的好帮⼿): 存储的元素是有序的、可重复的。 Set (注重独⼀⽆⼆…...

XSS注入基础入门篇

XSS注入基础入门篇1.XSS基础概念2. XSS的分类以及示例2.1 反射型XSS2.1.1 示例1:dvwa low 级别的反射型XSS2.1.2 攻击流程2.2 DOM型XSS2.2.1 示例2:DOM型XSS注入1.环境部署2.基础版本3.进阶绕过2.3 存储型XSS2.3.1 示例1:dvwa low示例2.3.2 攻…...

刷题 - 数据结构(二)链表

1. 链表 1.1 题目:合并两个有序链表 链表的建立与插入:关键在于留出头部,创建迭代指针。 ListNode* head new ListNode; // 通过new 创建了一个数据类型为ListNode的数据 并把该数据的地址赋值给ListNodeListNode* p 0; // 再创建一个数据…...

用于隔离PWM的光耦合器选择和使用

光耦合器(或光隔离器)是一种将电路电隔离的器件,不仅在隔离方面非常出色,而且允许您连接到具有不同接地层或在不同电压电平下工作的电路。光耦合器具有“故障安全”功能,因为如果受到高于最大额定值的电压,…...

面试完阿里,字节,腾讯的测试岗,复盘以及面试总结

前段时间由于某些原因辞职了,最近一直在面试。面试这段时间,经历过不同业务类型的公司(电商、酒店出行、金融、新能源、银行),也遇到了很多不同类型的面试官。 参加完三家大厂的面试聊聊我对面试的一些看法&#xff0…...

分享一个外贸客户案例

春节期间一个外贸人收到了客户的回复,但因为自己的处理方式造成了一个又一个问题,我们可以从中学到一些技巧和知识。“上次意大利的客人询价后,一直没回复(中间有打过电话,对方说口语不行,我写过邮件跟进过…...

【Kubernetes】第二篇 - 购买阿里云 ECS 实例

一,前言 上一篇,简单介绍了 CI/CD 的概念以及 ECS 服务规划,搭建整套服务需要三台服务器,配置如下: ECS 配置启动服务说明2核4GJenkins Nexus Dockerci-server2核4GDocker Kubernetesk8s-master1核1GDocker Kube…...

数影周报:据传国内45亿条快递数据泄露,聆心智能完成Pre-A轮融资

本周看点:据传国内45亿条快递数据泄露;消息称微软解雇150 名云服务销售;消息称TikTok计划在欧洲再开两个数据中心;衣服长时间放购物车被淘宝客服嘲讽;聆心智能完成Pre-A轮融资......数据安全那些事据传国内45亿条快递数…...

Leetcode力扣秋招刷题路-0073

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:mat…...

遥感数字图像处理

遥感数字图像处理 来源:慕课北京师范大学朱文泉老师的课程 遥感应用:遥感制图、信息提取 短期内了解知识结构–>有选择的剖析经典算法原理–>系统化知识结构、并尝试实践应用 跳出算法(尤其是数学公式) 关注原理及解决问…...

深度学习常用的python函数(一)

由于我只简单的学过python和pytorch,其中有很多函数的操作都还是一知半解的,其中有些函数经常见到,所以就打算记录下来。 1.zip zip(*a):针对单个可迭代对象压缩成n个元组,元组数量n等于min(a中元素的最小长度) a [(1, 2), (3…...

2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(一)

目录 前言 一、题目理解 背景 解析: 要求 二、建模 1.相关性分析 2.相关特征权重 只希望各位以后遇到建模比赛可以艾特认识一下我,我可以提供免费的思路和部分源码,以后的数模比赛只要我还有时间肯定会第一时间写出免费开源思路&…...

PPS文件如何转换成PPT?附两种方法

在工作中,PPS文件的使用还是很广泛的,因为作为幻灯片放映文件,点击后就能直接播放,十分方便。但如果想要修改PPS里的内容,PPS是无法编辑的,我们需要把文件转换成PPT,再进行修改。 那PPS文件如何…...

ParallelsDesktop安装【亲测可行】

我这边安装的是macos最新系统 (Ventura13.2) 本文参考这篇文章安装,但是你完全按照这篇文章会报错,具体可行操作记录如下 一、下载软件和补丁 1、点这里去下载补丁18.0.1 2、点这里去下载对应版本的ParallelsDesktop18.0.1,安装上到试用这里…...

在 Python 中只接受数字作为用户输入

只接受数字作为用户输入: 使用 while True 循环进行循环,直到用户输入一个数字。使用 float() 类尝试将值转换为浮点数。如果用户输入了一个数字,请使用 break 语句跳出循环。 while True:try:# 👇️ use int() instead of floa…...

【集合】JAVA基础篇(二)

目录一、java常用集合1、Java集合接口的作用2、Java集合常用实现类的作用二、Collection 常用的方法三、List 集合接口1、ArrayList类的常用方法2、LinkList类中的方法3、Vector4、ArrayList 类和 LinkedList 类的区别四、Set 集合1、HashSet 类2、TreeSet 类3、HashSet 和 Tre…...

机房意外掉电导致Elasticsearch的部分index无数据的修复过程

环境 :华为大数据集群FusionInsight V100R002C800SPC200、Elasticsearch 6.1.3、Kibana问题产生原因:因机房意外掉电导致集群部分机器两次掉电导致Elasticsearch重启,Elasticsearch重启后看似正常但某些index无数据。经排查判断为Elasticsearch的部分ind…...

Spring入门案例三:注解进行引用类型的自动装配

本系列文章将会带领大家进行Spring的全面学习,持续关注我,不断更新中… 一.案例分级 简单解析:配置类替代以前的配置文件,实体类提供对象,业务类中有实体类的引用对象,在业务层中实现引用类的自动装配。 二.各层代码…...

kubernet + kubevirt + ceph 汇总文档

目的 1 创建 kubenetes 集群 2 kubenetes 集群上部署 kubevirt 3 kubernetes 支持 ceph 存储 4 VMI 可以存储在 ceph rbd 存储中并正常使用 参考部署文档 名称连接备注centos8 + kubernetes 1.24 master/node 节点部署文档kubernetes 集群部署kubectl top node 使用方法部署文档…...

软件测试项目实战(附全套实战项目教程+视频+源码)

开通博客以来,我更新了很多实战项目,但一部分小伙伴在搭建环境时遇到了问题。 于是,我收集了一波高频问题,汇成本篇,供大家参考,避免重复踩坑。 如果你还遇到过其他坑和未解决的问题,可在评论区…...

Python seek()和tell()函数详解

在讲解 seek() 函数和 tell() 函数之前,首先来了解一下什么是文件指针。我们知道,使用 open() 函数打开文件并读取文件中的内容时,总是会从文件的第一个字符(字节)开始读起。那么,有没有办法可以自定指定读…...

数据库系统:1. 绪论

更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录1.1 数据库系统概述1.1.1 基本概念数据(data)数据库(DataBase, DB)数据库管理系统(DataBase Management System, DBMS)数据库系统…...

Android App开发基础

文章目录一 App的开发特点1.1 App的运行环境1.2 App开发语言1.3 java语言开发1.4 Kotlin语言开发1.5 XML1.6 App连接的数据库二 App的工程结构2.1 App工程目录结构2.2 构建工具Grade2.3 编译配置文件build.gradle2.4 运行配置文件AndroidManifest.xml2.4.1 application2.4.2 ac…...

力扣-分数排名

大家好,我是空空star,本篇带你了解一道简单的力扣sql练习题。 文章目录前言一、题目:178. 分数排名二、解题1.错误示范①提交SQL运行结果2.错误示范②提交SQL运行结果3.正确示范①提交SQL运行结果4.正确示范②提交SQL运行结果5.正确示范③提交…...

图文详解Ansible中的变量及加密

文章目录一、变量命名二、变量级别三、.变量设定和使用方式1.在playbook中直接定义变量2.在文件中定义变量3.使用变量4.设定主机变量和清单变量5.目录设定变量6.用命令覆盖变量7.使用数组设定变量8.注册变量9.事实变量10.魔法变量四、JINJA2模板五、 Ansible的加密控制练习1.用…...

silicon labs平台通过串口升级固件方案

开发环境 windowssimplicity studio 5geck sdk 4.1 一 bootloader 新建BGAPI UART DFU工程 工程新建完成以后看一下linkerfile.ld文件的flash和ram的配置跟自己的application工程是否对应得上 配置串口波特率和引脚 默认使用PB0进入bootloader模式,这里改成Non…...

MySQL 派生表产生关联索引auto_key0导致SQL非常的慢

相同的SQL在maridb运行0.5秒,在MySQL8.0.26中运行要19秒 官方MySQL在处理子查时,优化器有个优化参数derived_merge,MySQL7开启添加,默认on.很多情况可以自动优化派生表,避免创建临时索引auto_key0和生成临时表数据做…...

计算机网络期末复习汇总(附某高校期末真题试卷)

文章目录一、选择题二、填空题三、名词解析四、简答题五、高校期末真题一、选择题 1、传输延迟时间最小的交换方法是( A ) A.电路交换 B.报文交换 C.分组交换 D.信元交换 2、在OSI七层结构模型中,处于数据链路层与运输层之间的是( B) A、物…...

2月,还是不要跳槽

新年已经过去,马上就到金三银四跳槽季了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必…...

科技爱好者周刊之爱好者记录

前言 平时浏览的内容杂七杂八,说好听一些叫做“内容丰富,涉猎甚广”,实际一些则是受到主流大环境的冲击加之自身的控制力尚且不足。 有过类似经历的人大多知道,碎片化的信息除了填充大脑的冗余空间,在短期时间内就会被…...

网站开发的认知/广告媒体资源平台

VIM 是从VI发展出来的一个文本编辑器,在类Unix系统中成为了用户最喜欢的文本编辑器,VIM 是依靠于ASCII的纯文本文件。 在Windows当中我们接触最多的是字处理器,类似于word。 由于Vim在Linux中经常使用,且功能强大,想要…...

专业网站建设集团/软文广告经典案例分析

vue 兼容IE报错解决方案参考文章: (1)vue 兼容IE报错解决方案 (2)https://www.cnblogs.com/CandyManPing/p/10195377.html 备忘一下。...

sea wordpress/手机端怎么刷排名

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的疫情核酸检查预约系统,整个网站项目使用了B/S架构,基于java的springboot框架下开发;;通过后台设置医院信息、录入医院科室信息、录入医生信息、设…...

公司网站设计意见收集/一周热点新闻

转自http://blog.csdn.net/mybelief321/article/details/9066249 我们使用vi或者vim的时候,如果想要显示行号,可能会这样做:切换到命令模式,然后输入set nu,再按回车键就显示了;还有就是咱们在编写程序的时…...

花钱做网站不给源代码/论坛推广软件

一.考虑使用Tcpdump,将抓到的包保存到cap文件中,然后手动分析。参考资料:1. http://www.cnblogs.com/tt-0411/archive/2012/09/23/2699360.html2. http://www.360doc.com/content/11/1117/17/8151417_165252820.shtml3. http://blog.csdn.net…...

最新wordpress知更鸟/站长之家爱站网

前几天有朋友问我,要学习LINUX,网上有很多LINUX操作系统,但是用什么版本的操作系统才好?这个问题我当年学习的时候也遇到过,当时带我的老师教的是red hat5.0专业版,我后来又学习了red hat 6.0,现在最新的是…...