10道集合框架面试题(含解析),来看看你会多少

1.Arraylist 与 LinkedList 异同

(1)是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;

(2)底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;

(3)插入和删除是否受元素位置的影响:

① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。

② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。

(4)是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。

(5)内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

2.HashMap 和 Hashtable 的区别

(1)线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);

(2)效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;

(3)对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。

(4)初始容量大小和每次扩充容量大小的不同 :

①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。

②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。

**(5)底层数据结构: **JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

3.HashMap 的长度为什么是2的幂次方

为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀,每个链表/红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法。

这个算法应该如何设计呢?

我们首先可能会想到采用%取余的操作来实现。但是,重点来了:“取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是2的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是2的幂次方。

4.ConcurrentHashMap 和 Hashtable 的区别

ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。

(1)底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;

(2)实现线程安全的方式(重要):

① 在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。(默认分配16个Segment,比Hashtable效率提高16倍。) 到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6以后 对 synchronized锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在JDK1.8中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;

② Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。

5.ArrayList 与 Vector 区别

(1)ArrayList和Vector在很多时候都很类似

  • 两者都是基于索引的,内部由一个数组支持。
  • 两者维护插入的顺序,我们可以根据插入顺序来获取元素。
  • ArrayList和Vector的迭代器实现都是fail-fast的。
  • ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。

(2)以下是ArrayList和Vector的不同点

  • Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList
  • ArrayList比Vector快,它因为有同步,不会过载
  • ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表

6.集合框架中的泛型有什么优点?

Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。

7.Iterator是什么?Enumeration和Iterator接口的区别?

Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。

Enumeration的速度是Iterator的两倍,也使用更少的内存。Enumeration是非常基础的,也满足了基础的需要。但是,与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。

也就是说,iterator更加线程安全(但是iterator本身是没有同步操作的,也就是说,当线程不安全的时候,迭代器只是能够抛出异常,并不能保证同步,需要手动加同步手段,例如锁), 因为它可以确保,在当前遍历的集合元素被更改的时候,它会抛出
ConcurrentModificationException。

迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到。为了使它的功能更加清晰,迭代器方法名已经经过改善。

8.Iterater和ListIterator之间有什么区别?

  • 我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List
  • Iterator只可以向前遍历,而LIstIterator可以双向遍历
  • ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置

9.迭代器fail-fast属性是什么?fail-fast与fail-safe有什么区别?

每次我们尝试获取下一个元素的时候,Iterator fail-fast属性检查当前集合结构里的任何改动。如果发现任何改动,它抛出
ConcurrentModificationException。Collection中所有Iterator的实现都是按fail-fast来设计的(ConcurrentHashMap和CopyOnWriteArrayList这类并发集合类除外)。

Iterator的fail-fast属性与当前的集合共同起作用,因此它不会受到集合中任何改动的影响。Java.util包中的所有集合类都被设计为fail-fast的,而java.util.concurrent中的集合类都为fail-safe的。Fail-fast迭代器抛出
ConcurrentModificationException,而fail-safe迭代器从不抛出ConcurrentModificationException。

在迭代一个集合的时候,我们可以使用并发集合类来避免
ConcurrentModificationException,比如使用CopyOnWriteArrayList,而不是ArrayList。

Iterator接口没有具体的实现,Iterator接口定义了遍历集合的方法,但它的实现则是集合实现类的责任。每个能够返回用于遍历的Iterator的集合类都有它自己的Iterator实现内部类。这就允许集合类去选择迭代器是fail-fast还是fail-safe的。比如,ArrayList迭代器是fail-fast的,而CopyOnWriteArrayList迭代器是fail-safe的。

10.选用作为key的的对象应该注意什么?跟hashCode()和equals()方法有什么关系?

HashMap使用Key对象的hashCode()和equals()方法去决定key-value对的索引。当我们试着从HashMap中获取值的时候,这些方法也会被用到。如果这些方法没有被正确地实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把它们存储到不同的地方。同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。equals()和hashCode()的实现应该遵循以下规则:

  • 如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()总是为true的。
  • 如果o1.hashCode() == o2.hashCode(),并不意味着o1.equals(o2)会为true。

