Java集合面试

news/2024/11/30 8:53:10/

文章目录

      • Java集合框架
        • 说说有哪些常见的集合?
        • ArrayList和LinkedList的区别?
        • List和Set的区别?
        • HashMap的数据结构?把你了解的所有都讲一讲?
          • 数据结构:
        • put流程
        • Hashmap的resize方法的执行过程?
        • get流程
        • JDK8 HashMap为什么引入红黑树?解决了什么问题?
        • HashMap什么情况下会触发扩容呢?
        • HashMap与ConcurrentHashMap的区别是什么?
        • HashMap和HashTable的区别?
        • HashMap和HashTable的区别?
        • HashCode和equals方法?

Java集合框架

说说有哪些常见的集合?

集合相关类和接口都在Java.util中,主要分为3种:List(列表)、Map(映射)、Set(集)。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=D%3A%5C%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8B%E8%BD%BD%5CJava%E9%9B%86%E5%90%88%E5%85%B3%E7%B3%BB.png&pos_id=img-gLKtJrFP-16939104609

ArrayList和LinkedList的区别?

ArrayList基于动态数组实现,所以它的查找效率高,增删效率慢

LinkedList基于双向循环链表实现,它的查找效率低,增删效率快

List和Set的区别?

List:有序,按对象进入的顺序保存对象,可重复,允许多个null元素对象,可以使用迭代器去除所有元素,再逐一遍历,也可使用get(int index)获取指定下标的元素。
set:无序,不可重复,最多允许有一个null元素对象,取元素时只能通过iterator迭代器接口取得所有元素,再逐一遍历各个元素。

HashMap的数据结构?把你了解的所有都讲一讲?

数据结构:

1.7 数组+链表 1.8 采用数组+链表+红黑树

数组用来确定元素的位置;链表用来解决哈希冲突;红黑树提高查询效率

红黑树:

​ 根节点必须是黑色

​ 所有结点非黑即红

​ 红结点两个子结点一定是黑色

​ 任意结点到叶子结点,包含的黑色结点数目相同

put流程

​ 1.首先hash算法计算出哈希值

​ 2.判断数组是否需要扩容,是就执行resize方法扩容

​ 3.然后根据哈希值去数组寻找下标

​ 4.判断下标对应位置是否为空

​ 是的话就直接插入

​ 否的话就判断key是否相同

​ 相同的话直接覆盖

​ 不相同转到5

​ 5.判断是否为树节点(判断是否为红黑树)

​ 是的话在树中插入键值对

​ 否的话进行下一步

​ 6.遍历链表,判断key是否存在,

​ 存在的话就覆盖

​ 不存在的话插入链表尾部

​ 插入之后判断链表长度是否>8

​ 大于转为红黑树

​ 不大于就结束

​ 7.判断容量是否达到扩容阈值

​ 是就执行resize方法扩容

​ 否就结束

Hashmap的resize方法的执行过程?

两种情况会调用resize方法

1.第一次调用Hashma的put方法时,会调用resize方法对table数组进行初始化,如果不传入指定值,默认为16.

2.扩容时会调用resize方法,即size大于数组阈值threshold时,数组大小翻倍。

get流程

​ 1.根据哈希值到数组对应下标寻找元素

​ 判断是否是要查找的元素

​ 是就返回

​ 2.判断是否为树节点

​ 是就遍历红黑树查找

​ 3.判断是否为链表

​ 是就遍历链表查找

JDK8 HashMap为什么引入红黑树?解决了什么问题?

引入红黑树我认为是这样,当产生hash冲突时会形成链表,当数据多了冲突多了,链表会越来越长,造成链化,此时查询特别耗时间,本来时间复杂度为O(1)结构可能达到O(n),引入红黑树可以优化查询。

HashMap什么情况下会触发扩容呢?

当它未初始化,第一个put时会触发扩容。后面插入值,当大于扩容阈值时

HashMap与ConcurrentHashMap的区别是什么?

HashMap不是线程安全的,而ConcurrentHashMap是线程安全的.

ConcurrentHashMap采用锁分段技术,整个ConcurrentHashMap由一个个Segment组成,Segment通过继承ReentrantLock来进行加锁,所以每次需要加锁的操作锁住的是一个segment,这样只要保证每个Segment是线程安全的,也就实现了全局的线程安全。

HashMap和HashTable的区别?

HashMap线程不安全(效率高), 也可以使用Collections.synchronizedMap(hashMap)使其实现同步,Hashtable线程安全(效率比较低)

HashMap和HashTable的区别?

HashMap线程不安全(效率高), 也可以使用Collections.synchronizedMap(hashMap)使其实现同步,Hashtable线程安全(效率比较低)

HashMap的key和value都允许为null,而Hashtable的key和value都不允许为null,Hashtable遇到null,直接返回NullPointerException

HashCode和equals方法?

如果两个对象相等,则hashCode一定也是相同的
两个对象的hashcode值相同,它们不一定是相等的
equals方法被重写,则hashCode方法也必须被重写


http://www.ppmy.cn/news/1102159.html

相关文章

STM32WB55开发(3)----断开蓝牙连接

STM32WB55开发----3.断开蓝牙连接 概述硬件准备视频教学样品申请选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_App_NotificationACI_HAL_GET_LINK_STATUShci_disco…

设计模式-组合模式(Composite)

文章目录 前言一、组合模式的概念二、组合模式的优缺点1.优点2.缺点 三、组合模式的实现总结 前言 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树状结构以表示“整体-部分”的层次结构。组合模式使得客户端可以统…

发送HTTP请求

HTTP请求是一种客户端向服务器发送请求的协议。它是基于TCP/IP协议的应用层协议,用于在Web浏览器和Web服务器之间传输数据。 HTTP请求由以下几个部分组成: 请求行:包含请求方法、请求的URL和HTTP协议的版本。常见的请求方法有GET、POST、PUT、…

Golang开发--channel的使用

在 Go 语言中,channel(通道)是一种用于在 goroutine 之间进行通信和同步的并发原语。它提供了一种安全且简单的方式来传递数据。 通道的详细描述和使用方法 1.定义通道: 通道是通过使用 make 函数来创建的。通道有特定的类型&am…

CSDN每日一练 |『非负整数求和』『Ctrl+X,Ctrl+V』『小艺改编字符串』『数制转换』2023-09-10

CSDN每日一练 |『非负整数求和』『Ctrl+X,Ctrl+V』『小艺改编字符串』『数制转换』2023-09-10 一、题目名称:非负整数求和二、题目名称:Ctrl+X,Ctrl+V三、题目名称:小艺改编字符串四、题目名称:数制转换一、题目名称:非负整数求和 时间限制:1000ms内存限制:256M 题目描…

Go和Java实现抽象工厂模式

Go和Java实现抽象工厂模式 本文通过简单数据库操作案例来说明抽象工厂模式的使用,使用Go语言和Java语言实现。 1、抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创 建型模式,它…

多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测

多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测 目录 多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预…

【三维】NeRF神经辐射场构建三维模型

论文地址:paper 代码地址:code 视频地址:油管 目录 0.🌈🌈摘要 1.🌈🌈nerf主要原理 2.🌈🌈网络结构 2.1📌渲染 2.2📌消融实验 3.&#x…