java基础技术集合面试【笔记】

Hashmap:

基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变

另外,HashMap是非线程安全的,也就是说在多线程的环境下,可能会存在问题,而Hashtable是线程安全的

HashMap 内部的数据结构?

各个版本的实现略有不同

JDK1.7 及以前的 HashMap 采用数组 + 链表的结构来存储数据

JDK8 中的 HashMap 采用了数组 + 链表或树的结构来存储数据

HashMap 的存储数据的过程?

​不同的 JDK 版本版本的存储过程略有差异,在 JDK1.8 中,HashMap 存储数据的过程可以分为以下几步:

1.对 key 的 hashCode () 进行 hash 后计算数组获得下标 index

2.如果当前数组为 null,进行容量的初始化,初始容量为 16

3.如果 hash 计算后没有碰撞,直接放到对应数组下标里

4.如果 hash 计算后发生碰撞且节点已存在,则替换掉原来的对象

5.如果 hash 计算后发生碰撞且节点已经是树结构,则挂载到树上

6.如果 hash 计算后发生碰撞且节点是链表结构,则添加到链表尾,并判断链表是否需要转换成树结构(默认大于 8 的情况会转换成树结构)

7.完成 put 后,是否需要 resize () 操作(数据量超过 threshold,threshold 为初始容量和负载因子之积,默认为 12)

而在 Java 1.7 的版本中,5和6是合在一起的,即如果发生哈希碰撞且节点是链表结构,则放在链表头

简单来说,jdk1.7是头插法,jdk1.8是尾插法

PS:HashMap 中的两类存储数据的方法:put () 和 putAll (),二者底层都是调用的同一个 putVal () 方法

如果 hashCode 相同,如何获取对象呢?

​hashCode 相同,说明这些对象的数据都在同一个数组下标对应的链表或者树上,get 方法的签名是 V get (Object key) ,入参只有一个 key,因此通过遍链表或者树,取出每一个节点对比 hash 值是否相等且 key 是否相等 (= 或者 equals)

HashMap 和 HashTable 有什么区别?

这是一个比较重要的基础问题

HashMap 是 JDK1.2 才出现的,而HashTable 是 JDK1.0 就出现了

JDK 里面也说了 HashMap 可以大致相当于 HashTable

至于具体的差异:

1.HashMap 是线程不安全的,而 HashTable 由于所有方法都加了 synchronized 关键字所以是线程安全的

2.HashMap 的键需要重新计算对象的 hash 值,而 HashTable 直接使用对象的 hashCode

3.HashMap 的值和键都可以为 null,HashTable 的值和键都不能为 null

4.HashMap 的数组的默认初始化大小为 16,HashTable 为 11,HashMap 扩容时会扩大两倍,HashTable 扩大两倍 + 1

ArrayList 和 LinkedList 的异同?

相同点:ArrayList 和 LinkedList 都是 List 接口的实现类,因此都具有 List 的特点:存取有序,可重复,而且两者都不是线程安全的

不同点:内部数据结构不一样,ArrayList 基于数组实现,LinkedList 基于双向链表实现

ArrayList 和 LinkedList 的异同的派生问题:ArrayList 和 LinkedList 分别适用于什么场景呢?

​我们应该清楚,不同的内部数据结构,其比较合适的应用场景也是不同的

ArrayList 基于数组存储数据,因此查询元素时可以直接按照数据下标进行索引,而插入元素时,通常涉及到数据元素的复制和移动,所以查询数据快而插入数据慢,所以ArrayList 适合查询多(读多)的场景

LinkedList 基于双向链表存储数据,因此查询元素时需要前向或后向遍历,而插入数据时只需要修改本元素的前后项即可,所以查询数据慢而插入数据快,所以,LinkedList 适合插入多(写多)的场景

List、Set以及Map三者之间的区别是什么?

List 是有序集合,可以有重复元素

Set 集合不能包括重复元素,实现类中 LinkedHashSet 按照插入顺序排序,SortedSet 可排序,HashSet 无序

