面试题知识点全纪录---容器

2023-05-16

注意:该博客仅是本人对掌握知识的测试,具体内容请移步guide哥网站!!!

https://snailclimb.gitee.io/javaguide
链接


**

JAVA集合框架

**
集合概述
https://www.javatpoint.com/collections-in-java

1.List,Set,Map三者区别?

-List: 存储的元素是有序的、可重复的。

-Set: 存储的元素无序且独一无二。

-Map:使用(key-value)存储,key是无序的、不可重复的,value是无序的,可重复的,每个键值对最多映射一个值。

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

  1. List
    Arraylist:Object[] 数组
    Vector:Object[] 数组
    LinkedList:双向链表

  2. Set
    HashSet:基于HashMap实现。
    LinkedHashSet:LinkedHashMap
    TreeSet:红黑树

  3. Map
    HashMap:JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。

    LinkedHashMap:继承HashMap,底层是基于拉链式散列结构即由数组和链表或红黑树组成。增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。

    Hashtable:数组+链表组成,数组是Hashtable的主体,链表则是主要为了解决哈希冲突而存在的。

    TreeMap:红黑树(自平衡的排序二叉树)


3.Collection子接口List

ArrayList和Vector的区别?
ArrayList是List的主要实现类,底层使用Object[]存储,适用于频繁的查找工作,线程不安全。
Vector是Lsit的古老实现类,底层使用Object[]存储,线程安全。

ArrayList和LinkedList区别?

1.都不保证线程安全
2.ArrayList底层object[]数组;LinkedList底层双向链表。
3.内存空间占用: ArrayList 的空 间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间
双向链表与双向循环链表
在这里插入图片描述
在这里插入图片描述
ensureCapacity方法
最好在 add 大量元素之前用 ensureCapacity 方法,以减少增量重新分配的次数

public class EnsureCapacityTest {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<Object>();
        final int N = 10000000;
        list = new ArrayList<Object>();
        long startTime1 = System.currentTimeMillis();
        list.ensureCapacity(N);
        for (int i = 0; i < N; i++) {
            list.add(i);
        }
        long endTime1 = System.currentTimeMillis();
        System.out.println("使用ensureCapacity方法后:"+(endTime1 - startTime1));
    }
}

4.Collection 子接口之 Set

1.comparable 和 Comparator 的区别?
comparable接口实际上出自java.lang包,它有compareTo(Object obj)方法用来排序。
comparator接口出自java.util包,他有compare(Object obj1,Object obj2)方法用来排序。

2.无序性和不可重复性的含义是什么?
无序性不等于随机性,指存储的数据在底层数组并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。
不可重复性指添加的元素按照equals()判断时,返回false,需要同时重写equals()和 hashcode()方法。

3.HashSet,LinkedHashSet,TreeSet异同?
HashSet为Set接口的主要实现类,底层是HashMap,线程不安全,可存null值。
LinkedHashSet是HashSet子类,能够按照添加顺序遍历。
TreeSet底层红黑树,能按照添加顺序遍历,排序方式分为自然排序、定制排序。


5.Map接口


  1. HashMap 和 HashSet 区别?

在这里插入图片描述
2. HashMap 和 TreeMap 区别?

TreeMap 和HashMap 都继承自AbstractMap ,但是需要注意的是TreeMap它还实现了NavigableMap接口和SortedMap 接口。
实现 NavigableMap 接口让 TreeMap 有了对集合内元素的搜索的能力。

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

3.HashSet 如何检查重复?

当你把对象加入HashSet时,HashSet 会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让加入操作成功。

hashCode()与 equals() 的相关规定

如果两个对象相等,则 hashcode 一定也是相同的
两个对象相等,对两个 equals() 方法返回 true
两个对象有相同的 hashcode 值,它们也不一定是相等的
综上,equals() 方法被覆盖过,则 hashCode() 方法也必须被覆盖
hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。

==与 equals 的区别

对于基本类型来说,== 比较的是值是否相等;