我们可以使用任何类作为Map的key,然而在使用它们之前,需要考虑以下几点:

  • 如果类重写了equals()方法,它也应该重写hashCode()方法。
  • 类的所有实例需要遵循与equals()和hashCode()相关的规则。
  • 如果一个类没有使用equals(),你不应该在hashCode()中使用它。
  • 用户自定义key类的最佳实践是使之为不可变的,这样,hashCode()值可以被缓存起来,拥有更好的性能。不可变的类也可以确保hashCode()和equals()在未来不会改变,这样就会解决与可变相关的问题了。那就是为何String和Integer被作为HashMap的key大量使用。

**想要备战秋招,光靠这10道集合框架面试题(含解析)是远远不够的,因此,小编还特意准备了66个Java面试知识点,都已整理成Word文档了
<66个Java面试知识点>

还有更多的面试学习视频、文档资料,Java架构学习资料以及学习笔记和学习思维导图分享给大家,希望能够为正在准备面试、学习的朋友提供一些帮助!

<面试学习视频/架构学习资料>

<学习思维导图>

<面试文档资料>

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

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

相关文章

Java集合面试题(总结最全面的面试题)

集合容器概述 什么是集合 集合就是一个放数据的容器&#xff0c;准确的说是放数据对象引用的容器 集合类存放的都是对象的引用&#xff0c;而不是对象的本身 集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)。 集合的特点 集合的特点…

Python编程练习与解答 练习65:温度换算表

编写一个程序&#xff0c;显示摄氏温度和华氏温度转换表。该表的行包括0-100摄氏度之间所有的温度&#xff0c;这些温度时10摄氏度的倍数&#xff0c;列上适当的标题&#xff0c;摄氏度和华氏度之间的换算公式可在互联网上找到。 # 转换公式为&#xff1a;f(&#xff08;c*9)/…

java语言【 #93. 温度换算】(已通过)

题目描述 ​ 读入一个实数表示的摄氏温度 C&#xff0c;将它转换为华氏温度 F 并输出。​ 公式如下&#xff1a; F1.8∗C32 输入 ​ 一个实数表示 C&#xff08;0.0≤C≤100.0&#xff09; 输出 ​ 将 C 转换成 F 的结果。 ​ 结果保留两位小数 样例输入 66.66样例输出 151…

热敏电阻-温度换算算法(分段线性拟合法)

概要 在工业上&#xff0c;会有各种读取环境温度&#xff0c;或读取目标物体温度的需求&#xff0c;通常用到的方案有&#xff1a;传感器测温&#xff1b;热敏电阻测温等。本篇着重讲解使用热敏电阻测温的方法。 热敏电阻 何为热敏电阻&#xff1f;热敏电阻即为热电偶传感器…

摄氏温度和华氏温度换算(vb源码)

【实例简介】初步涉及VB 【实例截图】 文件&#xff1a;590m.com/f/25127180-493490306-f0ccf8&#xff08;访问密码&#xff1a;551685&#xff09; 以下内容无关&#xff1a; -------------------------------------------分割线----------------------------------------…

DS18b20温度值换算

DS18B20 处理正负温度值。 寄存器格式 例子 //计算温度值 //参数 高字节&#xff0c;低字节 double CaculateTemp(uint8_t tmh, uint8_t tml) {uint8_t th;uint8_t tl;double temp 0;tl tml & 0x0F;//取低字节后四位th (tmh << 4) (tml >> 4);//取高字节后…

用Python制作温度换算模块

&#xff08;注&#xff1a;这里通用摄氏度&#xff0c;Python版本为3.8.5&#xff09; 今天教大家做一个温度换算模块&#xff0c;非常简单实用。 这张图是最终效果&#xff1a; &#xff08;CK指将摄氏度转换为开氏度&#xff0c;CRe指将摄氏度转换为列氏度&#xff09; …

c语言——统计分类

我们将一个班的成绩进行分类&#xff0c; 成绩60分以下的为c、成绩61-89分的为b&#xff0c;90分以上的为A //统计分类 /*我们将一个班的成绩进行分类&#xff0c; 成绩60分以下的为c、成绩61-89分的为b&#xff0c;90分以上的为A */ #include<stdio.h> int main() …

如何将Excel中的一列内容合并到一起显示?

最近在工作过程中遇到要将excel中一列内容合并到一个格里显示&#xff0c;经过查询可以通过如下实现&#xff0c;记录下来方便使用。 步骤&#xff1a; 打开excel&#xff0c;复制要整合的内容到excel的一列&#xff0c;在下面一个格里执行下面语句&#xff1a; CONCATENATE(TR…

