JAVA面试题分享--集合

常见的数据结构(了解)

常用的数据结构有:数组,栈,队列,链表,树,散列,堆,图等

数组是最常用的数据结构,数组的特点是长度固定,数组的大小固定后就无法扩容了 , 数组只能存储一种类型的数据 ,添加,删除的操作慢,因为要移动其他的元素。

栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操 作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据 在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另 一端进行删除操作的特殊线性表,它按照先进先出的原则存储数据,先进入的数据,在读取 数据时先被读取出来。

链表是一种物理存储单元上非连续、非顺序的存储结构,其物理结构不能只表示数 据元素的逻辑顺序,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系 列的结节(链表中的每一个元素称为结点)组成,结点可以在运行时动态生成。根据指针的 指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。

树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述 现实生活中的很多事物,例如家谱、单位的组织架构等等。有二叉树、平衡树、红黑树、B 树、B+树。

散列表,也叫哈希表,是根据关键码和值 (key 和 value) 直接进行访问的数据结构, 通过 key 和 value 来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。

堆是计算机学科中一类特殊的数据结构的统称,堆通常可以被看作是一棵完全二叉 树的数组对象。

图的定义:图是由一组顶点和一组能够将两个顶点相连的边组成的

集合和数组的区别(了解)

区别:数组长度固定 集合长度可变 数组中存储的是同一种数据类型的元素,可以存储基本数据类型,也可以存储引用 数据类型; 集合存储的都是对象,而且对象的数据类型可以不一致。在开发当中一般当对象较多的时候, 使用集合来存储对象。

List 和 Map、Set 的区别(必会)

List 和 Set 是存储单列数据的集合,Map 是存储键值对这样的双列数据的集合; List 中存储的数据是有顺序的,并且值允许重复; Map 中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;

Set 中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素 的 hashcode 决定,即位置是固定的(Set 集合是根据 hashcode 来进行数据存储的,所以 位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无 序的)。

List 和 Map、Set 的实现类(必会)

(1)Connection 接口: List 有序,可重复 ArrayList 优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程不安全,效率高 。

Vector 优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程安全,效率低, 已给舍弃了 LinkedList 优点: 底层数据结构是链表,查询慢,增删快。 缺点: 线程不安全,效率高 Set 无序,唯一

HashSet 底层数据结构是哈希表。(无序,唯一) 如何来保证元素唯一性? 依赖两个方法:hashCode()和 equals()13

LinkedHashSet 底层数据结构是链表和哈希表。(FIFO 插入有序,唯一) 1.由链表保证元素有序 2.由哈希表保证元素唯一

TreeSet 底层数据结构是红黑树。(唯一,有序) 1. 如何保证元素排序的呢? 自然排序 比较器排序 

.如何保证元素唯一性的呢? 根据比较的返回值是否是 0 来决定

(2)Map 接口有四个实现类: HashMap 基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null 键, 线程 不安全。

HashTable 线程安全,低效,不支持 null 值和 null 键;

LinkedHashMap 线程不安全,是 HashMap 的一个子类,保存了记录的插入顺序;

TreeMap 能够把它保存的记录根据键排序,默认是键值的升序排序,线程不安全。

Hashmap 的底层原理(高薪常问)

HashMap 在 JDK1.8 之前的实现方式 数组+链表, 但是在 JDK1.8 后对 HashMap 进行了底层优化,改为了由 数组+链表或者数值+红黑树 实现,主要的目的是提高查找效率

1. Jdk8 数组+链表或者数组+红黑树实现,当链表中的元素超过了 8 个以后, 会 将链表转换为红黑树,当红黑树节点 小于 等于 6 时又会退化为链表。

2. 当 new HashMap():底层没有创建数组,首次调用 put()方法示时,底层创建长度 为 16 的数组,jdk8 底层的数组是:Node[],而非 Entry[],用数组容量大小乘以加载因子得 到一个值,一旦数组中存储的元素个数超过该值就会调用 rehash 方法将数组容量增加到原 来的两倍,专业术语叫做扩容,在做扩容的时候会生成一个新的数组,原来的所有数据需要 重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能. 默认的负载因子大小为 0.75,数组大小为 16。也就是说,默认情况下,那么当 HashMap 中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍。