Map 存放键值对 (key-value pairs) 映射,映射关系可以是一对一或多对一,key 无序且唯一,value 可重复。实现类中 LinkedHashMap 按照插入顺序排序,SortedMap 可排序,HashMap 无序

派生问题:原理?

首先,List 与 Set 具有相似性,都继承共同的 Collection 接口,也都是单列元素的集合。List 的内部是数组,所以不断在数组后面追加元素即可,这是它为什么有序的原因

而 Set 里面不允许有重复的元素,这里的重复是指两个相等 (注意不是相同) 的对象 ,即 equals () 返回 true。如果 Set 集合 s 中有 A 元素,现在再向 s 集合插入 B 元素,此时 B 元素如果与 A 元素相等,则 B 元素存储不进去(add 方法返回 false)

​其次,Map 与 List 和 Set 不同,它是双列的集合,值得注意的是并不继承 Collection

List、Set以及Map三者的共同之处?

1.add、remove、contanins、size 等方法的耗时性能,是不会随着数据量的增加而增加的,这个主要跟 HashMap 底层的数组数据结构有关,不管数据量多大,不考虑 hash 冲突的情况下,时间复杂度都是 O (1)

2.线程不安全的,如果需要安全请自行加锁,或者使用 Collections.synchronizedSet

3.迭代过程中,如果数据结构被改变,会快速失败的,会抛出 ConcurrentModificationException 异常

ArrayList 和 LinkedList 都不是线程安全的,那有线程安全的 List 类吗?

有,线程安全 List 类有 Vector 和 CopyOnWriteList

Vector 是通过在其几乎所有方法前加 synchronized 关键字来保证线程安全性

CopyOnWriteList 则是通过数组复制的方法来保证线程安全的。

Java 集合的快速失败(fail-fast)和安全失败(fail-safe)的差别是什么?

快速失败和安全失败都是 java 集合的一种错误机制

单线程情况下,遍历集合时去执行增删等改变集合结构的操作

多线程情况下,一个线程遍历集合,另一个线程执行增删等改变集合结构的操作

快速失败,是指失败以及异常时会立即报错,通常会抛出 ConcurrentModificationException 异常,像 java.util 包下面的集合类就是使用这种机制

安全失败,是指失败以及异常时会直接忽略,java.util.concurrent 包下面的集合类都是使用这种机制。

快速失败的原因在于,每当迭代器在进行增删等操作时,会使用 hashNext ()以及next () 进行元素遍历,而元素遍历之前都会检测 modCount 变量是否为 expectedmodCount 的值,是的话就返回遍历,否则抛出异常 ConcurrentModificationException,终止遍历

安全失败的处理方式则有两种:一是CopyOnWriteArrayList 以及CopyOnWriteArraySet 这类集合,底层增删时会复制数组,如果增删操作前遍历数组,则会遍历复制前的老视图,二者并不冲突,二是 ConcurrentHashMap 这些并发集合,这些集合不存在 expectedmodCount,这样Iterator 也不会做相应的检查

HashMap 和 ConcurrentHashMap 的区别?

1.基础特性不同:

HashMap 的 key 和 value 可以为 null

ConcurrentHashMap 的 key 和 value 不能为 null

2.内部数据结构不同:

ConcurrentHashMap 在 JDK1.7 中采用的数据结构是分段的数组 + 链表,JDK1.8 的内部数据结构采用的数据结构是数组 + 链表 / 红黑二叉树(同 HashMap 一致)

HashMap 在 JDK1.7 中采用的数据结构是数组 + 链表,在 JDK1.8 中采用的数据结构是数组 + 链表 / 红黑二叉树

3.线程安全不同:

HashMap 是非线程安全的

ConcurrentHashMap 是线程安全的

Java集合框架是什么?说出一些集合框架的优点?

每种编程语言中都有集合,集合框架的部分优点如下:

(1)使用核心集合类降低开发成本,而非实现我们自己的集合类

(2)随着使用经过严格测试的集合框架类,代码质量会得到提高

(3)通过使用JDK附带的集合类,可以降低代码维护成本

(4)复用性和可操作性