Excel表格合并两列数据且保留全部内容

Excel表格如何能将两列数据合并成一列&#xff0c;保留两列的内容&#xff0c;且插入你需要的分隔符&#xff0c;看这里&#xff01; 方法超级简单&#xff0c;我还找了半个小时&#xff08;泪目&#xff09; 第一步&#xff1a;新建一个空白列 在需要合并列的位置上新建一个…

如何把Excel两列内容合并成一列内容

今天跟大家分享一下如何把俩列内容合并成一列内容 1.如下图表格中含有两列数据&#xff0c;现在我们先要将这两列数据合并到一个单元格中。 2.第一步我们选中全部单元格区域 3.然后我们点击下图选项&#xff08;Excel工具箱&#xff0c;百度即可了解详细下载安装信息&#xff0…

excel表格内容合并的技巧?

今天跟大家分享一下excel表格内容合并的技巧&#xff1f; 1.打开演示文件&#xff0c;如下图要求将多个表格合并到一起。 2.首先我们点击下图选项 3.点击【汇总拆分】-【合并多表】 4.勾选要合并的工作表 5.然后根据表格设置表头行数 6.最后我们点击【确定】即可完成 7.完成效果…

如何将Excel表格中的多列内容合并到一列

目录 方法一&#xff1a;对于数据量不大的情况&#xff0c;可以考虑如下方法&#xff1a; 方法二&#xff1a;当数据量过大或存在多张需要填充的表格时 方法一&#xff1a;对于数据量不大的情况&#xff0c;可以考虑如下方法&#xff1a; 步骤一&#xff1a;在第一列的最下方…

Excel快速合并,简单方法,轻松搞定!

想要高效完成工作&#xff0c;就必须掌握一些实用的工作技巧&#xff0c;来帮助我们更好更快的完成任务。 分享6个使用效率高达95%的Excel实用技巧&#xff0c;工作中经常被用到&#xff01; 1.多行数据合并&#xff1a; 制作表格时&#xff0c;如果我们需要将多行数据合并为…

Excel数据合并

1、字段合并 字段合并是指将某几个字段合并成一个新的字段。 我们可以使用CONCATENATE&#xff0c;&&#xff0c;DATE函数进行字段合并。 1.1、CONCATENATE CONCATENATE函数能够把它的所有参数连接起来。 我们选中D2单元格&#xff0c;点击插入函数&#xff0c;查找到CO…

新版火狐右键关闭标签

最好用firefox57版本&#xff0c;打开ini有多个功能&#xff0c;

火狐浏览器中设置打开新地址时,不会覆盖原页面的方法

近期使用火狐浏览器发现打开新标签页时总是会覆盖原页面&#xff0c;百度了好多方法都是在选项中-设置标签页&#xff0c; 然而&#xff0c;在我用的浏览器版本里均无此项可设置&#xff0c;一直百度总算找到一种办法&#xff0c;亲试绝对有效&#xff01; 1、本人用的是火狐浏…

火狐浏览器(69版)修改起始页,主页和新标签页

火狐浏览器的优点 火狐浏览器&#xff08;我使用的是68版&#xff09;的资源占用比chrome浏览器&#xff08;如谷歌&#xff0c;微软最新的Edge&#xff09;要小很多而且集成了两者的优点&#xff1a; 可以使用火狐账号登录 &#xff0c;这样各种信息都可以选择保留&#xff…

让新手不再彷徨:Firefox7(火狐7)浏览器完美配置简明教程

好像我还没有写过类似的文章。这次依然是百忙之中抽空写篇文章。 我一直是IE浏览器的忠实用户&#xff0c;但是最近由于开发ASP.NET程序&#xff0c;不得不使用火狐浏览器。早就耳闻火狐浏览器非常强大&#xff0c;尤其是强大的扩展功能&#xff0c;但是我一直没有考虑过&#…

火狐浏览器没有右键菜单_通过Firefox中的右键菜单防止烦人的网站引起混乱

火狐浏览器没有右键菜单 If you’ve spent any amount of time online, you’ve already run into a website that uses javascript to disable the right-click menu on the page… which can be really, really irritating for those of us that like to use the “back” fe…