对于引用类型来说,== 比较的是两个引用是否指向同一个对象地址(两者在内存中存放的地址(堆内存地址)是否指向同一个地方);

对于引用类型(包括包装类型)来说,equals 如果没有被重写,对比它们的地址是否相等;如果 equals()方法被重写(例如 String),则比较的是地址里的内容。

4.HashMap 的底层实现?

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

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

所谓 “拉链法” 就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
在这里插入图片描述
相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。
在这里插入图片描述

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

5.ConcurrentHashMap 和 Hashtable 的区别?

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

实现线程安全的方式(重要): ① 在 JDK1.7 的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。 到了 JDK1.8 的时候已经摒弃了 Segment 的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。(JDK1.6 以后 对 synchronized 锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在 JDK1.8 中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本;② Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。

HashTable:

在这里插入图片描述
JDK1.7 的 ConcurrentHashMap:
在这里插入图片描述
JDK1.8 的 ConcurrentHashMap:
在这里插入图片描述
JDK1.8 的 ConcurrentHashMap 不在是 Segment 数组 + HashEntry 数组 + 链表,而是 Node 数组 + 链表 / 红黑树。不过,Node 只能用于链表的情况,红黑树的情况需要使用 TreeNode。当冲突链表达到一定长度时,链表会转换成红黑树。

6.Collections 工具类

同步控制:

Collections 提供了多个synchronizedXxx()方法·,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问集合时的线程安全问题。

我们知道 HashSet,TreeSet,ArrayList,LinkedList,HashMap,TreeMap 都是线程不安全的。Collections 提供了多个静态方法可以把他们包装成线程同步的集合。

需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试题知识点全纪录---容器 的相关文章

随机推荐

  • 使用c++对阿里云OSS SDK进行封装,实现查询文件夹、上传文件、下载文件到内存和本地路径下等功能,并附赠进度条

    最近工作中遇到需要将文件上传到阿里云的oss服务器上 xff0c 所以根据阿里云的说明文档 xff0c 封装了一个类 xff0c 希望对大家有所帮助 xff0c 如发现问题 xff0c 欢迎批评指正 主要功能 xff1a 1 设置连接池数
  • CAN2.0B 数据帧详解

    CAN的帧类型分为数据帧 遥控帧 错误帧 过载帧以及帧间空隙 xff0c 本文将对数据帧的帧结构展开说明 xff1a 引言 xff1a CAN2 0协议分为A版本和B版本 xff0c A版本协议为11位标识符 xff08 标准帧 xff09
  • window下c/c++异步发送udp和非阻塞的方式接收udp的类封装

    以下代码对udp发送和接收都做了封装 xff0c 在发送和接收前都需要去注册使用的功能 xff0c 从而做到需要哪个模块才启动哪个模块的功能 xff0c 避免资源的浪费 udp发送功能 使用列表和信号量的方式实现异步发送数据 xff0c 避
  • c/c++使用libhdfs对HDFS(Hadoop分布式文件系统)进行读写操作

    最近需要对HDFS进行读写操作 xff0c 参考hdfs h头文件里面的注解 xff0c 编写了一个例子 详细的说明在代码的注释中 如发现问题欢迎批评指正 span class token macro property span class
  • 使用c/c++将十六进制的stl字符串转换成IEEE - 754 浮点数

    span class token keyword typedef span span class token keyword union span span class token punctuation span span class t
  • 使用 C++ 处理 JSON 数据交换格式

    使用 C 43 43 处理 JSON 数据交换格式 一 摘要 JSON 的全称为 xff1a JavaScript Object Notation xff0c 顾名思义 xff0c JSON 是用于标记 Javascript 对象的 xff
  • C++ -- 智能指针( C++11与boost库的智能指针及其使用)

    1 智能指针的引入 1 在动态内存管理中 xff0c 如果new上一块空间 xff0c 但是没有delete xff0c 就会产生内存泄露的问题 2 但是有时候 xff0c 我们new了 xff0c 也delete了 xff0c 但是还会出
  • 动态库与静态库区别

    首先 xff0c 两者最重要的区别在于该库是否被编译进目标程序当中 静态库 xff1a 该库在编译的时候会直接整合到目标程序当中 xff0c 也就是说 xff0c 每个程序的静态库都是独立的 这样使得文件比较大 而且因为是编译的的时候整合进
  • 解决ubuntu20.04虚拟机无法上网的问题

    64 linux虚拟机无法正常上网 前言 刚建立好的linux虚拟机使用NAT方式可以连接外网 xff0c 系统重启几次 xff0c 系统无法上网 xff0c 这是什么问题导致的呢 xff1f 提示 xff1a 以下是本篇文章正文内容 xf
  • Arduino系列教程之 – PWM的秘密

    转载地址 xff1a http www diy robots com p 61 814 感谢作者的翻译 PWM是啥玩意儿 xff1f PWM是 怕玩命 的缩写 xff0c 英文写法是 Pulse width modulation xff0c
  • YOLOv2代码分析_读取labels[by zhangzexuan]

    YOLOv2代码分析 读取labels by zhangzexuan YOLOv2代码分析 读取labelsby zhangzexuan YOLOv2的输入代码阅读 嗯 现在参与的项目要求在人脸检测步骤直接连同人脸特征点一起预测出来 xff
  • 【企业微信】获取token & 发送应用消息

    企业微信获取token 存入redis 设置时长2小时 amp amp 发送企业应用消息接口 1 常量类 span class token keyword package span span class token namespace co
  • 学习笔记--HTTP-字段总结(一)-与传输实体相关的报文字段总结

    目录 一 概述 二 介绍一些常用字段 三 传输实体的一些属性 1 传输的数据类型 2 实体的语言类型和编码 3 编码类型 四 文件类型和压缩编码字段 1 Accept 2 Content Type 3 Accept Encoding 4 C
  • C/C++ 去掉宏定义__FILE__路径

    一 问题 在日志模块中往往带着文件信息 xff0c 有的源文件是加载其他路径下的源文件 xff0c 但是不想让别人看到文件路径信息 xff0c 只显示源文件的名字和行数即可 如下图所示 xff0c 有烦人的相对路径 二 解决方案 自定义一个
  • C语言提高(一)

    C语言提高 CS和BS的区别函数封装和数组形参退化为指针数据类型本质变量的本质内存分区模型全局区以文字常量区为例分析全局区 栈区堆区 函数的调用模型函数调用变量传递分析静态局部变量的使用栈地址的生长方向堆地址的生长方向内存的存放方向 以数组
  • ROS Gazebo(三):启动gazebo/URDF

    打开Gazebo的方式主要有两种 xff1a rosrun 和 roslaunch 1 启动ROS节点 启动ROS节点 bring up 机器人的标准工具是roslaunch 打开一个空的Gazebo世界命令如下 xff1a roslaun
  • Windows与Ubuntu之间通过网线传输文件

    一 windows与Ubuntu之间网线直连搭建局域网 把网线连好后 xff0c 在两个系统中做以下设置 Windows下的配置 右键右下角的网络图标 xff08 或者右键网络 属性 xff09 更改适配器设置 以太网 右键属性 TCP I
  • Jetson TX2——CAN口的使用

    Jetson TX2 之CAN口的使用 TX2上有2个CAN控制器 xff0c CAN控制器需要通过CAN收发器连接到物理总线上 具体参阅原理图和相关技术参考手册 下载地址 xff1a https developer nvidia com
  • Jetson TX2——串口的使用(TTL-RS485)

    Jetson TX2之串口的使用 xff08 TTL RS485 xff09 TX2串口设备 TX2 有5个 UARTs 到主连接器 其中UART3 用于 WLAN BT 有关 UARTs 的典型任务 请参见下表 查看可用串口设备 xff1
  • 面试题知识点全纪录---容器

    注意 xff1a 该博客仅是本人对掌握知识的测试 xff0c 具体内容请移步guide哥网站 xff01 xff01 xff01 https snailclimb gitee io javaguide 链接 JAVA集合框架 https w