java基础技术集合面试【笔记】的更多相关文章

  1. Java基础技术JVM面试【笔记】

    Java基础技术JVM面试[笔记] JVM JVM 对 java 类的使用总体上可以分为两部分:一是把静态的 class 文件加载到 JVM 内存,二是在 JVM 内存中进行 Java 类的生命周期管 ...

  2. Java基础技术基础面试【笔记】

    Java基础技术基础面试[笔记] String.StringBuilder以及StringBuffer三者之间的区别? 三者的区别可以从可变性,线程安全性,性能这三个部分进行说明 可变性 从可变性来说 ...

  3. Java基础技术多线程与并发面试【笔记】

    Java基础技术多线程与并发 什么是线程死锁? ​死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...

  4. Java基础技术-Java其他主题【面试】

    Java基础技术-Java其他主题[面试] Java基础技术IO与队列 Java BIO.NIO.AIO Java 中 BIO.NIO.AIO 的区别是什么? 含义不同: BIO(Blocking I ...

  5. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

  6. Java高级开发工程师面试笔记

    最近在复习面试相关的知识点,然后做笔记,后期(大概在2018.02.01)会分享给大家,尽自己最大的努力做到最好,还希望到时候大家能给予建议和补充 ----------------2018.03.05 ...

  7. java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  8. 第6节:Java基础 - 三大集合(上)

    第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...

  9. Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)

    Java基础之 集合体系结构详细笔记(Collection.List.ArrayList.LinkedList.Vector) 集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就 ...

随机推荐

  1. 暑假自学java第六天

    1,方法的覆盖:当子类继承父类,而子类中的方法与父类中方法的名称,返回类型及参数都完全一致时,就称子类中的方法覆盖了父类中的方法,有时也称方法的"重写" [不需要关键字] 2,th ...

  2. 其他:IDEA插件无法安装——网络代理设置

    1.网络代理设置 IDEA配置代理,是在File-> Setting-> plugins中设置 查看自己主机的IP地址 文章转载至:https://www.jianshu.com/p/62 ...

  3. [小技巧] Windows7 半角全角快捷键 修改方法

    From : http://blog.sina.com.cn/s/blog_87ab67b10100x3ww.html 转载说明:在浏览器下我们可以使用空格下翻一页,Shift + 空格上翻一页. 但 ...

  4. 配置Mac 终端高亮

    mac下所有vim的配色方案的样式. 下面讲解如何设置这些好看的配色 首先:在终端输入 vim ~/.bash_profile 查看是否有上面提到的某些配色,所有配色均是以.vim结束的,果有的话,再 ...

  5. 【Azure 环境】Azure通知中心(Notification Hub)使用百度推送平台解说

    问题描述 在通知中心的页面中显示支持BaiDu,介绍一下支持的是百度(Baidu)的什么吗?Azure的这个功能在国内使用的时候是否可以保证国内安卓手机的信息送达率? 问题解答 通知中心的页面中的Ba ...

  6. 关于Hadoop调优

    Hadoop生产调优 一.HDFS-核心参数 1.NameNode 内存生产配置 1) NameNode 内存计算 每个文件块大概占用 150byte,一台服务器 128G 内存为例,能存储多少文件块 ...

  7. springMVC-3-获取参数

    RequestMapping修饰类 源码: 根据源码可以知道,requestmapping既可以修饰方法也可以修饰类 @Target({ElementType.METHOD, ElementType. ...

  8. MySQL 8.x 新版本特性赶紧学!!Linux 服务器上安装 MySQL 8.x

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 引言 ...

  9. 【LeetCode】145. 二叉树的后序遍历

    145. 二叉树的后序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给定一个二叉树的根节点 root ,返回它的 后序 遍历. 示例 输入: [1,null,2,3] 1 \ 2 / 3 输 ...

  10. Tomcat修改最大连接数及查看最大连接数

    一.背景 公司进行安全整改, 技术要求:会话限制:应能够对应用系统的最大并发会话连接数进行限制: 提供凭证:提供对系统最大并发会话连接数进行限制的截图,需要将所有被检查系统中间件配置截图,如果不限制最 ...