3. 在我们 Java 中任何对象都有 hashcode,hash 算法就是通过 hashcode 与自己进 行向右位移 16 的异或运算。这样做是为了计算出来的 hash 值足够随机,足够分散,还有 产生的数组下标足够随机。

map.put(k,v)实现原理

(1)首先将 k,v 封装到 Node 对象当中(节点)。

(2)先调用 k 的 hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。

(3)下标位置上如果没有任何元素,就把 Node 添加到这个位置上。如果说下标对应的位 置上有链表。此时,就会拿着 k 和链表上每个节点的 k 进行 equal。如果所有的 equals 方 法返回都是 false,那么这个新的节点将被添加到链表的末尾。如其中有一个 equals 返回了 true,那么这个节点的 value 将会被覆盖。

map.get(k)实现原理

(1)、先调用 k 的 hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。

(2)、在通过数组下标快速定位到某个位置上。重点理解如果这个位置上什么都没有,则返 回 null。如果这个位置上有单向链表,那么它就会拿着参数 K 和单向链表上的每一个节点 的 K 进行 equals,如果所有 equals 方法都返回 false,则 get 方法返回 null。如果其中一15 个节点的 K 和参数 K 进行 equals 返回 true,那么此时该节点的 value 就是我们要找的 value 了,get 方法最终返回这个要找的 value。

4. Hash 冲突 不同的对象算出来的数组下标是相同的这样就会产生 hash 冲突,当单线链表达到一定长度 后效率会非常低。

5. 在链表长度大于 8 的时候,将链表就会变成红黑树,提高查询的效率。

写在最后:这次分享的五个面试题是JAVA面试中,非常容易被提问的部分。希望大家能够引起重视。笔者小厂,中厂,大厂均有过面试经历,每日分享全栈知识,JAVA面试题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一、交换网络基础

目录 1.交换机的转发行为 2.数据帧的类型 3.ARP地址解析步骤 Hub:物理层设备 交换机:数据链路层设备 1.交换机的转发行为 泛洪(Flooding)(有可能是单播帧(未知单播帧),也有可能是…

10GMAC层设计系列-(1)10G Ethernet PCS/PMA

一、引言 对于10G以太网MAC层的实现,Xilinx提供了 3种IP核,分别是 10G Ethernet MAC、10G Ethernet PCS/PMA、10G Ethernet Subsystem。 10G Ethernet MAC只包含MAC层,外部需要提供一个PHY芯片进行数据对齐,10G Ethernet MAC与P…

Python 深度学习(二)

原文:zh.annas-archive.org/md5/98cfb0b9095f1cf64732abfaa40d7b3a 译者:飞龙 协议:CC BY-NC-SA 4.0 第五章:图像识别 视觉可以说是人类最重要的感官之一。我们依赖视觉来识别食物,逃离危险,认出朋友和家人…

Kompas.ai的可持续内容生态:绿色营销的新选择

在全球环境保护意识日益增强的今天,绿色营销已成为企业树立品牌形象、展示社会责任的重要手段。绿色营销不仅关注产品的环保特性,还包括企业的整体可持续发展战略和对环境的积极贡献。本文将讨论企业如何通过绿色营销树立品牌形象,介绍Kompas…

el-cascader 数据回显 checkbox没有被勾选

需求: 需要支持多选以及能搜索,并且 点击所有队伍最新版本这个功能按钮时,要将用户勾选的数据保存的前提下,将满足条件的数据也一并勾选。最后保存的数据 只需要子级的id,组成数组就行了,所以我这里有用到…

ITMS-90426: Invalid Swift Support

原文 Please correct the following issues and upload a new binary to App Store Connect. ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it. 解决方式 ITMS-…

U盘提示“未初始化”?别慌,数据还有救!

当你满心期待地将U盘插入电脑,准备传输或读取重要文件时,突然弹出一个提示框:“U盘没有初始化”。遇到这样的情况,相信很多人都会感到焦虑和迷茫。别急,这篇文章将为你详细解析U盘未初始化的原因,并提供有效…

【设计模式】简单工厂模式(Simple Factory Pattern)

工厂模式(Factory Pattern) 用于创建不同类型的奖品对象。您可以创建一个奖品工厂,根据配置的类型来实例化相应的奖品对象。 public interface Prize {void award(); }public class MoneyPrize implements Prize {Overridepublic void awar…

一、初识Django

简介 Django 是一个用于构建 Web 应用程序的高级 Python Web 框架。 版本对应 不同版本的django框架是基于特定的不同的python版本开发的,所以不同版本的django框架要正常执行功能只能安装特定的python版本 Django安装 安装 Django # 全局安装 pip install dj…

实战干货|Spark 在袋鼠云数栈的深度探索与实践

Spark 是一个快速、通用、可扩展的大数据计算引擎,具有高性能、易用、容错、可以与 Hadoop 生态无缝集成、社区活跃度高等优点。在实际使用中,具有广泛的应用场景: 数据清洗和预处理:在大数据分析场景下,数据通常需要…

C/C++ 入门(9)编译链接

个人主页:仍有未知等待探索-CSDN博客 专题分栏:C 目录 一、域 1、分类 2、搜索顺序 二、编译链接 1、代码在形成可执行文件的过程 2、符号表 三、问题 1、带有缺省参数的函数声明和定义分离 一、域 1、分类 域:全局域、局部域、命…

CSS-IN-JS Emotion

为什么会有css-in-js 优点 缺点 使用emotion插件库 npm i emotion/core emotion/styled使用时需要解析css属性 使用方式一: 通过注释告诉babel不讲jsx转化为react.create Element的调用,而是转化为jsx语法。会导致一个警告react未使用。 使用方式二&am…

对虾病害分类数据集889张7类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):889 分类类别数:7 类别名称:["baibanbing","bai…

Vitis HLS 学习笔记--Schedule Viewer 调度查看器

目录 1. 简介 2. Schedule Viewer详解 2.1 视图说明 2.1.1 Operation\Control Step 2.1.2 周期关系图 2.1.3 Schedule Viewer 菜单栏 2.1.4 属性视图 2.2 内容说明 2.2.1 实参(b)解释 2.2.2 实参(a)解释 2.2.3 变量&am…

TCP协议在物联网中的实战

一、TCP协议介绍 网上对TCP协议介绍众多,本人按照自己的理解简单介绍一下。 TCP(Transmission Control Protocol, 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输控制层通信协议。 1.1 协议机制 1.1.1 三次握手 &…

MongoDB安装(windows)

mongodb 的安装(windows) 下载软件 官网下载:https://www.mongodb.com/ 安装 1.双击打开MSI包 2.同意协议 3.选择安装形式 complete:默认安装,不可以修改安装地址 custom:自定义安装【推荐】 4.选择安装路径和…

【c++leetcode】35. Search Insert Position

问题入口 二分搜索 时间复杂度O(logn) class Solution { public:int searchInsert(vector<int>& nums, int target) {int start 0;int end nums.size() - 1;while (start < end){int mid (start end) / 2;if (nums[mid] target){return mid;}else if(nums…

Axure如何调起浏览器的打印功能

Axure如何调起浏览器的打印功能 答&#xff1a;javascript:window.print(); 不明白的继续往下看 应用场景&#xff1a; 原型设计中&#xff0c;页面上的打印按钮&#xff0c;需要模拟操作演示&#xff0c;需要点击指定的按钮时&#xff0c;唤起浏览器的打印功能&#xff08…

QT httpServer多线程后台服务器的例子实现

1.需求 1.1 用户需要其他平台&#xff08;web端&#xff09;调用Qt平台的接口&#xff0c;获取想要的数据并实时显示在网页里&#xff0c;比如实时的温湿度&#xff0c;用户数据等 1.2 用户需要在其他平台&#xff08;web端&#xff09;调用Qt平台的接口&#xff0c;下发数据…

使用 GitHub Actions 实现项目的持续集成(CI)

目录 什么是 GitHub Actions 基础概念 Workflow 文件 Workflow 语法 实例&#xff1a;编译 OpenWrt 什么是 GitHub Actions GitHub Actions 是 GitHub 推出的持续集成&#xff08;Continuous Integration&#xff0c;简称 CI&#xff09;服务它允许你创建自定义工作流&am…